spring 后置处理器BeanFactoryPostProcessor和BeanPostProcessor的用法和区别
主要区别就是: BeanFactoryPostProcessor可以修改BEAN的配置信息而BeanPostProcessor不能,下面举个例子说明
BEAN类:
- package com.springdemo.postProcessor;
- public class PostProcessorBean {
- private String username;
- private String password;
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- }
MyBeanPostProcessor类,实现了BeanPostProcessor接口:
- package com.springdemo.postProcessor;
- import org.springframework.beans.BeansException;
- import org.springframework.beans.factory.config.BeanPostProcessor;
- import com.springdemo.form.LoginForm;
- public class MyBeanPostProcessor implements BeanPostProcessor {
- public Object postProcessAfterInitialization(Object bean, String beanName)
- throws BeansException {
- // TODO Auto-generated method stub
- //如果是PostProcessorBean则username信息
- if(bean instanceof PostProcessorBean)
- {
- System.out.println("PostProcessorBean Bean initialized");
- PostProcessorBean pb = (PostProcessorBean)bean;
- System.out.println("username:"+pb.getUsername());
- }
- return bean;
- }
- public Object postProcessBeforeInitialization(Object bean, String beanName)
- throws BeansException {
- // TODO Auto-generated method stub
- if(bean instanceof PostProcessorBean)
- {
- System.out.println("PostProcessorBean Bean initializing");
- PostProcessorBean pb = (PostProcessorBean)bean;
- System.out.println("username:"+pb.getUsername());
- }
- return bean;
- }
- }
MyBeanFactoryPostProcessor实现了BeanFactoryPostProcessor接口:
- package com.springdemo.postProcessor;
- import org.springframework.beans.BeansException;
- import org.springframework.beans.MutablePropertyValues;
- import org.springframework.beans.factory.config.BeanDefinition;
- import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
- import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
- public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
- public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
- throws BeansException {
- // TODO Auto-generated method stub
- //BeanFactoryPostProcessor可以修改BEAN的配置信息而BeanPostProcessor不能
- //我们在这里修改postProcessorBean的username注入属性
- BeanDefinition bd = beanFactory.getBeanDefinition("postProcessorBean");
- MutablePropertyValues pv = bd.getPropertyValues();
- if(pv.contains("username"))
- {
- pv.addPropertyValue("username", "xiaojun");
- }
- }
- }
编写测试用例:
- package com.springdemo.test;
- import org.springframework.context.ApplicationContext;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import com.springdemo.factory.ApplicationContextFactory;
- import com.springdemo.postProcessor.PostProcessorBean;
- import junit.framework.TestCase;
- public class BeanPostPorcessorTest extends TestCase {
- private ApplicationContext context;
- protected void setUp() throws Exception {
- super.setUp();
- String[] paths = {"classpath*:/spring/applicationContext-*.xml"};
- context = new ClassPathXmlApplicationContext(paths);
- }
- protected void tearDown() throws Exception {
- super.tearDown();
- }
- public void testBeanPostProcessor()
- {
- }
- public void testBeanFactoryPostProcessor()
- {
- //PostProcessorBean bean =(PostProcessorBean)ServiceLocator.getService("postProcessorBean");
- PostProcessorBean bean =(PostProcessorBean)context.getBean("postProcessorBean");
- System.out.println("---------------testBeanFactoryPostProcessor----------------");
- System.out.println("username:"+bean.getUsername());
- System.out.println("password:"+bean.getPassword());
- //
- }
- }
spring配置文件如下(先不启用MyBeanFactoryPostProcessor):
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
- <bean class="com.springdemo.postProcessor.MyBeanPostProcessor"></bean>
- <!--我们先把BeanFactoryPostProcessor注释掉,不启用,然后查看测试输出结果
- <bean class="com.springdemo.postProcessor.MyBeanFactoryPostProcessor"></bean>
- -->
- <bean id="postProcessorBean" class="com.springdemo.postProcessor.PostProcessorBean" >
- <property name="username" value="test"></property>
- <property name="password" value="test"></property>
- </bean>
- </beans>
测试输出结果如下:
PostProcessorBean Bean initializing
username:test
PostProcessorBean Bean initialized
username:test
---------------testBeanFactoryPostProcessor----------------
username:test
password:test
然后我们取消注释启用MyBeanFactoryPostProcessor,测试结果如下:
PostProcessorBean Bean initializing
username:xiaojun
PostProcessorBean Bean initialized
username:xiaojun
---------------testBeanFactoryPostProcessor----------------
username:xiaojun
password:test
从结果可以看出:BeanFactoryPostProcessor的回调比BeanPostProcessor要早,因为
BeanPostProcess中输出的username已经变成了xiaojun,而不是test.还有就是
BeanFactoryPostProcessor确实有能力改变初始化BEAN的内容,您可以试试在MyBeanPostProcess中试一试set
一下username看看能不能改变BEAN实例的内容(答案应该是否定的).
原文:
spring 后置处理器BeanFactoryPostProcessor和BeanPostProcessor的用法和区别
spring 后置处理器BeanFactoryPostProcessor和BeanPostProcessor的用法和区别的更多相关文章
- Spring 后置处理器【1】
Spring 后置处理器[1] 简单介绍 一句话:bean 在初始化前或初始化后的瞬间,我自己添加一些业务逻辑 bean 后置处理器类的内容 简单代码 package com.hspedu.sprin ...
- spring的组件工厂后置处理器——BeanFactoryPostProcessor
作用和调用时机 spring有两种后置处理器: 1. 组件后置处理器——org.springframework.beans.factory.config.BeanPostProcessor: 2. 工 ...
- spring后置处理器BeanPostProcessor
BeanPostProcessor的作用是在调用初始化方法的前后添加一些逻辑,这里初始化方法是指在配置文件中配置init-method,或者实现了InitializingBean接口的afterPro ...
- Spring 后置处理器 PropertyPlaceholderConfigurer 类(引用外部文件)
一.PropertyPlaceholderConfigurer类的作用 PropertyPlaceholderConfigurer 是 BeanFactory 后置处理器的实现,也是 BeanFact ...
- Spring的后置处理器BeanFactoryPostProcessor
新建一个JavaBean UserBeanFactoryPostProcessor 实现了BeanFactoryPostProcessor接口 Spring配置文件如下: 编写测试用例 从结果可以看出 ...
- Spring点滴五:Spring中的后置处理器BeanPostProcessor讲解
BeanPostProcessor接口作用: 如果我们想在Spring容器中完成bean实例化.配置以及其他初始化方法前后要添加一些自己逻辑处理.我们需要定义一个或多个BeanPostProcesso ...
- spring学习四:Spring中的后置处理器BeanPostProcessor
BeanPostProcessor接口作用: 如果我们想在Spring容器中完成bean实例化.配置以及其他初始化方法前后要添加一些自己逻辑处理.我们需要定义一个或多个BeanPostProcesso ...
- Spring源码之BeanFactoryPostProcessor(后置处理器)
Spring源码之BeanFactoryPostProcessor(后置处理器). 有点水平的Spring开发人员想必都知道BeanFactoryPostProcessor也就是常说的后置管理器,这是 ...
- Spring Ioc源码分析系列--Ioc容器BeanFactoryPostProcessor后置处理器分析
Spring Ioc源码分析系列--Ioc容器BeanFactoryPostProcessor后置处理器分析 前言 上一篇文章Spring Ioc源码分析系列--Ioc源码入口分析已经介绍到Ioc容器 ...
随机推荐
- 查找Linux系统中的占用磁盘空间
目录的来查看空间占用情况 du -sh /* 先看看根目录下面 让文件夹下的文件让文件按大小排序 方法一:# ls -lhSl 长格式显示,h human readable模式,大小单位为M,G等易读 ...
- [bzoj4552][Tjoi2016][Heoi2016]排序
Description 给出一个$1$到$n$的全排列,现在对这个全排列序列进行$m$次局部排序,排序分为$2$种: $1.(0,l,r)$表示将区间$[l,r]$的数字升序排序; $2.(1,l,r ...
- oracle merge into 的例子
内容来自 oracle 11g 实用教程 郑阿奇等编 在 oracle 11g中有merge语句,用于根据与原表连接的结果,对目标表执行插入,更新,或者删除操作.例如,根据在一个表中找到的差异在另一个 ...
- PowerDesigner中Table视图同时显示Code和Name
如题,实现如下的效果: 解决方法: 1.Tools-Display Preference 然后选中Code移到最上面
- TYVJ1427 小白逛公园
时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个 ...
- Hash Length Extension Attacks
catalogue . Hash函数的内部原理 . 漏洞原理 1. Hash函数的内部原理 0x1: 分组.Padding 哈希函数以区块为单位操作数据.比如说,MD5, SHA1, SHA256的区 ...
- Guava的异常工具类--Throwables
Guava为我们提供了一个非常方便并且实用的异常处理工具类:Throwables类. 这个类的API可以参见:http://docs.guava-libraries.googlecode.com/gi ...
- ( 译、持续更新 ) JavaScript 上分小技巧(二)
考虑到文章过长,不便于阅读,这里分出第二篇,如有后续,每15个知识点分为一篇... 第一篇地址:( 译.持续更新 ) JavaScript 上分小技巧(一) 第三篇地址:( 译.持续更新 ) Java ...
- Java 代码性能优化总结
前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用, ...
- LAMP-五分钟搭建个人论坛
LAMP-五分钟搭建个人论坛 系统版本:CentOS7 1.##安装lamp及依赖软件wget http://repo.mysql.com/mysql-community-release-el7-5. ...