java 为多个候选项选择bean注入顺序

nzk0hqpo  于 2023-04-19  发布在  Java
关注(0)|答案(1)|浏览(106)

在我的程序中,我有3个bean,它们都实现了相同的接口,并根据部署应用程序的环境变量应用一些配置。
Bean A始终可用,并且仅当存在@ConditionalOnProperty时才构建Bean BC
在某些地方我需要注入B,在其他地方需要注入C,如果不存在,则使用A作为后备:

@Autowired
public MyService(SomeCommonInterface somebean)

我该如何实现这一点?

ni65a41a

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设计模式。

相关问题