spring後置處理器

Bean後處理器:即當Spring容器實例化Bean實例之後進行的增強處理。

容器後處理器:對容器本身進行處理,並總是在容器實例化其他任何Bean之前讀取配置文件的元數據並可能修改這些數據。


一、Bean後處理器

      實現了BeanPostProcessor接口的類即可作爲一個Bean後處理器,以下是一個Bean後處理器的範例

      1、編寫一個實現了BeanPostProcessor接口的MyBeanPostProcessor類

[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. package org.meify.core;  
  2.   
  3. import org.meify.bean.AuthorBean;  
  4. import org.springframework.beans.BeansException;  
  5. import org.springframework.beans.factory.config.BeanPostProcessor;  
  6. /** 
  7.  * Bean後處理器 
  8.  * 主要負責對容器初始化其他Bean後進行進一步增強處理 
  9.  * 當Spring容器實例化Bean實例之後,就偶會依次調用Bean後處理器的兩個方法對實例Bean進行增強處理。 
  10.  * @description  
  11.  * @version 1.0 
  12.  * @author meify  2014-1-3 下午3:56:39 
  13.  */  
  14. public class MyBeanPostProcessor implements BeanPostProcessor {  
  15.     @Override  
  16.     public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {  
  17.         // TODO Auto-generated method stub  
  18.         System.out.println(beanName+"初始化之前進行增強處理。。。");  
  19.         return bean;  
  20.     }  
  21.   
  22.     @Override  
  23.     public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {  
  24.         // TODO Auto-generated method stub  
  25.         System.out.println(beanName+"初始化之後進行增強處理。。。");  
  26.         //重新改編author實例的屬性值  
  27.         if(beanName.equals("author")||bean instanceof AuthorBean){  
  28.             AuthorBean author=(AuthorBean) bean;  
  29.             author.setAddress("遼寧省大連市");  
  30.         }  
  31.         return bean;  
  32.     }  
  33. }  

2、在spring配置文件中註冊該Bean後處理器

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <!-- 註冊Bean後處理器 -->  
  2.     <bean id="beanProcessor" class="org.meify.core.MyBeanPostProcessor"/>  


至此一個Bean後處理器即完成了


二、容器後處理器

     同上,容器後處理器實現的是BeanFactoryPostProcessor接口

    1、編寫實現了BeanFactoryPostProcessor接口的MyBeanFactoryPostProcessor的容器後處理器

   

[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. package org.meify.core;  
  2.   
  3. import org.springframework.beans.BeansException;  
  4. import org.springframework.beans.factory.config.BeanFactoryPostProcessor;  
  5. import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;  
  6. /** 
  7.  * 容器後處理器 
  8.  * 通常用於對Spring容器進行拓展,並且總是在容器實例化其他任何bean之前讀取配置文件的元數據並進行修改 
  9.  * 典型的應用即對數據源的配置,其中url  driver  user passwd等通常配置在properties文件中並使用屬性佔位符配置器來“填充” 
  10.  * @description  
  11.  * @version 1.0 
  12.  * @author meify  2014-1-3 下午4:31:12 
  13.  */  
  14. public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {  
  15.   
  16.     @Override  
  17.     public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0) throws BeansException {  
  18.         // TODO Auto-generated method stub  
  19.          System.out.println("對容器進行後處理。。。。");  
  20.     }  
  21.   
  22. }  

2、註冊容器後處理器
[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. <!-- 註冊容器後處理器 -->  
  2.      <bean id="factoryProcessor" class="org.meify.core.MyBeanFactoryPostProcessor"/>  

這樣一個容器後處理器也完成了


最後編寫一個測試程序,對以上的兩種後處理器進行測試

[java] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. package org.meify.test;  
  2.   
  3.   
  4. import org.meify.bean.AuthorBean;  
  5. import org.springframework.context.ApplicationContext;  
  6. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  7.   
  8. /** 
  9.  * 獲取Spring容器並獲取bean實例 
  10.  * 以下代碼: 
  11.  * 先獲取spring容器,再獲取實體bean,將Spring接口與代碼耦合在一起,造成代碼污染。 
  12.  * @description  
  13.  * @version 1.0 
  14.  * @author meify  2014-1-2 下午2:33:48 
  15.  */  
  16. public class Test01 {  
  17.   
  18.     public static void main(String[] args) {  
  19.         //ApplicationContext的實例即Spring容器,也稱之爲Spring上下文  
  20.         ApplicationContext ctx=new ClassPathXmlApplicationContext("spring-config.xml");  
  21.         System.out.println(ctx);  
  22.           
  23.           
  24.           
  25.         AuthorBean author=ctx.getBean("author",AuthorBean.class);  
  26.         //注意,author的初始化時地址爲湖北省武穴市,在Bean後處理器中改變爲  遼寧省大連市  
  27.         System.out.println("author的地址爲:===="+author.getAddress());  
  28.           
  29.           
  30.           
  31.         }  
  32.       
  33. }  

控制檯輸出如下:

[html] view plain copy
 在CODE上查看代碼片派生到我的代碼片
  1. 2014-1-3 16:33:24 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions  
  2. 信息: Loading XML bean definitions from class path resource [spring-config.xml]  
  3. 對容器進行後處理。。。。  
  4. 2014-1-3 16:33:24 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons  
  5. 信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@c09554: defining beans [book,author,beanProcessor,factoryProcessor]; root of factory hierarchy  
  6. org.springframework.context.support.ClassPathXmlApplicationContext@1cb25f1: startup date [Fri Jan 03 16:33:24 CST 2014]; root of context hierarchy  
  7. author初始化之後進行增強處理。。。  
  8. 正在執行初始化方法。。。  
  9. author初始化之前進行增強處理。。。  
  10. author的地址爲:====遼寧省大連市  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章