以下内容引用自http://wiki.jikexueyuan.com/project/spring/bean-post-processors.html:

Bean后置处理器

BeanPostProcessor接口定义回调方法,你可以实现该方法来提供自己的实例化逻辑,依赖解析逻辑等。你也可以在Spring容器通过插入一个或多个BeanPostProcessor的实现来完成实例化,配置和初始化一个bean之后实现一些自定义逻辑回调方法。

你可以配置多个BeanPostProcessor接口,通过设置BeanPostProcessor实现的Ordered接口提供的order属性来控制这些BeanPostProcessor接口的执行顺序。

BeanPostProcessor可以对bean(或对象)实例进行操作,这意味着Spring IoC容器实例化一个bean实例,然后BeanPostProcessor接口进行它们的工作。

ApplicationContext会自动检测由BeanPostProcessor接口的实现定义的bean,注册这些bean为后置处理器,然后通过在容器中创建bean,在适当的时候调用它。

例子:

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.jsoft.testspring</groupId><artifactId>testbeanpostprocessor</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>testbeanpostprocessor</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><!-- Spring Core --><!-- http://mvnrepository.com/artifact/org.springframework/spring-core --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.1.4.RELEASE</version></dependency><!-- Spring Context --><!-- http://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.1.4.RELEASE</version></dependency></dependencies>
</project>

HelloWorld.java:

package com.jsoft.testspring.testbeanpostprocessor;public class HelloWorld {private String messageString;public void setMessage(String message){this.messageString = message;}public void getMessage(){System.out.println(this.messageString);}public void initCustom(){System.out.println("初始化");}public void destroyCustom(){System.out.println("销毁");}}

InitHelloWorld.java:

