SpringJava配置:组件扫描后的bean配置
我有以下配置:SpringJava配置:组件扫描后的bean配置,spring,spring-java-config,Spring,Spring Java Config,我有以下配置: @Configuration @ComponentScan("com.xyz.svc") public class SvcConfig { @Autowired private Filter filter1; @Autowired private Filter filter2; @Autowired private Filter filter3; @Bean public List<Filter> filters() {
@Configuration
@ComponentScan("com.xyz.svc")
public class SvcConfig {
@Autowired private Filter filter1;
@Autowired private Filter filter2;
@Autowired private Filter filter3;
@Bean
public List<Filter> filters() {
// Filters are added in the desired order of execution
return ImmutableList.of(
filter1,
filter2,
filter3);
}
}
@配置
@组件扫描(“com.xyz.svc”)
公共类SvcConfig{
@自动接线专用过滤器1;
@自动接线专用过滤器2;
@自动接线专用过滤器3;
@豆子
公共列表筛选器(){
//过滤器按所需的执行顺序添加
返回ImmutableList.of(
过滤器1,
过滤器2,
过滤器3);
}
}
运行leadFilters()
方法时,它所依赖的所有组件(即filter1
,filter2
,filter3
)均为空。基本上,这些组件是通过@ComponentScan
注册的。问题是leadFilters()
方法在@ComponentScan
之前执行
我怎样才能让它工作呢?基本上,你不能,可靠地。
@Configuration
类是一个@组件
,用于通过@bean
注释方法注册bean定义。如果对bean的请求(通过@bean
方法处理)在处理@Autowired
的BeanPostProcessor
之前出现,那么您将看到所描述的行为
请注意,以下内容会给您带来问题,因为Spring不知道要注入哪个
@Autowired
private Filter filter1;
@Autowired
private Filter filter2;
@Autowired
private Filter filter3;
假设这只是一个示例,您可以进行重构,这样就不用为这些过滤器拥有@Component
类,而是为它们声明@Bean
方法
@Bean
public Filter filter1() {
return new FilterImpl1();
}
@Bean
public Filter filter2() {
return new FilterImpl2();
}
@Bean
public Filter filter3() {
return new FilterImpl3();
}
然后,您可以在另一个@Bean
方法中使用这些Bean
@Bean
public List<Filter> filters() {
// Filters are added in the desired order of execution
return ImmutableList.of(
filter1(),
filter2(),
filter3());
}
@Bean
公共列表筛选器(){
//过滤器按所需的执行顺序添加
返回ImmutableList.of(
过滤器1(),
过滤器2(),
过滤器3());
}
Spring应该正确计算依赖关系树。您是否通过@AnnotationDrivenConfig
或
启用了注释驱动的注入?没有这样的注释(@AnnotationDrivenConfig)@Sotirios的回答很有帮助(并强调了即使可以注入三个依赖项,您也会遇到的自动布线问题)。但是您必须问问自己,为什么在上下文生命周期的早期就需要@Bean
。不应该这样。如果您发布异常的堆栈跟踪,这可能是一个线索?