Spring Bean后处理器以及容器后处理器【转】

Bean后处理器:即当spring容器实例化Bean实例之后进行的增强处理。

容器后处理器:对容器本身进行处理,并总是在容器实例化其他任何Bean之前读取配置文件的元数据并可能修改这些数据。

一、Bean后处理器

实现了BeanPostProcessor接口的类即可作为一个Bean后处理器,以下是一个Bean后处理器的范例

1、编写一个实现了BeanPostProcessor接口的MyBeanPostProcessor类

[java] view plain copy

  1. package org.meify.core;
  2. import org.meify.bean.AuthorBean;
  3. import org.springframework.beans.BeansException;
  4. import org.springframework.beans.factory.config.BeanPostProcessor;
  5. /**
  6. * Bean后处理器
  7. * 主要负责对容器初始化其他Bean后进行进一步增强处理
  8. * 当Spring容器实例化Bean实例之后,就偶会依次调用Bean后处理器的两个方法对实例Bean进行增强处理。
  9. * @description
  10. * @version 1.0
  11. * @author meify  2014-1-3 下午3:56:39
  12. */
  13. public class MyBeanPostProcessor implements BeanPostProcessor {
  14. @Override
  15. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
  16. // TODO Auto-generated method stub
  17. System.out.println(beanName+"初始化之前进行增强处理。。。");
  18. return bean;
  19. }
  20. @Override
  21. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
  22. // TODO Auto-generated method stub
  23. System.out.println(beanName+"初始化之后进行增强处理。。。");
  24. //重新改编author实例的属性值
  25. if(beanName.equals("author")||bean instanceof AuthorBean){
  26. AuthorBean author=(AuthorBean) bean;  //获取要修改的bean对象
  27. author.setAddress("辽宁省大连市");
  28. }
  29. return bean;
  30. }
  31. }

2、在spring配置文件中注册该Bean后处理器

[html] view plain copy

  1. <!-- 配置bean后置处理器,可以不配置id -->
  2. <bean id="beanProcessor" class="org.meify.core.MyBeanPostProcessor"/>

至此一个Bean后处理器即完成了

二、容器后处理器

同上,容器后处理器实现的是BeanFactoryPostProcessor接口

1、编写实现了BeanFactoryPostProcessor接口的MyBeanFactoryPostProcessor的容器后处理器

[java] view plain copy

  1. package org.meify.core;
  2. import org.springframework.beans.BeansException;
  3. import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
  4. import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
  5. /**
  6. * 容器后处理器
  7. * 通常用于对Spring容器进行拓展,并且总是在容器实例化其他任何bean之前读取配置文件的元数据并进行修改
  8. * 典型的应用即对数据源的配置,其中url  driver  user passwd等通常配置在properties文件中并使用属性占位符配置器来“填充”
  9. * @description
  10. * @version 1.0
  11. * @author meify  2014-1-3 下午4:31:12
  12. */
  13. public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
  14. @Override
  15. public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0) throws BeansException {
  16. // TODO Auto-generated method stub
  17. System.out.println("对容器进行后处理。。。。");
  18. }
  19. }

2、注册容器后处理器

[html] view plain copy

  1. <!-- 注册容器后处理器 -->
  2. <bean id="factoryProcessor" class="org.meify.core.MyBeanFactoryPostProcessor"/>

这样一个容器后处理器也完成了

最后编写一个测试程序,对以上的两种后处理器进行测试

[java] view plain copy

  1. package org.meify.test;
  2. import org.meify.bean.AuthorBean;
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5. /**
  6. * 获取Spring容器并获取bean实例
  7. * 以下代码:
  8. * 先获取spring容器,再获取实体bean,将Spring接口与代码耦合在一起,造成代码污染。
  9. * @description
  10. * @version 1.0
  11. * @author meify  2014-1-2 下午2:33:48
  12. */
  13. public class Test01 {
  14. public static void main(String[] args) {
  15. //ApplicationContext的实例即Spring容器,也称之为Spring上下文
  16. ApplicationContext ctx=new ClassPathXmlApplicationContext("spring-config.xml");
  17. System.out.println(ctx);
  18. AuthorBean author=ctx.getBean("author",AuthorBean.class);
  19. //注意,author的初始化时地址为湖北省武穴市,在Bean后处理器中改变为  辽宁省大连市
  20. System.out.println("author的地址为:===="+author.getAddress());
  21. }
  22. }

控制台输出如下:

[html] view plain copy

  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.s[email protected]c09554: defining beans [book,author,beanProcessor,factoryProcessor]; root of factory hierarchy
  6. org[email protected]1cb25f1: startup date [Fri Jan 03 16:33:24 CST 2014]; root of context hierarchy
  7. author初始化之后进行增强处理。。。
  8. 正在执行初始化方法。。。
  9. author初始化之前进行增强处理。。。
  10. author的地址为:====辽宁省大连市

接下来介绍两个容器后处理器的范例。

拿之前的Spring管理数据源为例,使用容器后处理器进行改造。

1、属性占位符配置器

