我现在是 Spring 的新手。我试图遵循调用PostConstruct和BeanPostProcessor的顺序。

根据我的了解,以下是顺序:-

  • BPP-> postProcessBeforeInitialization
  • PostContruct
  • BPP-> postProcessAfterInitialization

  • 但是我看到以下顺序:
  • PostContruct
  • BPP-> postProcessBeforeInitialization
  • PostContruct
  • BPP-> postProcessAfterInitialization

  • SpringConfig文件foo.xml
    删除了bean标签
    上下文: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构造函数
  • 初始化ApplicationContext
  • PostConsturctclass springtest.MySpring
  • 在属性设置类springtest.MySpring
  • 之后
  • 在BPP类之前org.springframework.context.event.EventListenerMethodProcessor
  • PostConsturctclass springtest.MySpring
  • 在属性设置类springtest.MySpring
  • 之后
  • 经过BPP类springtest.MySpring
  • 在BPP类之前org.springframework.context.event.DefaultEventListenerFactory
  • PostConsturctclass springtest.MySpring
  • 在属性设置类springtest.MySpring
  • 之后
  • 经过BPP类springtest.MySpring

  • MySpring.temp的值为3表示PostContruct被调用了3次。

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

    最佳答案

    之所以被调用了三次,是因为您要用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实例有一个优先级设置)。

    10-06 11:18