我遇到了 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
谢谢 !
最佳答案
如果你更仔细地查看日志,你会看到这些行
这是针对 bean1 的,对于 bean2,您也会有类似的日志。正如消息所说,bean1 不符合 Autoproxying 的条件。
这有点鸡和蛋的问题。由于您的 BeanPostProcessor 代码位于同一个类中,因此它无法完全创建 bean,因此不会调用 postProcessAfterInitialization
。
Here 是一篇不错的文章,提供了更多相关信息。
一个简单的解决方法是将您的 BeanPostProcessor
代码移动到一个单独的类。
关于spring - 不会为 bean 调用 BeanPostprocessor,这些 bean Autowiring 为 map 列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49492858/