[html] view plain copy

  1. <!--  数据源配置 -->
  2. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  3. <property name="driverClassName" value="${jdbc.driverClassName}" />
  4. <property name="url" value="${jdbc.url}" />
  5. <property name="username" value="${jdbc.username}" />
  6. <property name="password" value="${jdbc.password}" />
  7. <property name="initialSize" value="${jdbc.initialSize}" />
  8. <property name="maxActive" value="${jdbc.maxActive}" />
  9. <property name="maxIdle" value="${jdbc.maxIdle}" />
  10. <property name="minIdle" value="${jdbc.minIdle}" />
  11. <property name="removeAbandoned" value="${jdbc.removeAbandoned}" />
  12. <property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}" />
  13. <property name="maxWait" value="${jdbc.maxWait}" />
  14. <property name="testOnBorrow" value="${jdbc.testOnBorrow}" />
  15. <property name="validationQuery" value="${jdbc.validationQuery}" />
  16. <property name="testWhileIdle" value="${jdbc.testWhileIdle}" />
  17. <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" />
  18. <property name="numTestsPerEvictionRun" value="${jdbc.numTestsPerEvictionRun}" />
  19. </bean>

其中属性占位符处理器的注册

[html] view plain copy

  1. <!--  注意PropertyPlaceholderConfigurer——属性占位符配置器,
  2. 它作为容器的后处理器将properties文件中配置的属性值填到相应的占位符处 -->
  3. <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  4. <property name="locations">
  5. <list>
  6. <value>classpath*:DB.properties</value>
  7. </list>
  8. </property>
  9. </bean>

其中数据源配置properties文件内容如下:

[plain] view plain copy

  1. ### MySQL-\u4e3b\u6570\u636e\u5e93 ###
  2. jdbc.driverClassName=com.mysql.jdbc.Driver
  3. jdbc.url=jdbc:mysql://10.3.17.22:3306/neuonline?autoReconnect=true&useUnicode=true&characterEncoding=utf8
  4. jdbc.username=neuonline
  5. jdbc.password=neuonline
  6. #\u521d\u59cb\u5316\u8fde\u63a5 \u6570\u91cf
  7. jdbc.initialSize = 10
  8. #\u6700\u5927\u53ef\u7528\u8fde\u63a5\u6570\u91cf
  9. jdbc.maxActive = 200
  10. #\u6700\u5927\u7a7a\u95f2\u8fde\u63a5
  11. jdbc.maxIdle=100
  12. #\u6700\u5c0f\u7a7a\u95f2\u8fde\u63a5
  13. jdbc.minIdle=50
  14. #\u662f\u5426\u81ea\u52a8\u79fb\u9664\u65e0\u6548\u7684\u8fde\u63a5
  15. jdbc.removeAbandoned=true
  16. #\u79fb\u9664\u65e0\u6548\u7684\u8fde\u63a5 \u8d85\u65f6\u65f6\u95f4(\u4ee5\u79d2\u6570\u4e3a\u5355\u4f4d)
  17. jdbc.removeAbandonedTimeout=120
  18. #\u8d85\u65f6\u7b49\u5f85\u65f6\u95f4\u4ee5\u6beb\u79d2\u4e3a\u5355\u4f4d 6000\u6beb\u79d2/1000\u7b49\u4e8e60\u79d2
  19. jdbc.maxWait=5000
  20. #\u662f\u5426\u83b7\u53d6\u8fde\u63a5\u65f6\u8fdb\u884c\u6d4b\u8bd5
  21. jdbc.testOnBorrow=true
  22. #\u6d4b\u8bd5\u6570\u636e\u5e93\u6b63\u5e38\u4e0e\u5426\u7684\u8bed\u53e5
  23. jdbc.validationQuery=SELECT now()
  24. #\u6d4b\u8bd5\u7a7a\u95f2\u94fe\u63a5\u662f\u5426\u53ef\u4ee5\u6b63\u5e38\u8bbf\u95ee
  25. jdbc.testWhileIdle=true
  26. #\u6d4b\u8bd5\u7a7a\u95f2\u94fe\u63a5\u6d4b\u8bd5\u65f6\u95f4\uff08\u6beb\u79d2\uff09\u95f4\u9694
  27. jdbc.timeBetweenEvictionRunsMillis=1800000
  28. #\u6d4b\u8bd5\u7a7a\u95f2\u94fe\u63a5\u7684\u6570\u91cf\uff08\u540cjdbc.maxActive\u4fdd\u6301\u4e00\u81f4\uff09
  29. jdbc.numTestsPerEvictionRun=200

这样属性占位符配置器会在容器初始化后,任何其他bean实例化之前将数据源中占位处使用properties文件中的属性值替换。

2、重写占位符配置器

将上面 的配置分别进行修改即可,改动部分如下:

[html] view plain copy

  1. <bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
  2. <property name="locations">
  3. <list>
  4. <value>classpath*:dbconn.properties</value>
  5. </list>
  6. </property>
  7. </bean>

[html] view plain copy

  1. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"/>

最后编写测试程序测试获取到的数据库连接

