Я новичок в весне. Я пытался следовать порядку, в котором вызываются PostConstruct и BeanPostProcessor.

Согласно тому, что я узнал, следующий порядок: -

  1. BPP -> postProcessBeforeInitialization
  2. Постконтракт
  3. BPP -> postProcessAfterInitialization

Однако я вижу, что соблюдается следующий порядок: -

  1. Постконтракт
  2. BPP -> postProcessBeforeInitialization
  3. Постконтракт
  4. BPP -> postProcessAfterInitialization

Файл SpringConfig foo.xml Удален тег beans контекст: компонент-сканирование 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. Перед классом BPP org.springframework.context.event.EventListenerMethodProcessor
  6. PostConsturctclass springtest.MySpring
  7. После свойств задайте класс springtest.MySpring
  8. После весеннего теста класса BPP. MySpring
  9. Перед классом BPP org.springframework.context.event.DefaultEventListenerFactory
  10. PostConsturctclass springtest.MySpring
  11. После свойств задайте класс springtest.MySpring
  12. После весенних испытаний класса BPP. MySpring

Значение MySpring.temp равно 3 означает, что PostContruct был вызван 3 раза.

Может ли кто-нибудь помочь мне в вышеупомянутом ...

confused mind

Ответов: 1

Ответы (1)

Он вызывается трижды, потому что вы заменяете каждый bean-компонент своим MySpring bean.

Ваш способ

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

    return this;
}

возвращает this, фактически говоря, что объект bean-компонента, который вы в настоящее время обрабатываете, должен быть заменен объектом MySpring. Вы можете проверить это, попытавшись получить любой другой bean-компонент из вашего ApplicationContext.

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 экземпляров).

2022 WebDevInsider