我面对BeanPostProcessors
的非常奇怪(意外)的行为,让我们假设我们得到以下配置:
public class Test {
public static void main(String[] args) {
new AnnotationConfigApplicationContext(TestConfiguration.class);
}
@Configuration
public static class TestConfiguration {
@Bean
public String bean1() {
return "1";
}
@Bean
public String bean2() {
return "2";
}
@Bean
public Integer bean3() {
return 3;
}
@Bean
public BeanPostProcessor postProcessor() {
return new BeanPostProcessor() {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName);
return bean;
}
};
}
}
}
因此,当我们运行此代码时,它会打印所有bean的名称:
使用指定的后处理器。
但是当我使用@Autowire
注释时,为了拥有String
类型的所有bean,这种类型的bean不是post-processed
现有的后处理器,这似乎对我来说很奇怪。
此类配置的示例如下:
public class Test {
public static void main(String[] args) {
new AnnotationConfigApplicationContext(TestConfiguration.class);
}
@Configuration
public static class TestConfiguration {
@Autowired(required = false)
private List<String> stringBeans = new ArrayList<>();
@Bean
public String bean1() {
return "1";
}
@Bean
public String bean2() {
return "2";
}
@Bean
public Integer bean3() {
return 3;
}
@Bean
public BeanPostProcessor postProcessor() {
return new BeanPostProcessor() {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println(beanName);
return bean;
}
};
}
}
}
spring core的版本是 4.3.8.RELEASE
Thx!
答案 0 :(得分:3)
如果仔细查看日志,您会看到这些行
[主要] DEBUG org.springframework.beans.factory.support.DefaultListableBeanFactory - 热切地缓存豆子豆#1;允许解决潜在的通告 参考文献
[主要] INFO org.springframework.context.support.PostProcessorRegistrationDelegate $ BeanPostProcessorChecker - Bean&#39; bean1&#39;类型[java.lang.String]不适合所有BeanPostProcessors处理(例如:不符合条件的 自动代理)
这是针对bean1的,你也会有类似的bean2日志。正如消息所说,bean1不符合Autoproxying的条件。
这有点鸡和蛋的问题。由于您的BeanPostProcessor代码位于同一个类中,因此无法完全创建bean,因此不会调用postProcessAfterInitialization
。
Here是一篇很好的文章,有关于此的更多信息。
一个简单的解决方法是将BeanPostProcessor
代码移到单独的类中。