Spring中Bean的后置处理器
以下内容引用自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的后置处理器相关推荐
- SringIOC中Bean的后置处理器
Bean后置处理器 Spring提供的特殊的Bean 1. Bean后置处理器允许在调用初始化方法 即:bean节点init-method属性对应的方法的前后,对Bean进行额外的处理. 2.Bean ...
- Spring(二)--FactoryBean、bean的后置处理器、数据库连接池、引用外部文件、使用注解配置bean等...
实验1:配置通过静态工厂方法创建的bean [通过静态方法提供实例对象,工厂类本身不需要实例化!] 1.创建静态工厂类 public class StaticFactory {private sta ...
- Spring 详解Bean的后置处理器
Bean的后置处理器详解: Spring当中的后置处理器是Spring体用的一个扩展点,开发者只要去实现,Spring当中的BeanPostProcessor接口,那么就能插手SpringBean实例 ...
- 实验10:创建带有生命周期方法的bean ||实验11:测试bean的后置处理器
实验10:创建带有生命周期方法的bean 实验11:测试bean的后置处理器 MyBeanPostProcessor.java package com.atguigu.bean;import org. ...
- 通过Spring的BeanPostProcessor的 bean的后置处理器会拦截所有bean创建过程
postProcessBeforeInitialization 在init方法之前调用 postProcessAfterInitialization 在init方法之后调用 package com.C ...
- AbstractAutowireCapableBeanFactory 类对容器生成的Bean 添加后置处理器
BeanPostProcessor 后置处理器的调用发生在Spring IOC 容器完成对Bean 实例对象的创建和属性的依赖注入完成之后,在对Spring 依赖注入的源码分析过程中我们知道,当应用程 ...
- Spring Bean 后置处理器PostProcessor
BeanPostProcessor 接口定义回调方法,可以实现该方法来提供自己的实例化逻辑,依赖解析逻辑等.可以在 Spring 容器通过插入一个或多个 BeanPostProcessor 的实现来完 ...
- Spring Bean 后置处理器
转载自 Spring Bean 后置处理器 Spring--Bean 后置处理器 BeanPostProcessor 接口定义回调方法,你可以实现该方法来提供自己的实例化逻辑,依赖解析逻辑等.你也可 ...
- 【Spring注解系列11】Spring后置处理器BeanPostProcessor用法与原理
1.BeanPostProcessor原理 先说,bean的后置处理器BeanPostProcessor接口中两个方法: postProcessBeforeInitialization:在初始化之前工 ...
最新文章
- centos6.5mysql cluster 7.4.11_完美起航-MySQLMHA高可用集群部署及故障切换(图文详解)...
- python课程设计总结1000-编程小白学习python总结文章(一)
- asp.NET自定义服务器控件内部细节系列教程五
- 机器学习知识点(五)梯度下降法Java实现
- Linux kernel 3.10内核源码分析--slab原理及相关代码
- 关于eclipse环境启动不成功的问题解决方法
- Minecraft InputFix
- 编程之美读书笔记1.3 —— 一摞烙饼的排序
- 微信开发之微信公众平台基本配置--服务器token验证(Java实现)
- 国产CAM究竟水平如何?看完测试我震惊了
- 微信小程序云开发教程-云数据库
- 关于纸张尺寸和照片尺寸
- 剩余寿命与年龄的极限分布
- vue 图片画框获取坐标
- 计算机应用程序无响应,电脑的程序未响应是什么原因
- VB.NET创建/修复/压缩/备份/恢复ACCESS数据库
- 什么是面向对象?谈谈你对面向对象的理解
- android auto谷歌地图,如何在 Android Auto 中使用 Waze 而不是谷歌地图
- 动画演示15年来编程语言的起起伏伏
- mysql查询发生变化的股价_最近半年股价涨跌统计
热门文章
- 【编程5】斐波那契数列 + 递归+LeetCode50
- java h5在线音频_[语音技术]java+H5的录音类实例(1)
- 神策 FM | CEO 荐书—《斯坦福商业决策课》
- 红杉中国合伙人刘星:新零售新在哪里?
- http://www.myeclipseide.com/ 官网打不开的问题(转)
- 盛大游戏回归A股进入倒计时:估值近300亿 腾讯年初曾入股
- lwip1.4.1需要的文件
- solaris下常见文件压缩/解压方式简单小结—待续中
- linux检测远程端口是否打开
- oracle 11g如何完全卸载