Spring-@Configuration中的@Autowired bean为空

时间:2018-11-28 20:37:27

标签: spring autowired spring-config

我在配置类中定义了一个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?

1 个答案:

答案 0 :(得分:2)

您是否错过了在创建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.调用自定义bean后处理器的BeanPostProcessor#postProcessBeforeInitialization方法
5.初始化回调按以下顺序调用:
5.1。 @PostConstruct方法被调用
5.2。 InitializingBean#afterPropertiesSet()方法被调用
5.3。 @Bean#initMethod()方法被调用
Bean现在已完全初始化。
6.调用自定义后处理器的BeanPostProcessor#postProcessAfterInitialization方法 被调用。
7.销毁回调按以下顺序调用:
7.1。 @PreDestroy方法被调用
7.2。 DisposableBean#destroy()方法被调用
7.3。 @Bean#destroyMethod方法被调用