在BeanPostProcessor

时间:2016-01-01 14:12:36

标签: java spring spring-mvc

我现在是春天的新人。我试图遵循调用PostConstruct和BeanPostProcessor的顺序。

据我所知,以下是订单: -

  1. BPP - > postProcessBeforeInitialization
  2. PostContruct
  3. BPP - > postProcessAfterInitialization
  4. 但是我看到遵循以下顺序: -

    1. PostContruct
    2. BPP - > postProcessBeforeInitialization
    3. PostContruct
    4. BPP - > postProcessAfterInitialization
    5. 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");
      
      }}
      

      响应

      1. 初始化MySpring构造函数
      2. 初始化ApplicationContext
      3. PostConsturctclass springtest.MySpring
      4. 在属性设置类springtest.MySpring
      5. 之后
      6. 在BPP类之前org.springframework.context.event.EventListenerMethodProcessor
      7. PostConsturctclass springtest.MySpring
      8. 在属性设置类springtest.MySpring
      9. 之后
      10. BPP班级springtest.MySpring
      11. 之后
      12. 在BPP类之前org.springframework.context.event.DefaultEventListenerFactory
      13. PostConsturctclass springtest.MySpring
      14. 在属性设置类springtest.MySpring
      15. 之后
      16. BPP班级springtest.MySpring
      17. 之后

        MySpring.temp值为3表示PostContruct为3次。

        有人可以在上面帮助我......

1 个答案:

答案 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调用使用自己的BeanPostProcessorCommonAnnotationBeanPostProcessor来实现。注册的BeanPostProcessor实例按顺序使用。

当您的ApplicationContext初始化MySpring实例时,CommonAnnotationBeanPostProcessor已初始化,因此会处理您的bean。在MySpring完全初始化后,Spring会检测到它是BeanPostProcessor并注册它。它在CommonAnnotationBeanPostProcessor之前注册(BeanPostProcessor个实例的优先级设置)。