有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

在以下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()));
    }
}

我可以使用任何一种参数注入创建两个ComplexBean,这很优雅,但是如果a有一些其他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) {...}

当然,但在某些情况下,这可能不是一个选项,特别是在使用来自spring-contextCacheConfigurer时。在本例中,Java配置旨在

  1. 创建bean
  2. 通过实现CacheConfigurer,重写CacheManagerKeyGeneratorbean的默认实例

实现CacheConfigurer的要求意味着我不能将签名更改为使用参数注入

所以问题是,有没有一种方法可以使用“直接”引用样式引用complexBeanByParameters


共 (1) 个答案

  1. # 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;