使用 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()));
}
}
我可以使用任一参数注入创建两个 ComplexBean
s,这很优雅,但如果有一些其他 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 配置旨在
- 创建 bean
- 通过实施
CacheConfigurer
,覆盖 CacheManager
和 KeyGenerator
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;
在下面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
s,这很优雅,但如果有一些其他 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 配置旨在
- 创建 bean
- 通过实施
CacheConfigurer
,覆盖CacheManager
和KeyGenerator
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;