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

时间:2015-02-10 15:46:49

标签: java spring spring-java-config

在下面的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,这是优雅的,但如果有一些BasicBean类型的其他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. 通过实施CacheConfigurer,覆盖CacheManagerKeyGenerator bean的默认实例。
  3. 实现CacheConfigurer的要求意味着我无法更改签名以使用参数注入。

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

1 个答案:

答案 0 :(得分:1)

也许你可以通过限定符分离引用它:

    @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;