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;??
- public?class?MyBeanPostProcessor?implements?BeanPostProcessor?{??
- ????@Override??
- ????public?Object?postProcessAfterInitialization(Object?bean,?String?beanName)?throws?BeansException?{??
- ????????
- ????????System.out.println(beanName+"初始化之前进行增强处理。。。");??
- ????????return?bean;??
- ????}??
- ??
- ????@Override??
- ????public?Object?postProcessBeforeInitialization(Object?bean,?String?beanName)?throws?BeansException?{??
- ????????
- ????????System.out.println(beanName+"初始化之后进行增强处理。。。");??
- ????????
- ????????if(beanName.equals("author")||bean?instanceof?AuthorBean){??
- ????????????AuthorBean?author=(AuthorBean)?bean; ?//获取要修改的bean对象
- ????????????author.setAddress("辽宁省大连市");??
- ????????}??
- ????????return?bean;??
- ????}??
- }??
2、在spring配置文件中注册该Bean后处理器
?
?
- ????<bean?id="beanProcessor"?class="org.meify.core.MyBeanPostProcessor"/>??
?
?
至此一个Bean后处理器即完成了
?
二、容器后处理器
? ? ?同上,容器后处理器实现的是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;??
- public?class?MyBeanFactoryPostProcessor?implements?BeanFactoryPostProcessor?{??
- ??
- ????@Override??
- ????public?void?postProcessBeanFactory(ConfigurableListableBeanFactory?arg0)?throws?BeansException?{??
- ????????
- ?????????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;??
- ??
- public?class?Test01?{??
- ??
- ????public?static?void?main(String[]?args)?{??
- ????????
- ????????ApplicationContext?ctx=new?ClassPathXmlApplicationContext("spring-config.xml");??
- ????????System.out.println(ctx);??
- ??????????
- ??????????
- ??????????
- ????????AuthorBean?author=ctx.getBean("author",AuthorBean.class);??
- ????????
- ????????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的地址为:====辽宁省大连市??
?
接下来介绍两个容器后处理器的范例。
拿之前的Spring管理数据源为例,使用容器后处理器进行改造。
1、属性占位符配置器
?
- ???<bean?id="dataSource"?class="org.apache.commons.dbcp.BasicDataSource"?destroy-method="close">??
- ????<property?name="driverClassName"?value="${jdbc.driverClassName}"?/>??
- ????<property?name="url"?value="${jdbc.url}"?/>??
- ????<property?name="username"?value="${jdbc.username}"?/>??
- ????<property?name="password"?value="${jdbc.password}"?/>??
- ????<property?name="initialSize"?value="${jdbc.initialSize}"?/>??
- ????<property?name="maxActive"?value="${jdbc.maxActive}"?/>??
- ??????
- ????<property?name="maxIdle"?value="${jdbc.maxIdle}"?/>??
- ????<property?name="minIdle"?value="${jdbc.minIdle}"?/>??
- ????<property?name="removeAbandoned"?value="${jdbc.removeAbandoned}"?/>??
- ????<property?name="removeAbandonedTimeout"?value="${jdbc.removeAbandonedTimeout}"?/>??
- ????<property?name="maxWait"?value="${jdbc.maxWait}"?/>??
- ????<property?name="testOnBorrow"?value="${jdbc.testOnBorrow}"?/>??
- ????<property?name="validationQuery"?value="${jdbc.validationQuery}"?/>??
- ????<property?name="testWhileIdle"?value="${jdbc.testWhileIdle}"?/>??
- ????<property?name="timeBetweenEvictionRunsMillis"?value="${jdbc.timeBetweenEvictionRunsMillis}"?/>??
- ????<property?name="numTestsPerEvictionRun"?value="${jdbc.numTestsPerEvictionRun}"?/>??
- </bean>???
其中属性占位符处理器的注册
?
?
- <!--??注意PropertyPlaceholderConfigurer——属性占位符配置器,??
- ?????????????????????????它作为容器的后处理器将properties文件中配置的属性值填到相应的占位符处?-->??
- ?????<bean?class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">??
- ?????????<property?name="locations">??
- ?????????????<list>??
- ????????????????<value>classpath*:DB.properties</value>??
- ?????????????</list>??
- ?????????</property>??
- ????</bean>???
?
?
其中数据源配置properties文件内容如下:
?
- ###?MySQL-u4e3bu6570u636eu5e93?###??
- jdbc.driverClassName=com.mysql.jdbc.Driver??
- jdbc.url=jdbc:mysql://10.3.17.22:3306/neuonline?autoReconnect=true&useUnicode=true&characterEncoding=utf8??
- jdbc.username=neuonline??
- jdbc.password=neuonline??
- #u521du59cbu5316u8fdeu63a5?u6570u91cf??
- jdbc.initialSize?=?10??
- #u6700u5927u53efu7528u8fdeu63a5u6570u91cf??
- jdbc.maxActive?=?200??
- #u6700u5927u7a7au95f2u8fdeu63a5??
- jdbc.maxIdle=100??
- #u6700u5c0fu7a7au95f2u8fdeu63a5??
- jdbc.minIdle=50??
- #u662fu5426u81eau52a8u79fbu9664u65e0u6548u7684u8fdeu63a5??
- jdbc.removeAbandoned=true??
- #u79fbu9664u65e0u6548u7684u8fdeu63a5?u8d85u65f6u65f6u95f4(u4ee5u79d2u6570u4e3au5355u4f4d)??
- jdbc.removeAbandonedTimeout=120??
- #u8d85u65f6u7b49u5f85u65f6u95f4u4ee5u6bebu79d2u4e3au5355u4f4d?6000u6bebu79d2/1000u7b49u4e8e60u79d2??
- jdbc.maxWait=5000??
- #u662fu5426u83b7u53d6u8fdeu63a5u65f6u8fdbu884cu6d4bu8bd5??
- jdbc.testOnBorrow=true??
- #u6d4bu8bd5u6570u636eu5e93u6b63u5e38u4e0eu5426u7684u8bedu53e5??
- jdbc.validationQuery=SELECT?now()??
- #u6d4bu8bd5u7a7au95f2u94feu63a5u662fu5426u53efu4ee5u6b63u5e38u8bbfu95ee??
- jdbc.testWhileIdle=true??
- #u6d4bu8bd5u7a7au95f2u94feu63a5u6d4bu8bd5u65f6u95f4uff08u6bebu79d2uff09u95f4u9694??
- jdbc.timeBetweenEvictionRunsMillis=1800000??
- #u6d4bu8bd5u7a7au95f2u94feu63a5u7684u6570u91cfuff08u540cjdbc.maxActiveu4fddu6301u4e00u81f4uff09??
- jdbc.numTestsPerEvictionRun=200??
这样属性占位符配置器会在容器初始化后,任何其他bean实例化之前将数据源中占位处使用properties文件中的属性值替换。
?
?
2、重写占位符配置器
将上面 的配置分别进行修改即可,改动部分如下:
?
- <bean?class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">??
- ????????<property?name="locations">??
- ????????????<list>??
- ???????????????<value>classpath*:dbconn.properties</value>??
- ????????????</list>??
- ????????</property>??
- ???</bean>??
?
- <bean?id="dataSource"?class="org.apache.commons.dbcp.BasicDataSource"?destroy-method="close"/>??
?
?
最后编写测试程序测试获取到的数据库连接
?
- package?org.meify.test;??
- ??
- import?org.springframework.context.ApplicationContext;??
- import?org.springframework.context.support.ClassPathXmlApplicationContext;??
- import?java.sql.SQLException;??
- ??
- import?javax.sql.DataSource;??
- public?class?Test03?{??
- ????public?static?void?main(String[]?args)?throws?SQLException?{??
- ????????ApplicationContext?ctx?=?new?ClassPathXmlApplicationContext("spring-config.xml");??
- ????????DataSource?ds?=?(DataSource)?ctx.getBean("dataSource",?DataSource.class);??
- ????????java.sql.Connection?conn?=?ds.getConnection();??
- ????????System.out.println(conn);??
- ????}??
- ??
- }??
控制台输出:
?
?
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|