package com.jsoft.testspring.testbeanpostprocessor;import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;public class InitHelloWorld implements BeanPostProcessor {public Object postProcessAfterInitialization(Object arg0, String arg1)throws BeansException {// TODO Auto-generated method stubSystem.out.println("After HelloWorld");return arg0;}public Object postProcessBeforeInitialization(Object arg0, String arg1)throws BeansException {// TODO Auto-generated method stubSystem.out.println("Before HelloWorld");return arg0;}}

这是实现BeanPostProcessor非常简单的例子,它在任何bean的初始化的之前和之后输入该bean的名称。你可以在初始化bean的之前和之后实现更复杂的逻辑,因为你有两个访问内置bean对象的后置处理程序的方法。

beans.xml:

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="helloWorld" class="com.jsoft.testspring.testbeanpostprocessor.HelloWorld" init-method="initCustom" destroy-method="destroyCustom"><property name="Message" value="Hello World!"></property></bean>    <bean class="com.jsoft.testspring.testbeanpostprocessor.InitHelloWorld"></bean></beans>

App.java:

package com.jsoft.testspring.testbeanpostprocessor;import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** Hello world!**/
public class App
{public static void main( String[] args ){AbstractApplicationContext abstractApplicationContext = new ClassPathXmlApplicationContext("beans.xml");HelloWorld helloWorld = (HelloWorld)abstractApplicationContext.getBean("helloWorld");helloWorld.getMessage();abstractApplicationContext.registerShutdownHook();}
}

在这里,你需要注册一个在AbstractApplicationContext类中声明的关闭hook的registerShutdownHook()方法。它将确保正常关闭,并且调用相关的destroy方法。

测试结果:

总结:

InitHelloWorld类集成自BeanPostProcessor,然后在bean中指定class为InitHelloWorld即可,这里分开写主要是为了展示两个方法的效果,当然这个类的两个方法可以直接写在HelloWorld中,直接在HelloWorld类中集成BeanPostProcessor,然后去实现两个方法。

测试工程:https://github.com/easonjim/5_java_example/tree/master/springtest/test6/testbeanpostprocessor

Spring中Bean的后置处理器相关推荐

  1. SringIOC中Bean的后置处理器

    Bean后置处理器 Spring提供的特殊的Bean 1. Bean后置处理器允许在调用初始化方法 即:bean节点init-method属性对应的方法的前后,对Bean进行额外的处理. 2.Bean ...

  2. Spring(二)--FactoryBean、bean的后置处理器、数据库连接池、引用外部文件、使用注解配置bean等...

    实验1:配置通过静态工厂方法创建的bean  [通过静态方法提供实例对象,工厂类本身不需要实例化!] 1.创建静态工厂类 public class StaticFactory {private sta ...

  3. Spring 详解Bean的后置处理器

    Bean的后置处理器详解: Spring当中的后置处理器是Spring体用的一个扩展点,开发者只要去实现,Spring当中的BeanPostProcessor接口,那么就能插手SpringBean实例 ...

  4. 实验10:创建带有生命周期方法的bean ||实验11:测试bean的后置处理器

    实验10:创建带有生命周期方法的bean 实验11:测试bean的后置处理器 MyBeanPostProcessor.java package com.atguigu.bean;import org. ...

  5. 通过Spring的BeanPostProcessor的 bean的后置处理器会拦截所有bean创建过程

    postProcessBeforeInitialization 在init方法之前调用 postProcessAfterInitialization 在init方法之后调用 package com.C ...

  6. AbstractAutowireCapableBeanFactory 类对容器生成的Bean 添加后置处理器

    BeanPostProcessor 后置处理器的调用发生在Spring IOC 容器完成对Bean 实例对象的创建和属性的依赖注入完成之后,在对Spring 依赖注入的源码分析过程中我们知道,当应用程 ...

  7. Spring Bean 后置处理器PostProcessor

    BeanPostProcessor 接口定义回调方法,可以实现该方法来提供自己的实例化逻辑,依赖解析逻辑等.可以在 Spring 容器通过插入一个或多个 BeanPostProcessor 的实现来完 ...

  8. Spring Bean 后置处理器

    转载自  Spring Bean 后置处理器 Spring--Bean 后置处理器 BeanPostProcessor 接口定义回调方法,你可以实现该方法来提供自己的实例化逻辑,依赖解析逻辑等.你也可 ...

  9. 【Spring注解系列11】Spring后置处理器BeanPostProcessor用法与原理

    1.BeanPostProcessor原理 先说,bean的后置处理器BeanPostProcessor接口中两个方法: postProcessBeforeInitialization:在初始化之前工 ...

最新文章

  1. centos6.5mysql cluster 7.4.11_完美起航-MySQLMHA高可用集群部署及故障切换(图文详解)...
  2. python课程设计总结1000-编程小白学习python总结文章(一)
  3. asp.NET自定义服务器控件内部细节系列教程五
  4. 机器学习知识点(五)梯度下降法Java实现
  5. Linux kernel 3.10内核源码分析--slab原理及相关代码
  6. 关于eclipse环境启动不成功的问题解决方法
  7. Minecraft InputFix
  8. 编程之美读书笔记1.3 —— 一摞烙饼的排序
  9. 微信开发之微信公众平台基本配置--服务器token验证(Java实现)
  10. 国产CAM究竟水平如何?看完测试我震惊了
  11. 微信小程序云开发教程-云数据库
  12. 关于纸张尺寸和照片尺寸
  13. 剩余寿命与年龄的极限分布
  14. vue 图片画框获取坐标
  15. 计算机应用程序无响应,电脑的程序未响应是什么原因
  16. VB.NET创建/修复/压缩/备份/恢复ACCESS数据库
  17. 什么是面向对象?谈谈你对面向对象的理解
  18. android auto谷歌地图,如何在 Android Auto 中使用 Waze 而不是谷歌地图
  19. 动画演示15年来编程语言的起起伏伏
  20. mysql查询发生变化的股价_最近半年股价涨跌统计

热门文章

  1. 【编程5】斐波那契数列 + 递归+LeetCode50
  2. java h5在线音频_[语音技术]java+H5的录音类实例(1)
  3. 神策 FM | CEO 荐书—《斯坦福商业决策课》
  4. 红杉中国合伙人刘星:新零售新在哪里?
  5. http://www.myeclipseide.com/ 官网打不开的问题(转)
  6. 盛大游戏回归A股进入倒计时:估值近300亿 腾讯年初曾入股
  7. lwip1.4.1需要的文件
  8. solaris下常见文件压缩/解压方式简单小结—待续中
  9. linux检测远程端口是否打开
  10. oracle 11g如何完全卸载