java - 如何使用 '@Qualifier'动态指定参数?

标签 java spring

我想使用@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/

相关文章:

java - 正则表达式捕获组无法捕获多个组

java - hibernate 不会创建 hbm2ddl.auto 设置为 "update"的中间表

java - 如何使用 Java 的 Comparable 来比较树中的通用对象?

java - 传递给持久化的分离实体 : com. carpooling.entity.Role;嵌套异常是 org.hibernate

java - 替换在 contextConfigLocation 参数中配置的 xml 中的占位符时出现问题

java - 将文件插入 postgres

java - 如何使用 Spring 的 Java Configuration 指定 Filter 执行顺序?

java - 捕获 Spring 中 PropertyEditors 抛出的 IllegalArgumentException

java - 文件系统如何实现扇区锁定?

Java 内存模型和并发