在下面的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旨在
CacheConfigurer
,覆盖CacheManager
和KeyGenerator
bean的默认实例。实现CacheConfigurer
的要求意味着我无法更改签名以使用参数注入。
所以问题是,有没有办法使用“直接”参考样式来引用complexBeanByParameters
?
答案 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;