Bean後處理器:即當Spring容器實例化Bean實例之後進行的增強處理。
容器後處理器:對容器本身進行處理,並總是在容器實例化其他任何Bean之前讀取配置文件的元數據並可能修改這些數據。
一、Bean後處理器
實現了BeanPostProcessor接口的類即可作爲一個Bean後處理器,以下是一個Bean後處理器的範例
1、編寫一個實現了BeanPostProcessor接口的MyBeanPostProcessor類
- package org.meify.core;
- import org.meify.bean.AuthorBean;
- import org.springframework.beans.BeansException;
- import org.springframework.beans.factory.config.BeanPostProcessor;
- /**
- * Bean後處理器
- * 主要負責對容器初始化其他Bean後進行進一步增強處理
- * 當Spring容器實例化Bean實例之後,就偶會依次調用Bean後處理器的兩個方法對實例Bean進行增強處理。
- * @description
- * @version 1.0
- * @author meify 2014-1-3 下午3:56:39
- */
- public class MyBeanPostProcessor implements BeanPostProcessor {
- @Override
- public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
- // TODO Auto-generated method stub
- System.out.println(beanName+"初始化之前進行增強處理。。。");
- return bean;
- }
- @Override
- public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
- // TODO Auto-generated method stub
- System.out.println(beanName+"初始化之後進行增強處理。。。");
- //重新改編author實例的屬性值
- if(beanName.equals("author")||bean instanceof AuthorBean){
- AuthorBean author=(AuthorBean) bean;
- author.setAddress("遼寧省大連市");
- }
- return bean;
- }
- }
2、在spring配置文件中註冊該Bean後處理器
- <!-- 註冊Bean後處理器 -->
- <bean id="beanProcessor" class="org.meify.core.MyBeanPostProcessor"/>
二、容器後處理器
同上,容器後處理器實現的是BeanFactoryPostProcessor接口
1、編寫實現了BeanFactoryPostProcessor接口的MyBeanFactoryPostProcessor的容器後處理器
- package org.meify.core;
- import org.springframework.beans.BeansException;
- import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
- import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
- /**
- * 容器後處理器
- * 通常用於對Spring容器進行拓展,並且總是在容器實例化其他任何bean之前讀取配置文件的元數據並進行修改
- * 典型的應用即對數據源的配置,其中url driver user passwd等通常配置在properties文件中並使用屬性佔位符配置器來“填充”
- * @description
- * @version 1.0
- * @author meify 2014-1-3 下午4:31:12
- */
- public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
- @Override
- public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0) throws BeansException {
- // TODO Auto-generated method stub
- System.out.println("對容器進行後處理。。。。");
- }
- }
2、註冊容器後處理器
- <!-- 註冊容器後處理器 -->
- <bean id="factoryProcessor" class="org.meify.core.MyBeanFactoryPostProcessor"/>
這樣一個容器後處理器也完成了
最後編寫一個測試程序,對以上的兩種後處理器進行測試
- package org.meify.test;
- import org.meify.bean.AuthorBean;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- /**
- * 獲取Spring容器並獲取bean實例
- * 以下代碼:
- * 先獲取spring容器,再獲取實體bean,將Spring接口與代碼耦合在一起,造成代碼污染。
- * @description
- * @version 1.0
- * @author meify 2014-1-2 下午2:33:48
- */
- public class Test01 {
- public static void main(String[] args) {
- //ApplicationContext的實例即Spring容器,也稱之爲Spring上下文
- ApplicationContext ctx=new ClassPathXmlApplicationContext("spring-config.xml");
- System.out.println(ctx);
- AuthorBean author=ctx.getBean("author",AuthorBean.class);
- //注意,author的初始化時地址爲湖北省武穴市,在Bean後處理器中改變爲 遼寧省大連市
- System.out.println("author的地址爲:===="+author.getAddress());
- }
- }
控制檯輸出如下:
- 2014-1-3 16:33:24 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
- 信息: Loading XML bean definitions from class path resource [spring-config.xml]
- 對容器進行後處理。。。。
- 2014-1-3 16:33:24 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
- 信息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@c09554: defining beans [book,author,beanProcessor,factoryProcessor]; root of factory hierarchy
- org.springframework.context.support.ClassPathXmlApplicationContext@1cb25f1: startup date [Fri Jan 03 16:33:24 CST 2014]; root of context hierarchy
- author初始化之後進行增強處理。。。
- 正在執行初始化方法。。。
- author初始化之前進行增強處理。。。
- author的地址爲:====遼寧省大連市