PostProcessor


 

 

1. BeanPostProcessor簡介

BeanPostProcessor是Spring IOC容器給我們提供的一個擴展接口。接口聲明如下:

public interface BeanPostProcessor {
    //bean初始化方法調用前被調用
    Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
    //bean初始化方法調用后被調用
    Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}

運行順序

===Spring IOC容器實例化Bean===
===調用BeanPostProcessor的postProcessBeforeInitialization方法===
===調用bean實例的初始化方法===
===調用BeanPostProcessor的postProcessAfterInitialization方法===

不要將BeanPostProcessor標記為延遲初始化。因為如果這樣做,Spring容器將不會注冊它們,自定義邏輯也就無法得到應用。假如你在<beans />元素的定義中使用了'default-lazy-init'屬性,請確信你的各個BeanPostProcessor標記為'lazy-init="false"'。BeanFactory和ApplicationContext對待bean后置處理器稍有不同。ApplicationContext會自動檢測在配置文件中實現了BeanPostProcessor接口的所有bean,並把它們注冊為后置處理器,然后在容器創建bean的適當時候調用它,因此部署一個后置處理器同部署其他的bean並沒有什么區別。而使用BeanFactory實現的時候,bean 后置處理器必須通過代碼顯式地去注冊,在IoC容器繼承體系中的ConfigurableBeanFactory接口中定義了注冊方法

2. BeanPostProcessor實例

public class MyBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("postProcessBeforeInitialization..." + beanName + "=>" + bean);
        return bean;
    }

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        // TODO Auto-generated method stub
        System.out.println("postProcessAfterInitialization..."+beanName+"=>"+bean);
        return bean;
    }

}

3.InstantiationAwareBeanPostProcessor

InstantiationAwareBeanPostProcessor是BeanPostProcessor的子接口,可以在Bean生命周期的另外兩個時期提供擴展的回調接口,即實例化Bean之前(調用postProcessBeforeInstantiation方法)和實例化Bean之后(調用postProcessAfterInstantiation方法),該接口定義如下:

 public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor { Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException; boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException; PropertyValues postProcessPropertyValues( PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException; } 

其使用方法與上面介紹的BeanPostProcessor接口類似,只時回調時機不同。

 
如果是使用ApplicationContext來生成並管理Bean的話則稍有不同,使用ApplicationContext來生成及管理Bean實例的話,在執行BeanFactoryAware的setBeanFactory()階段后,若Bean類上有實現org.springframework.context.ApplicationContextAware接口,則執行其setApplicationContext()方法,接着才執行BeanPostProcessors的ProcessBeforeInitialization()及之后的流程。

3. BeanFactoryPostProcessor簡介

bean工廠的bean屬性處理容器,說通俗一些就是可以管理我們的bean工廠內所有的beandefinition(未實例化)數據,可以隨心所欲的修改屬性。

4. BeanFactoryPostProcessor實例

@Component
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        System.out.println("MyBeanFactoryPostProcessor...postProcessBeanFactory...");
        int count = beanFactory.getBeanDefinitionCount();
        String[] names = beanFactory.getBeanDefinitionNames();
        System.out.println("當前BeanFactory中有"+count+" 個Bean");
        System.out.println(Arrays.asList(names));
    }

}

 

區別:

注冊BeanFactoryPostProcessor的實例,需要重載

void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

通過beanFactory可以獲取bean的示例或定義等。同時可以修改bean的屬性,這是和BeanPostProcessor最大的區別。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM