代码之家  ›  专栏  ›  技术社区  ›  zrvan

使用Spring Java Config引用具有依赖项的bean

  •  3
  • zrvan  · 技术社区  · 11 年前

    在以下Spring Java Config中:

    @Configuration
    @EnableAutoConfiguration
    @ComponentScan("my.package")
    public class Config {
        @Bean
        public BasicBean basicBean1() {
            return new BasicBean("1");
        }
    
        @Bean
        public BasicBean basicBean2() {
            return new BasicBean("2");
        }
    
        @Bean
        public ComplexBean complexBeanByParameters(List<BasicBean> basicBeans) {
            return new ComplexBean(basicBeans);
        }
    
        @Bean
        public ComplexBean complexBeanByReferences() {
            return new ComplexBean(Arrays.asList(basicBean1(), basicBean2()));
        }
    }
    

    我可以创建两个 ComplexBean s使用任意一个参数注入,这很优雅,但如果有几个其他bean BasicBean 类型,只需要几个(参数当然可以是类型 碱性大豆 并列举出我感兴趣的bean的名称,但这可能是一个很长的列表,至少是为了参数)。如果我想直接引用bean,我可以使用 complexBeanByReferences 样式,这在订购或其他考虑时可能很有用。

    但说我想使用 complexBeanByReference 引用bean的样式 complexBeanByParameters ,这是一条直线:

    @Bean
    public ComplexBeanRegistry complexBeanRegistry() {
        return new ComplexBeanRegistry(
            Arrays.asList(
                complexBeanByParameters(), // but this will not work!
                complexBeanByReferences()
            )
        );
    }
    

    我如何参考 complexBeanByParameters ,而无需指定依赖项列表 complexBeanRegistry ? 老实说,后者应该完全忘记这一点。

    可以选择只使用

    public ComplexBeanRegistry complexBeanRegistry(List<ComplexBeans> complexBeans) {...}
    

    当然,但在某些情况下,这可能不是一个选项,特别是在使用 CacheConfigurer 从…起 spring-context 。在这种情况下,Java Config旨在

    1. 创建bean
    2. 通过实施 缓存配置器 ,替代 CacheManager KeyGenerator 豆。

    实施的要求 缓存配置器 意味着我不能更改签名以使用参数注入。

    所以问题是,有没有参考方法 complexBeanByParameters 使用“直接”参考样式?

    1 回复  |  直到 11 年前
        1
  •  1
  •   sven.kwiotek    11 年前

    也许你可以用限定符分隔来引用它:

        @Bean
        @Qualifier("complexBeanParam")
        public ComplexBean complexBeanByParameters(List<BasicBean> basicBeans) {
            return new ComplexBean(basicBeans);
        }
    
        @Bean
        @Qualifier("complexBeanRef")
        public ComplexBean complexBeanByReferences() {
            return new ComplexBean(Arrays.asList(basicBean1(), basicBean2()));
        }
    

    例如autowire:

        @Autowired
        @Qualifier("complexBeanParam")
        private ComplexBean beanParam;