簡體   English   中英

Spring BeanPostProcessor中的postProcessBeforeInitialization意味着什么?

[英]What does postProcessBeforeInitialization means in Spring BeanPostProcessor?

在XML文件中

<bean id="triangle" class="com.company.aop.model.Triangle">
    <property name="name" value="myTriangle"></property>
</bean>

<bean class="com.company.aop.DisplayNameBeanPostProcessor"></bean>

在DisplayNameBeanPostProcessor.java類中

public class DisplayNameBeanPostProcessor implements BeanPostProcessor{

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName)
            throws BeansException {
        // TODO Auto-generated method stub
        if(bean instanceof Triangle) {
//          System.out.println("Tr "+(((Triangle) bean).getName().toString()));
            System.out.println("I am after intialisation");
        }
        return bean;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName)
            throws BeansException {
        // TODO Auto-generated method stub
        if(bean instanceof Triangle) {
            System.out.println("Tr "+(((Triangle) bean).getName().toString()));
        }
        return bean;
    }

}

現在,當我運行此代碼時,它將轉到帶有參數bean和beanName的postProcessBeforeInitialization()方法,並顯示消息“ myTriangle”。 在我的情況下,此bean具有諸如其名稱字段之類的信息,其值為“ myTriangle”。 但是方法簽名說,是在初始化之前,如果尚未初始化,傳遞給它的bean是什么? 和之間有什么區別

public Object postProcessAfterInitialization(Object bean, String beanName) 

public Object postProcessBeforeInitialization(Object bean, String beanName)

為什么這條線

System.out.println("Tr "+(((Triangle) bean).getName().toString()));

如果在初始化之前調用了該方法,則在方法postProcessBeforeInitialization中打印名稱?

您可以在此處參考Spring文檔的5.8.1節。 這里的關鍵點是,“ postProcessBeforeInitialization”應理解為“ postProcessBeforeInitializationCallback”,而“ postProcessAfterInitialization”應理解為“ postProcessAfterInitializationCallback”。 因此,這些是在bean上的Spring容器運行初始化回調之前/之后的預處理器和后處理器。 這就是在這些方法的文檔傳送這里了。

對象postProcessBeforeInitialization(對象bean,字符串beanName)拋出BeansException

在任何bean初始化回調(例如InitializingBean的afterPropertiesSet或自定義init-method)之前,將此BeanPostProcessor應用於給定的新bean實例。 該bean將已經用屬性值填充。

請注意,它說“ 該bean將已經用屬性值填充 ”。 相似地

對象postProcessAfterInitialization(對象bean,字符串beanName)拋出BeansException

在任何bean初始化回調(例如InitializingBean的afterPropertiesSet或自定義的init-method)之后,將此BeanPostProcessor應用於給定的新bean實例。 該bean將已經用屬性值填充。

BeanPostProcessor Bean是一種特殊的Bean,它在任何其他Bean之前創建並與新創建的Bean交互。 postProcessBeforeInitializationpostProcessAfterInitialization應用於spring創建的任何其他bean。

但是方法簽名說,是在初始化之前,如果尚未初始化,傳遞給它的bean是什么?

這里的初始化是指調用三角 bean的init方法,因此before和post調用將調用包裝在bean的init方法上。 在此之前,已經執行了構造函數和setter注入,這就是為什么bean具有實際值的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM