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相关推荐

  1. 【译】Spring官方教程:使用STS的入门指南

    原文:Working a Getting Started guide with STS 译者:hanbin 校对:Mr.lzc 这个指南引导您使用 Spring Tool Suite (STS) 去构 ...

  2. 译 10 个 Flutter 组件推荐 – 4

    译 10 个 Flutter 组件推荐 – 4 原文 https://tomicriedel.medium.com/10-flutter-tips-season-2-part-2-10-4914084 ...

  3. 10.Spring面试题

    Spring面试题 Spring面试题 1.不同版本的Spring Framework有哪些主要功能? 2.什么是Spring Framework? 3.列举Spring Framework的优点. ...

  4. 【译】Spring 官方教程:Spring Security 架构

    原文:Spring Security Architecture 译者:徐靖峰 校对:马超君 专题指南 本文是 Spring Security 的入门指南,并对 Spring Security 的框架设 ...

  5. spring BeanPostProcessor,BeanFactoryPostProcessor作用

    一.BeanPostProcessor 主要用来对已经实例化的BEAN进行再次处理和修改,返回新定义的对象. 1.例如当CONTROLLER使用@RESOURCE注入SERVICE对象时,SPRING ...

  6. Spring BeanPostProcessor接口详细使用

    BeanPostProcessor接口简介 BeanPostProcessor也称为Bean后置处理器,它是Spring中定义的接口,在Spring容器的创建过程中(具体为Bean初始化前后)会回调B ...

  7. hibernate mysql 注解_【译】Spring 4 + Hibernate 4 + Mysql + Maven集成例子(注解 + XML)

    前言 本文将基于注解配置, 集成Spring 4和Hibernate 4,开发一个增删改查应用,涉及以下内容: 创建Hibernate实体 保存数据到mysql数据库中 在事务transaction内 ...

  8. Spring Boot配置属性(567个,丁雪峰 译 《Spring Boot 实战》 附录)

    flyway flyway.baseline 执行基线时标记已有Schema的描述 flyway.baseline-on-migrate 在没有元数据表的情况下,针对非空 Schema执行迁移时是否自 ...

  9. 【译】Spring Boot Features

    [更新中]本文大部分内容翻译自官方文档https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/reference/html/spring-boot- ...

  10. 【spring boot】10.spring boot下的单元测试

    spring boot下的单元测试,思前想后还是需要单独用一章篇幅来看看. 然后在看了介绍和使用时候,我感觉并不想多去看了. 但是还是给后来人留下参考的路径: 官网说明:https://spring. ...

最新文章

  1. 自动装配——@Autowired 构造器,参数,方法,属性都是从容器中获取参数组件的值||自定义组件想要使用Spring容器底层的一些组件 ApplicationContext,BeanFactory
  2. 【STSRM13】绵津见
  3. 5. extjs 中buttonAlign什么意思
  4. Java静态内部类、匿名内部类、成员式内部类和局部内部类
  5. Android零基础入门第24节:自定义View简单使用
  6. 动态规划算法-01爬楼梯问题
  7. FastReport.Net 使用字符串
  8. php传递字符串给python,用PHP和Python生成短链接服务的字符串ID
  9. 如何调节电脑显示屏来保护双眼的小技巧
  10. android 显示文章内容,在Android中,RecyclerView在重新创建后没有显示任何内容
  11. samba - 为 UNIX 实现的 Windows SMB/CIFS 文件服务器
  12. python图形编程环境环境_Python开发环境Wing IDE matplotlib 2D绘图库代码调试技巧小结...
  13. PCB设计敷铜时的天线效应
  14. docker以外的构建、运行、管理和分发容器候选项
  15. 龙芯CPU处理器和芯片资料介绍
  16. 学计算机怎能不知道电脑配置
  17. 日常渗透刷洞的一些小工具
  18. Android自定义控件 芝麻信用分雷达图
  19. Python正则(粗略)
  20. laravel框架图片无法显示问题

热门文章

  1. 瀑布流式网页翻页爬取
  2. 因果推断综述及基础方法介绍(一)
  3. 任务方案思考:文本分类篇
  4. 【NLP专栏】图解 BERT 预训练模型!
  5. 机器学习中的「相似度度量」方法及应用
  6. 论文赏析[TACL19]生成模型还在用自左向右的顺序?这篇论文教你如何自动推测最佳生成顺序
  7. pandas—pd.DataFrame.sample
  8. HarmonyOS IoT首著,走进万物互联的世界!
  9. 《数源思维》提问工具之“语法套”
  10. 创业公司的个人“可伸缩性”方案