[译]10-Spring BeanPostProcessor
Spring框架提供了BeanPostProcessor接口,该接口暴露了两个方法postProcessBeforeInitialization(Object bean,String beanName)
和postProcessAfterInitialization(Object bean,String beanName).其中第一参数是经过实例化的bean实例,第二个参数是该bean在
spring IOC容器中的唯一标识.
通过实现BeanPostProcessor接口的postProcessBeforeInitialization和postProcessAfterInitialization方法,我们可以做很多有意义的
事情.postProcessBeforeInitialization方法的调用时机是在bean实例化并装配完毕之后,在调用初始化方法之前;而第二方法调用的时机
是在初始化方法调用之后.为了便于理解,我画了一张图:
通过上图可知,我们可以定义多个BeanPostProcessor接口的实现类,多个实现类直接以责任链的方式依次执行.
一般情况下BeanPostProcessor的实现类还会实现org.springframework.core.Ordered接口,Ordered接口的定义了getOrder方法,该方
法的返回值代表该BeanPostProcessor实现类的执行时机(数字越小,越先执行)
我们下面写一段例子程序,以上图为原本.程序中会定义三个BeanPostProcessor,三个的作用如下:
红色:LogRecorder,记录日志
蓝色:TimeRecoder,记录执行时间记录
紫色:PermissionCheck,权限检查
1.新建com.tutorialspoint.post_processor包,并在包中新建HelloWorld.java类,类的内容如下:
package com.tutorialspoint.post_processor;public class HelloWorld {public HelloWorld(){System.out.println("constructor invoked ... ");}private String message;public void setMessage(String message){System.out.println("set method invoked ... ");this.message = message;}public void getMessage(){System.out.println("Your Message : " + message);}public void init(){System.out.println("init method invoked ... ");}public void destroy(){System.out.println("destroy method invoked ... ");} }
2.在包com.tutorialspoint.post_processor中新建上述三个BeanPostProcessor的实现类,三个类的内容分别如下:
LogRecorder.java
package com.tutorialspoint.post_processor;import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.core.Ordered;public class LogRecorder implements BeanPostProcessor,Ordered {@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName)throws BeansException {//初始化方法调用之后会回调该方法,在这里可以根据实际需求进行编码。System.out.println("Log Info:"+beanName+" has been initailized");return bean;}@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName)throws BeansException {//初始化方法调用之前调用该方法.System.out.println("Log Info:"+beanName+" is going to be initailized");return bean;}//实现该方法用于指明该BeanPostProcessor的执行时机 @Overridepublic int getOrder() {return 1;}}
TimeRecoder.java
package com.tutorialspoint.post_processor;import java.util.Date;import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.core.Ordered;public class TimeRecoder implements BeanPostProcessor,Ordered{@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName)throws BeansException {System.out.println(beanName+" has been initilized,time now is "+new Date());return bean;}@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName)throws BeansException {System.out.println(beanName+" is going to be initilized,time now is "+new Date());return bean;}@Overridepublic int getOrder() {return 2;}}
PermissionCheck.java
package com.tutorialspoint.post_processor;import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.core.Ordered;public class PermissionCheck implements BeanPostProcessor,Ordered {@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName)throws BeansException {System.out.println(beanName+" has been initailized,permissions checked... ");return bean;}@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName)throws BeansException {System.out.println(beanName+" is going to be initailized,begin to check permissions ... ");return bean;}@Overridepublic int getOrder() {return 3;}}
3.在src目录下新建post_processor.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-3.0.xsd"><bean id="helloWorld" class="com.tutorialspoint.post_processor.HelloWorld" destroy-method="destroy"init-method="init"><property name="message" value="Hello World!"></property></bean><!-- spring容器会检测到实现了BeanPostProcessor接口的bean,并在适当的时机调用适当的方法 --><bean name="logRecorder" class="com.tutorialspoint.post_processor.LogRecorder"></bean><bean name="timeRecoder" class="com.tutorialspoint.post_processor.TimeRecoder"></bean><bean name="permissionCheck" class="com.tutorialspoint.post_processor.PermissionCheck"></bean></beans>
4.在com.tutorialspoint.post_processor包中新建MainApp.java,内容如下:
package com.tutorialspoint.post_processor;import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainApp {public static void main(String[] args) {AbstractApplicationContext ctx = new ClassPathXmlApplicationContext("post_processor.xml");HelloWorld hw = (HelloWorld)ctx.getBean("helloWorld");hw.getMessage();ctx.registerShutdownHook();} }
5.运行程序,检查结果:
仔细分析运行结果,跟我们预期是一致的!
转载于:https://www.cnblogs.com/sysman/p/4479358.html
[译]10-Spring BeanPostProcessor相关推荐
- 【译】Spring官方教程:使用STS的入门指南
原文:Working a Getting Started guide with STS 译者:hanbin 校对:Mr.lzc 这个指南引导您使用 Spring Tool Suite (STS) 去构 ...
- 译 10 个 Flutter 组件推荐 – 4
译 10 个 Flutter 组件推荐 – 4 原文 https://tomicriedel.medium.com/10-flutter-tips-season-2-part-2-10-4914084 ...
- 10.Spring面试题
Spring面试题 Spring面试题 1.不同版本的Spring Framework有哪些主要功能? 2.什么是Spring Framework? 3.列举Spring Framework的优点. ...
- 【译】Spring 官方教程:Spring Security 架构
原文:Spring Security Architecture 译者:徐靖峰 校对:马超君 专题指南 本文是 Spring Security 的入门指南,并对 Spring Security 的框架设 ...
- spring BeanPostProcessor,BeanFactoryPostProcessor作用
一.BeanPostProcessor 主要用来对已经实例化的BEAN进行再次处理和修改,返回新定义的对象. 1.例如当CONTROLLER使用@RESOURCE注入SERVICE对象时,SPRING ...
- Spring BeanPostProcessor接口详细使用
BeanPostProcessor接口简介 BeanPostProcessor也称为Bean后置处理器,它是Spring中定义的接口,在Spring容器的创建过程中(具体为Bean初始化前后)会回调B ...
- hibernate mysql 注解_【译】Spring 4 + Hibernate 4 + Mysql + Maven集成例子(注解 + XML)
前言 本文将基于注解配置, 集成Spring 4和Hibernate 4,开发一个增删改查应用,涉及以下内容: 创建Hibernate实体 保存数据到mysql数据库中 在事务transaction内 ...
- Spring Boot配置属性(567个,丁雪峰 译 《Spring Boot 实战》 附录)
flyway flyway.baseline 执行基线时标记已有Schema的描述 flyway.baseline-on-migrate 在没有元数据表的情况下,针对非空 Schema执行迁移时是否自 ...
- 【译】Spring Boot Features
[更新中]本文大部分内容翻译自官方文档https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/html/spring-boot- ...
- 【spring boot】10.spring boot下的单元测试
spring boot下的单元测试,思前想后还是需要单独用一章篇幅来看看. 然后在看了介绍和使用时候,我感觉并不想多去看了. 但是还是给后来人留下参考的路径: 官网说明:https://spring. ...
最新文章
- 自动装配——@Autowired 构造器,参数,方法,属性都是从容器中获取参数组件的值||自定义组件想要使用Spring容器底层的一些组件 ApplicationContext,BeanFactory
- 【STSRM13】绵津见
- 5. extjs 中buttonAlign什么意思
- Java静态内部类、匿名内部类、成员式内部类和局部内部类
- Android零基础入门第24节:自定义View简单使用
- 动态规划算法-01爬楼梯问题
- FastReport.Net 使用字符串
- php传递字符串给python,用PHP和Python生成短链接服务的字符串ID
- 如何调节电脑显示屏来保护双眼的小技巧
- android 显示文章内容,在Android中,RecyclerView在重新创建后没有显示任何内容
- samba - 为 UNIX 实现的 Windows SMB/CIFS 文件服务器
- python图形编程环境环境_Python开发环境Wing IDE matplotlib 2D绘图库代码调试技巧小结...
- PCB设计敷铜时的天线效应
- docker以外的构建、运行、管理和分发容器候选项
- 龙芯CPU处理器和芯片资料介绍
- 学计算机怎能不知道电脑配置
- 日常渗透刷洞的一些小工具
- Android自定义控件 芝麻信用分雷达图
- Python正则(粗略)
- laravel框架图片无法显示问题