使用构造函数注入在其他bean中连接条件bean

时间:2016-06-30 12:57:19

标签: java spring dependency-injection

请在标记副本之前完成完整的问题。可以在评论中讨论更多内容

我有以下代码,其中ServiceA依赖于ServiceB。并且serviceB实现bean将被有条件地初始化

class ServiceA{
   ServiceB serviceB;
   ServiceA(ServiceB serviceB){
      this.serviceB = serviceB;
   }
}


@Configuration
class AppConfig{
   @Conditional("some_condition_based_on_property")
   @Bean
   ServiceB serviceB1(){
     return new ServiceBImpl1();
   }

   @Conditional("some_condition_based_on_property")
   @Bean
   ServiceB serviceB2(){
     return new ServiceBImpl2();
   }

   @Bean
   ServiceA serviceA(){
     //what should go here so that conditional bean is injected in ServiceA
   }

}

我无法自动检测ServiceA bean,因为我需要使用某个键将其注入Map中。 我看到的一个选项是删除构造注入,并在serviceA中使用serviceB bean @autowired,这对我来说是最后一个选项。还有其他选择吗?

编辑:我不想在注射过程中使用if-else,因为bean可以在不同的地方定义。我将只使用@Conditional

1 个答案:

答案 0 :(得分:1)

没有什么能阻止您在配置类中自动生成ServiceB生成权限并重新使用它来创建ServiceA

@Configuration
class AppConfig{
   @Conditional(/* some condition */)
   @Bean
   ServiceB serviceB1(){
     return new ServiceBImpl1();
   }

   @Conditional(/* some condition */)
   @Bean
   ServiceB serviceB2(){
     return new ServiceBImpl2();
   }

   // store a local reference    
   @Autowired
   private dynamicServiceB;

   @Bean
   ServiceA serviceA(){
     return new ServiceA(dynamicServiceB);
   }
}

但是,感觉您正在尝试解决其他一些您没有描述的问题,特别是考虑到您包含语法错误的代码:@Conditional不接受字符串为值。你不应该期望那些使用一些破碎代码的人能够获得可接受的解决方案会产生很大的成功。

这感觉就像是@Profile的情景。