[java] view plain copy

  1. package org.meify.test;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. import java.sql.SQLException;
  5. import javax.sql.DataSource;
  6. /**
  7. * 测试获取数据库连接
  8. * @description
  9. * @version 1.0
  10. * @author meify  2014-1-3 下午2:15:20
  11. */
  12. public class Test03 {
  13. public static void main(String[] args) throws SQLException {
  14. ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-config.xml");
  15. DataSource ds = (DataSource) ctx.getBean("dataSource", DataSource.class);
  16. java.sql.Connection conn = ds.getConnection();
  17. System.out.println(conn);
  18. }
  19. }

控制台输出:

[java] view plain copy

    1. jdbc:mysql://10.3.17.22:3306/neuonline?autoReconnect=true&useUnicode=true&characterEncoding=utf8, [email protected], MySQL-AB JDBC Driver
时间: 2024-10-10 01:56:51

Spring Bean后处理器以及容器后处理器【转】的相关文章

[原创]java WEB学习笔记101:Spring学习---Spring Bean配置:IOC容器中bean的声明周期,Bean 后置处理器

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Spring Bean后处理器

Spring提供了两类后处理器 1.Bean后处理器 2.容器后处理器 Spring的很多功能就是通过这些后处理来提供高质量的服务.而程序员只需要简单几部同样可以自定义功能强大的后处理器,今天我们将简述Bean后处理器 一.Bean后处理器 用来加强Spring容器中的bean处理.可以在bean在spring容器中初始化前后对bean进行自定义处理. 1.自定义一个自定义一个bean后处理器:        public class MyBeanProcessor implements Bea

半夜思考之查漏补缺, Spring 中的容器后处理器

之前学 Spring 的时候 , 还没听过容器后处理器 , 但是一旦写出来 , 就会觉得似曾相识 . 容器配置器通常用于对 Spring 容器进行处理 , 并且总是在容器实例化任何其他 Bean 之前 , 读取配置文件中的元数据 , 并有可能修改这些数据 . Spring 提供了如下几个常用的容器后处理器 : PropertyPlaceholderConfigurer : 属性占位符配置器 PropertyOverrideConfigurer : 重写占位符配置器 CustomAutowireC

Spring(八)核心容器 - Bean 创建过程

目录 1.整体流程 2.核心流程 2.1 解析 FactoryBean 2.2 从 createBean 开始 2.2.1 创建 Bean 实例 2.2.2 初始化 Bean 实例 - 属性注入 2.2.3 初始化 Bean 实例 - 执行初始化方法(回调钩子接口) Spring 版本 5.0.7.RELEASE 获取 Bean 的方法是 getBean,其来自 BeanFactory 继承的 AbstractAutowireCapableBeanFactory 抽象类继承的 AbstractB

代码: 两列图片瀑布流(一次后台取数据,图片懒加载。下拉后分批显示图片。图片高度未知,当图片onload后才显示容器)

代码: 两列图片瀑布流(一次后台取数据,无ajax,图片懒加载.下拉后分批显示图片.图片高度未知,当图片onload后才显示容器) [思路]: 图片瀑布流,网上代码有多种实现方式,也有各类插件.没找到合意的,所以根据网上找的一段代码,进行了较大改动. 需引用 zepto 或 jquery. 我这个是应用于手机上的,两列瀑布流,图片高度未知——等图片的onloaded事件触发后,才对容器进行计算和定位. 大容器是 $("#imgList"),容器格子是$(".pin"

javascript超过容器后显示省略号效果(兼容一行或者多行)

javascript超过容器后显示省略号效果 在实际的项目中,由于文字内容的长度不确定性和页面布局的固定性,难免会出现文字内容超过div(或其他标签,下同)区域的情况,此时比较好的做法就是当文字超过限定的div宽度后自动以省略号(…)显示,这样,按照习惯,人们都会知道这儿有文字被省略了.css中有个属性叫做text-overflow:ellipsis;比如使用css可以这样写: {width:27em; white-space:nowrap; text-overflow:ellipsis; -o

Docker使用-v挂载主机目录到容器后出现Permission denied

1. 在挂载主机目录的到容器后,操作挂载的目录出现权限问题: # 将主机上的/data/share/master目录挂载到容器的/opt/share目录docker run -it --name=master --hostname=master -v /data/share/master:/opt/share centos-hadoop /bin/bash [[email protected] share]# pwd #进入挂载目录 /opt/share [[email protected] s

Docker进入容器后使用ifconfig等命令“command not found”解决办法

当进入一个容器后,使用ifconfig.ip addr等命令时,出现如下“command not found”:   解决办法: yum update yum -y install net-tools 原文地址:https://www.cnblogs.com/lemon-le/p/9788955.html

Spring Bean的作用域(转)

Spring Bean的作用域 .singleton  [单例] eg:<bean id="personService" class="com.yinger.service.impl.PersonServiceBean" scope="singleton"></bean> 在每个Spring IoC容器中一个bean定义只有一个对象实例. 请注意Spring的singleton bean概念与“四人帮”(GoF)模式一书中