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
方法被调用
我在配置 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
方法被调用