在我的程序中,我有3个bean,它们都实现了相同的接口,并根据部署应用程序的环境变量应用一些配置。Bean A始终可用,并且仅当存在@ConditionalOnProperty时才构建Bean B和C。在某些地方我需要注入B,在其他地方需要注入C,如果不存在,则使用A作为后备:
A
@ConditionalOnProperty
B
C
@Autowired public MyService(SomeCommonInterface somebean)
我该如何实现这一点?
ni65a41a1#
你可以做的一件事就是根据你拥有的属性动态地创建你想要的bean,这将允许你添加你自己的逻辑来创建合适的bean。
@SpringBootTest(classes = BeansOrder.BeansOrderConfig.class, properties = { "my_custom_property_C: true" }) public class BeansOrder { @Configuration static class BeansOrderConfig { @Autowired private Environment env; @Bean public SomeCommonInterface bean() { if (env.containsProperty("my_custom_property_B")) { return new ImplB(); } if (env.containsProperty("my_custom_property_C")) { return new ImplC(); } return new ImplA(); } } @Autowired SomeCommonInterface bean; @Test void tst() { System.out.println(bean.getClass().getSimpleName()); } }
如果它变大了,您可以将它提取到一个单独的类中,这个类将根据一些参数返回适当的实现,基本上就是factory设计模式。
factory
1条答案
按热度按时间ni65a41a1#
你可以做的一件事就是根据你拥有的属性动态地创建你想要的bean,这将允许你添加你自己的逻辑来创建合适的bean。
如果它变大了,您可以将它提取到一个单独的类中,这个类将根据一些参数返回适当的实现,基本上就是
factory
设计模式。