主要区别就是: BeanFactoryPostProcessor可以修改BEAN的配置信息而BeanPostProcessor不能,下面举个例子说明

BEAN类:

  1. package com.springdemo.postProcessor;
  2. public class PostProcessorBean {
  3. private String username;
  4. private String password;
  5. public String getPassword() {
  6. return password;
  7. }
  8. public void setPassword(String password) {
  9. this.password = password;
  10. }
  11. public String getUsername() {
  12. return username;
  13. }
  14. public void setUsername(String username) {
  15. this.username = username;
  16. }
  17. }

MyBeanPostProcessor类,实现了BeanPostProcessor接口:

  1. package com.springdemo.postProcessor;
  2. import org.springframework.beans.BeansException;
  3. import org.springframework.beans.factory.config.BeanPostProcessor;
  4. import com.springdemo.form.LoginForm;
  5. public class MyBeanPostProcessor implements BeanPostProcessor {
  6. public Object postProcessAfterInitialization(Object bean, String beanName)
  7. throws BeansException {
  8. // TODO Auto-generated method stub
  9. //如果是PostProcessorBean则username信息
  10. if(bean instanceof PostProcessorBean)
  11. {
  12. System.out.println("PostProcessorBean Bean initialized");
  13. PostProcessorBean pb = (PostProcessorBean)bean;
  14. System.out.println("username:"+pb.getUsername());
  15. }
  16. return bean;
  17. }
  18. public Object postProcessBeforeInitialization(Object bean, String beanName)
  19. throws BeansException {
  20. // TODO Auto-generated method stub
  21. if(bean instanceof PostProcessorBean)
  22. {
  23. System.out.println("PostProcessorBean Bean initializing");
  24. PostProcessorBean pb = (PostProcessorBean)bean;
  25. System.out.println("username:"+pb.getUsername());
  26. }
  27. return bean;
  28. }
  29. }

MyBeanFactoryPostProcessor实现了BeanFactoryPostProcessor接口:

  1. package com.springdemo.postProcessor;
  2. import org.springframework.beans.BeansException;
  3. import org.springframework.beans.MutablePropertyValues;
  4. import org.springframework.beans.factory.config.BeanDefinition;
  5. import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
  6. import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
  7. public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
  8. public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
  9. throws BeansException {
  10. // TODO Auto-generated method stub
  11. //BeanFactoryPostProcessor可以修改BEAN的配置信息而BeanPostProcessor不能
  12. //我们在这里修改postProcessorBean的username注入属性
  13. BeanDefinition bd = beanFactory.getBeanDefinition("postProcessorBean");
  14. MutablePropertyValues pv =  bd.getPropertyValues();
  15. if(pv.contains("username"))
  16. {
  17. pv.addPropertyValue("username", "xiaojun");
  18. }
  19. }
  20. }

编写测试用例:

  1. package com.springdemo.test;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. import com.springdemo.factory.ApplicationContextFactory;
  5. import com.springdemo.postProcessor.PostProcessorBean;
  6. import junit.framework.TestCase;
  7. public class BeanPostPorcessorTest extends TestCase {
  8. private ApplicationContext context;
  9. protected void setUp() throws Exception {
  10. super.setUp();
  11. String[] paths = {"classpath*:/spring/applicationContext-*.xml"};
  12. context = new ClassPathXmlApplicationContext(paths);
  13. }
  14. protected void tearDown() throws Exception {
  15. super.tearDown();
  16. }
  17. public void testBeanPostProcessor()
  18. {
  19. }
  20. public void testBeanFactoryPostProcessor()
  21. {
  22. //PostProcessorBean bean =(PostProcessorBean)ServiceLocator.getService("postProcessorBean");
  23. PostProcessorBean bean =(PostProcessorBean)context.getBean("postProcessorBean");
  24. System.out.println("---------------testBeanFactoryPostProcessor----------------");
  25. System.out.println("username:"+bean.getUsername());
  26. System.out.println("password:"+bean.getPassword());
  27. //
  28. }
  29. }

