在BeanPostProcessor之前调用PostConstruct

con*_*ind 5 java spring spring-mvc

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

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

  1. BPP - > postProcessBeforeInitialization
  2. PostContruct
  3. BPP - > postProcessAfterInitialization

但是我看到以下顺序: -

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

}}
Run Code Online (Sandbox Code Playgroud)

响应

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

MySpring.temp值为3表示PostContruct是calles 3次.

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

Sot*_*lis 5

它被调用了 3 次,因为你用你的MySpringbean替换了每个bean。

你的方法

public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    System.out.println("Before BPP " + bean.getClass());

    return this;
}
Run Code Online (Sandbox Code Playgroud)

正在返回this,有效地表示您当前正在后处理的 bean 对象应该被MySpring对象替换。您可以通过尝试从您的ApplicationContext.

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(ConfigurationBean.class);
ctx.getBean(ConfigurationBean.class);
Run Code Online (Sandbox Code Playgroud)

这将失败并显示NoSuchBeanDefinitionException.

您的后处理方法应该返回其bean参数的值。

public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    System.out.println("Before BPP " + bean.getClass());

    return bean;
}
Run Code Online (Sandbox Code Playgroud)

@PostConstruct调用是用它自己的BeanPostProcessor, 实现的CommonAnnotationBeanPostProcessor。已注册的BeanPostProcessor实例按顺序使用。

当您ApplicationContext初始化您的MySpring实例时,CommonAnnotationBeanPostProcessor它已经初始化并因此处理您的 bean。之后MySpring完全初始化的时候,检测到它是一个BeanPostProcessor和寄存器它。它在此之前注册CommonAnnotationBeanPostProcessorBeanPostProcessor实例有优先级设置)。