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
。不应该这样。如果您发布异常的堆栈跟踪,这可能是一个线索?