spring配置文件如下(先不启用MyBeanFactoryPostProcessor):

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
  5. <bean class="com.springdemo.postProcessor.MyBeanPostProcessor"></bean>
  6. <!--我们先把BeanFactoryPostProcessor注释掉,不启用,然后查看测试输出结果
  7. <bean class="com.springdemo.postProcessor.MyBeanFactoryPostProcessor"></bean>
  8. -->
  9. <bean id="postProcessorBean" class="com.springdemo.postProcessor.PostProcessorBean" >
  10. <property name="username" value="test"></property>
  11. <property name="password" value="test"></property>
  12. </bean>
  13. </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的用法和区别的更多相关文章

  1. Spring 后置处理器【1】

    Spring 后置处理器[1] 简单介绍 一句话:bean 在初始化前或初始化后的瞬间,我自己添加一些业务逻辑 bean 后置处理器类的内容 简单代码 package com.hspedu.sprin ...

  2. spring的组件工厂后置处理器——BeanFactoryPostProcessor

    作用和调用时机 spring有两种后置处理器: 1. 组件后置处理器——org.springframework.beans.factory.config.BeanPostProcessor: 2. 工 ...

  3. spring后置处理器BeanPostProcessor

    BeanPostProcessor的作用是在调用初始化方法的前后添加一些逻辑,这里初始化方法是指在配置文件中配置init-method,或者实现了InitializingBean接口的afterPro ...

  4. Spring 后置处理器 PropertyPlaceholderConfigurer 类(引用外部文件)

    一.PropertyPlaceholderConfigurer类的作用 PropertyPlaceholderConfigurer 是 BeanFactory 后置处理器的实现,也是 BeanFact ...

  5. Spring的后置处理器BeanFactoryPostProcessor

    新建一个JavaBean UserBeanFactoryPostProcessor 实现了BeanFactoryPostProcessor接口 Spring配置文件如下: 编写测试用例 从结果可以看出 ...

  6. Spring点滴五:Spring中的后置处理器BeanPostProcessor讲解

    BeanPostProcessor接口作用: 如果我们想在Spring容器中完成bean实例化.配置以及其他初始化方法前后要添加一些自己逻辑处理.我们需要定义一个或多个BeanPostProcesso ...

  7. spring学习四:Spring中的后置处理器BeanPostProcessor

    BeanPostProcessor接口作用: 如果我们想在Spring容器中完成bean实例化.配置以及其他初始化方法前后要添加一些自己逻辑处理.我们需要定义一个或多个BeanPostProcesso ...

  8. Spring源码之BeanFactoryPostProcessor(后置处理器)

    Spring源码之BeanFactoryPostProcessor(后置处理器). 有点水平的Spring开发人员想必都知道BeanFactoryPostProcessor也就是常说的后置管理器,这是 ...

  9. Spring Ioc源码分析系列--Ioc容器BeanFactoryPostProcessor后置处理器分析

    Spring Ioc源码分析系列--Ioc容器BeanFactoryPostProcessor后置处理器分析 前言 上一篇文章Spring Ioc源码分析系列--Ioc源码入口分析已经介绍到Ioc容器 ...

随机推荐

  1. linux(本机)配置域名

    hosts是一个没有扩展名的系统文件, 其作用就是将主机名映射到对应的ip地址. 当用户执行一条ping命令时(如ping www.abc.com),系统会首先自动从hosts文件中寻找www.abc ...

  2. 洛谷P1168 中位数

    题目描述 给出一个长度为N的非负整数序列A[i],对于所有1 ≤ k ≤ (N + 1) / 2,输出A[1], A[2], …, A[2k - 1]的中位数.[color=red]即[/color] ...

  3. POJ 2457 Part Acquisition

    第一反应是BFS,比较直观,但是输出路径写的不是很熟练,此外,习惯不好,“==”写成了“=”,所以常量一定放前面! #include <cstdio> #include <queue ...

  4. .net图片验证码生成、点击刷新及验证输入是否正确

    ①创建ValidateCode.aspx,在ValidateCode.aspx.cs中加入如下代码.生成验证码图片,在页面上输出,输出jpeg格式. protected void Page_Load( ...

  5. 第六次作业——利用MFC实现计算器图形界面以及简单四则运算表达式批处理

    参考资料:      1.MFC响应键盘      2.计算器实例      3.MFC文件对话框      4.MFCUpdateData()函数的使用      5.MFC教程      6.wi ...

  6. linux 下各文件夹的功能性介绍。(转载)

    原文来自:http://www.cnblogs.com/wen858636827/archive/2012/12/26/2834373.html /opt   放置用户自己下载的软件  英文全称是op ...

  7. [USACO2009 NOV GOLD]奶牛的图片

    校内题,不给传送门了. 以前做完NOIp2013的火柴排队那道题后,当时很担心NOIp会出那种题,因为贪心的规则能不能看出来真的要看运气.但是这类题做多了后发现其实那道题的规则其实是很多题都已经用到了 ...

  8. JavaWeb---总结(六)Servlet开发(一)

    一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向 ...

  9. angular评论星级指令

    地址: https://github.com/happen-zh/myStar 支持最大数,是否必填,回调,是否只读

  10. 最短路径(Floyd)算法

    #include <stdio.h>#include <stdlib.h>/* Floyd算法 */#define VNUM 5#define MV 65536int P[VN ...