Spring - 来自@Configuration 的@Autowired bean 为空

Spring - @Autowired bean from @Configuration is null

我在配置 class 中定义了一个 bean。我想在一个组件中自动装配这个 bean。但是,属性 保持为空。例如:

Appconfiguration.java

@Configuration
public class AppConfiguration {

    @Bean
    public SomeType someObject() {
        return new SomeType();
    }
}

AppComponent.java

@Component
public class AppComponent {

    @Autowired
    private SomeType someObject;  // TODO why null?

    public AppComponent() {  // note: passing a SomeType constructor argument works
        System.out.println(someObject);
    }
}

如何自动装配配置中定义的 bean class?

您是否遗漏了在创建 bean 后注入属性的基本细节?您是否尝试过在 bean 完全初始化后访问您的 属性?

更新: 我稍微修改了您的示例以向您展示不同之处:

@Test
public void initializationTest() {
    try (AnnotationConfigApplicationContext context =
                 new AnnotationConfigApplicationContext()) {
        context.register(AppConfiguration.class, AppComponent.class);
        context.refresh();
    }
}

@Configuration
public class AppConfiguration {

    @Bean
    public SomeType someObject() {
        return new SomeType();
    }
}


@Component
public class AppComponent {

    @Autowired
    private SomeType someObject;

    public AppComponent() {
        // Here properties are not yet injected by Spring IoC container
        System.out.println(someObject); // Obviously prints null
    }

    /**
     * Method is invoked after a bean is initialized and all its properties are being set.
     */
    @PostConstruct
    private void init() {
        System.out.println(someObject); // Prints SomeType@6b419da
    }
}

public class SomeType {
}

所以 bean 生命周期基本上由以下步骤组成:

1.创建Bean实例
2. Bean属性设置
3. 如果 bean 实现 Aware 接口 - 调用那些实现的方法
4. BeanPostProcessor#postProcessBeforeInitialization 自定义 bean 的方法 post-处理器被调用
5. 初始化回调按以下顺序调用:
5.1. @PostConstruct 方法被调用
5.2. InitializingBean#afterPropertiesSet() 方法被调用
5.3. @Bean#initMethod() 方法被调用
Bean 现已完全初始化。
6. BeanPostProcessor#postProcessAfterInitialization 自定义 post 处理器的方法被调用 被调用。
7. 销毁回调按以下顺序调用:
7.1. @PreDestroy 方法被调用
7.2. DisposableBean#destroy() 方法被调用
7.3. @Bean#destroyMethod 方法被调用