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

Referencing a bean with dependencies using Spring Java Config

在下面Spring Java配置:

@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()));
    }
}

我可以使用任一参数注入创建两个 ComplexBeans,这很优雅,但如果有一些其他 BasicBean 类型的 beans 并且只需要一些(参数可以当然是 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) {...}

当然可以,但在某些情况下这可能不是一个选项,特别是在使用 spring-context 中的 CacheConfigurer 时。在这种情况下,Java 配置旨在

  1. 创建 bean
  2. 通过实施 CacheConfigurer,覆盖 CacheManagerKeyGenerator bean 的默认实例。

实现CacheConfigurer的要求意味着我无法更改签名以使用参数注入。

所以问题是,有没有办法使用 "direct" 引用样式来引用 complexBeanByParameters

也许您可以通过限定符分隔来引用它:

    @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()));
    }

例如自动装配:

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