我想使用@Qualifier动态指定参数?怎么办?
@Qualifier("two") 'two' 作为参数,可以是 'one' ' Three' 或其他。
我可以使用aop动态设计“两个”吗?
表示我想通过参数更改带有@Qualifier的服务名称。
来自 url“Token”的参数。
案例:网址:http://localhost:8080/insert/order ,token有一个参数:companyId = one
@RestController
public class ApiWebService {
@Autowired
@Qualifier("two")
//@Qualifier("one")
private BaseService baseService;
@GetMapping("insert/order")
public void test() {
baseService.insertOrder();
}
}
@Service("one")
public class CompanyOneService extends BaseService {
@Override
public void insertOrder() {
System.out.println("conpanyOne");
System.out.println("baseInsertOrder");
}
}
@Service("two")
public class CompanyTwoService extends BaseService {
@Override
public void insertOrder(){
System.out.println("companyTwo");
System.out.println("baseInsertOrder");
}
}
three
four
...
@Service
public class BaseService {
public void insertOrder(){
System.out.println("baseInsertOrder");
}
}
最佳答案
你好!
不,你不能,主要是因为Java注释中的属性不允许用变量赋值。
实际上,您想根据某些运行时条件(即您的情况下的companyId)选择要使用的实现。您可以使用带有 @Configuration
和 @Bean
的工厂模式来实现它,这比丑陋的 AOP 解决方案更优雅、更容易理解:
首先定义一个工厂:
@Configuration
public class ServiceFactory{
@Bean
public BaseService companyOneService(){
return new CompanyOneService();
}
@Bean
public BaseService companyTwoService(){
return new CompanyTwoService();
}
public BaseService getService(Integer companyId){
if(companyId == 1){
return companyOneService();
}else if(company==2){
return companyTwoService();
}else{
//blablablab
}
}
}
在 Controller 中注入(inject)ServiceFactory
,根据公司Id获取相关Service
@RestController
public class ApiWebService {
@Autowired
private ServiceFactory serviceFactory;
@GetMapping("insert/order")
public void test() {
Integer companyId = getCompanyIdFromToken(httpServletRequest);
BaseService service = serviceFactory.getService(companyId);
service.blablabla();
}
}
关于java - 如何使用 '@Qualifier'动态指定参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54193516/