Spring Bean后处理器以及容器后处理器【转】
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; //获取要修改的bean对象
- author.setAddress("辽宁省大连市");
- }
- return bean;
- }
- }
2、在spring配置文件中注册该Bean后处理器
- <!-- 配置bean后置处理器,可以不配置id -->
- <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;
- /**
- * 容器后处理器
- * 通常用于对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的地址为:====辽宁省大连市
接下来介绍两个容器后处理器的范例。
拿之前的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-\u4e3b\u6570\u636e\u5e93 ###
- 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
- #\u521d\u59cb\u5316\u8fde\u63a5 \u6570\u91cf
- jdbc.initialSize = 10
- #\u6700\u5927\u53ef\u7528\u8fde\u63a5\u6570\u91cf
- jdbc.maxActive = 200
- #\u6700\u5927\u7a7a\u95f2\u8fde\u63a5
- jdbc.maxIdle=100
- #\u6700\u5c0f\u7a7a\u95f2\u8fde\u63a5
- jdbc.minIdle=50
- #\u662f\u5426\u81ea\u52a8\u79fb\u9664\u65e0\u6548\u7684\u8fde\u63a5
- jdbc.removeAbandoned=true
- #\u79fb\u9664\u65e0\u6548\u7684\u8fde\u63a5 \u8d85\u65f6\u65f6\u95f4(\u4ee5\u79d2\u6570\u4e3a\u5355\u4f4d)
- jdbc.removeAbandonedTimeout=120
- #\u8d85\u65f6\u7b49\u5f85\u65f6\u95f4\u4ee5\u6beb\u79d2\u4e3a\u5355\u4f4d 6000\u6beb\u79d2/1000\u7b49\u4e8e60\u79d2
- jdbc.maxWait=5000
- #\u662f\u5426\u83b7\u53d6\u8fde\u63a5\u65f6\u8fdb\u884c\u6d4b\u8bd5
- jdbc.testOnBorrow=true
- #\u6d4b\u8bd5\u6570\u636e\u5e93\u6b63\u5e38\u4e0e\u5426\u7684\u8bed\u53e5
- jdbc.validationQuery=SELECT now()
- #\u6d4b\u8bd5\u7a7a\u95f2\u94fe\u63a5\u662f\u5426\u53ef\u4ee5\u6b63\u5e38\u8bbf\u95ee
- jdbc.testWhileIdle=true
- #\u6d4b\u8bd5\u7a7a\u95f2\u94fe\u63a5\u6d4b\u8bd5\u65f6\u95f4\uff08\u6beb\u79d2\uff09\u95f4\u9694
- jdbc.timeBetweenEvictionRunsMillis=1800000
- #\u6d4b\u8bd5\u7a7a\u95f2\u94fe\u63a5\u7684\u6570\u91cf\uff08\u540cjdbc.maxActive\u4fdd\u6301\u4e00\u81f4\uff09
- 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;
- /**
- * 测试获取数据库连接
- * @description
- * @version 1.0
- * @author meify 2014-1-3 下午2:15:20
- */
- 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);
- }
- }
控制台输出:
- jdbc:mysql://10.3.17.22:3306/neuonline?autoReconnect=true&useUnicode=true&characterEncoding=utf8, UserName=neuonline@10.1.242.79, MySQL-AB JDBC Driver
Spring Bean后处理器以及容器后处理器【转】的更多相关文章
- Spring Bean的生命周期、后置处理器、定义继承
目录: 了解Spring的基本概念 Spring简单的示例 Spring Bean的定义及作用域 1.Bean的生命周期 Bean的生命周期可以简单的理解为:Bean的定义——Bean的初始化——Be ...
- [原创]java WEB学习笔记101:Spring学习---Spring Bean配置:IOC容器中bean的声明周期,Bean 后置处理器
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- spring4笔记----Spring几种常用的容器后处理器
PropertyPlaceholderConfigurer 属性占位符配置器 PropertyOverrideConfigureer 重写占位符配置器 CustomAutowireConfig ...
- Spring扩展:替换IOC容器中的Bean组件 -- @Replace注解
1.背景: 工作中是否有这样的场景?一个软件系统会同时有多个不同版本部署,比如我现在做的IM系统,同时又作为公司的技术输出给其他银行,不同的银行有自己的业务实现(比如登陆验证.用户信息查询等) ...
- 一个 Spring Bean 定义 包含什么?
一个Spring Bean 的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及它的依赖.
- Spring容器中bean的生命周期以及关注spring bean对象的后置处理器:BeanPostProcessor(一个接口)
Spring IOC 容器对 Bean 的生命周期进行管理的过程: 1.通过构造器或工厂方法创建 Bean 实例 2.为 Bean 的属性设置值和对其他 Bean 的引用 3.将 Bean 实例传递给 ...
- 8 -- 深入使用Spring -- 1...3 容器后处理器
8.1.3 容器后处理器(BeanFactoryPostProcessor) 容器后处理器负责处理容器本身. 容器后处理器必须实现BeanFacotryPostProcessor接口.实现该接口必须实 ...
- 半夜思考之查漏补缺, Spring 中的容器后处理器
之前学 Spring 的时候 , 还没听过容器后处理器 , 但是一旦写出来 , 就会觉得似曾相识 . 容器配置器通常用于对 Spring 容器进行处理 , 并且总是在容器实例化任何其他 Bean 之前 ...
- Spring Bean 后置处理器
Bean 后置处理器允许在调用初始化方法前后对 Bean 进行额外的处理. BeanPostProcessor 接口定义回调方法,你可以实现该方法来提供自己的实例化逻辑,依赖解析逻辑等. 你也可以在 ...
随机推荐
- 20145204&20145212信息安全系统实验三报告
实时系统的移植 实验目的与要求 1.根据实验指导书进行实时软件的安装 2.配置实验环境,并对软件进行测试. 3.正确使用连接线等仪器,注意保护试验箱. 实验内容与步骤 1.连接 arm 开发板 连接实 ...
- mysql安装配置
MySQL 是最流行的关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言. MySQL由于其体积小.速度快 ...
- 2、HTML 基础知识
一.HTT(PHyper Text Markup Language)即超文本语言. 特点: 1.通过标签来定义的语言,代码都是由标签所组成 2.不区分大小写 3.由<html>开始< ...
- Codeforces Round #262 (Div. 2) 1004
Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...
- 日期控件jsdate用法注意事项
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- PHP导出数据到CSV文件函数 csv_export()
后台往往需要导出各种数据到 Excel文档中.通常我们是导出 .csv文件格式,PHP导出函数参考代码如下: /** * 导出数据到CSV文件 * * @param array $data 二维数组( ...
- Linux线程同步:条件变量
条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用.使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化.一旦其它 ...
- 【Go入门教程5】面向对象(method、指针作为receiver、method继承、method重写)
前面两章我们介绍了函数和struct,那你是否想过函数当作struct的字段一样来处理呢?今天我们就讲解一下函数的另一种形态,带有接收者(receiver)的函数,我们称为method method ...
- CentOS6.3搭建Nginx代理访问MongoDB GridFS图片资源
PHP可以直接读取MongoDB GridFS中的图片并显示到页面中,但对PHP的压力就大了.偶然机会,了解到Nginx可以代理访问,实现过程如下: 1.工具准备 安装一些必要的编译工具及库,这里是直 ...
- 号外!GNOME 3.22 正式发布喽!!!
导读 经过半年的努力开发,别名为“卡尔斯鲁厄”的 GNOME 3.22 正式发布了!“GNOME Software 可以安装和更新 Flatpak 软件包,GNOME Builder 则可以创建它们, ...