我在配置类中定义了一个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?
答案 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
方法被调用