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容器 ...
随机推荐
- mysql字段冲突报错
check the manual that corresponds to your MySQL server version for the right syntax to use near 出现这个 ...
- 2.Android 自定义通用的Item布局
转载:http://www.jianshu.com/p/e7ba4884dcdd BaseItemLayout 简介 在工作中经常会遇到下面的一些布局,如图标红处: 05.png 07.png 08. ...
- 76.Android之EventBus源码解析
转载:http://p.codekk.com/blogs/detail/54cfab086c4761e5001b2538 1. 功能介绍 1.1 EventBus EventBus 是一个 Andro ...
- Leetcode 160. Intersection of two linked lists
Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...
- 在打开vs解决方案时,怎样让所以打开的项目自动折叠
使用VS 2010中的扩展性,搜PowerCommands,PowerCommands扩展在Visual Studio 2010中添加了数十个有用的的命令, Collapse Projects(折叠项 ...
- Android成长日记-ListView
数据适配器:把复杂的数据(数组,链表,数据库,集合等)填充在指定的视图界面上 适配器的类型: ① ArrayAdapter(数组适配器):用于绑定格式单一的数据 数据源:可以是集合或数组 ① Simp ...
- Scala: 包对象
包对象最重要的用途是兼容旧的类库,或者为某些数据类型提供增强版本:一般我们可以将其作为扩展工具方法或数据来使用
- C++ 参考网站
Reference Web cites for the C++ standard library cppreference cplusplus sgi IBM MSDN isocpp More res ...
- HDU 5816 Hearthstone
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Problem Descript ...
- Python脚本运行出现语法错误:IndentationError: unindent does not match any outer indentation level
运行环境是win7 x64 sublime text2,百度发现是对齐问题. 具体来说是由于有的地方使用了4个空格,有的地方使用了tab键. 代码区直接全选就会看到有的地方是四个点有个地方是一个横线, ...