我现在是春天的新人。我试图遵循调用PostConstruct和BeanPostProcessor的顺序。
据我所知,以下是订单: -
但是我看到遵循以下顺序: -
SpringConfig文件foo.xml 删除了bean标签 context:component-scan base-package =“springtest”
@Component
public class MySpring implements ApplicationContextAware,BeanPostProcessor{
public static int temp =0;
public MySpring(){
System.out.println("Initializing MySpring Constructor");
}
@PostConstruct
public void temp(){
System.out.println("PostConsturct" + this.getClass());
temp++;
}
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("Before BPP " + bean.getClass());
return this;
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("After BPP " + bean.getClass());
return this;
}
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
System.out.println("Initializing ApplicationContext");
}}
响应
MySpring.temp值为3表示PostContruct为3次。
有人可以在上面帮助我......
答案 0 :(得分:2)
它被调用了三次因为你用你的MySpring
bean替换每个bean。
你的方法
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("Before BPP " + bean.getClass());
return this;
}
返回this
,有效地说你当前正在处理的bean对象应该被MySpring
对象替换。您可以尝试从ApplicationContext
获取任何其他bean来验证这一点。
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigurationBean.class);
ctx.getBean(ConfigurationBean.class);
这将失败NoSuchBeanDefinitionException
。
您的后处理方法应该返回其bean
参数的值。
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("Before BPP " + bean.getClass());
return bean;
}
@PostConstruct
调用使用自己的BeanPostProcessor
,CommonAnnotationBeanPostProcessor
来实现。注册的BeanPostProcessor
实例按顺序使用。
当您的ApplicationContext
初始化MySpring
实例时,CommonAnnotationBeanPostProcessor
已初始化,因此会处理您的bean。在MySpring
完全初始化后,Spring会检测到它是BeanPostProcessor
并注册它。它在CommonAnnotationBeanPostProcessor
之前注册(BeanPostProcessor
个实例的优先级设置)。