BeanPostProcessor我们一般称为Bean的后置处理器,它与我们前面介绍的InitialingBeaninit-method等一样,都是在bean的初始化时被调用,具体的用法我们在举例中进行学习。

要使用BeanPostProcessor非常简单,只要实现这个接口即可。

在此之前,我们来先看下我们的Cat类,我们的目的是将这个Cat注册进spring的ioc容器中,并让这个BeanPostProcessor起到作用。

public class Cat implements InitializingBean,DisposableBean {public Cat(){System.out.println("cat constructor...");}@Overridepublic void destroy() throws Exception {// TODO Auto-generated method stubSystem.out.println("cat...destroy...");}@Overridepublic void afterPropertiesSet() throws Exception {// TODO Auto-generated method stubSystem.out.println("cat...afterPropertiesSet...");}//对象创建并赋值之后调用@PostConstructpublic void initMethod(){System.out.println("Cat....@PostConstruct...");}//容器移除对象之前@PreDestroypublic void detoryMethod(){System.out.println("Cat....@PreDestroy...");}public void initCat() {System.out.println("Cat.initCat()......");}public void cleanup() {System.out.println("Cat.cleanup()......");}
}

再来看下我们的配置类

@Configuration
public class MainConfigOfLifeCycle {//  @Scope("prototype")@Bean(initMethod="initCat",destroyMethod="cleanup")public Cat cat(){return new Cat();}@Beanpublic MyBeanPostProcessor myBeanPostProcessor() {return new MyBeanPostProcessor();}
}

结合之前学习过的内容, 就能知道我们为这个Cat类应用了三种初始化及销毁方法,

分别是@PostConstruct@Predestroy

还有就是实现 InitializingBean,DisposableBean这两个接口的afterPropertiesSet()destro()方法

另外就是标注在@Bean(initMethod="initCat",destroyMethod="cleanup")定义的两个方法,也存在于Cat类中,


现在我们就要加入BeanPostProcessor

/*** 后置处理器:初始化前后进行处理工作* 将后置处理器加入到容器中,只需要继承BeanPostProcessor接口并实现其两个方法即可。*/
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println("postProcessBeforeInitialization..."+beanName+"=>"+bean);return bean;}@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("postProcessAfterInitialization..."+beanName+"=>"+bean);return bean;}}

现在一切具备,再写一个测试方法:

    @Testpublic void test01(){//1、创建ioc容器AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfigOfLifeCycle.class);System.out.println("容器创建完成...");//applicationContext.getBean("car");//关闭容器applicationContext.close();}

观察控制台打印结果

cat constructor...// 创建cat对象
postProcessBeforeInitialization...cat=>com.atguigu.bean.Cat@6591f517 //在所有初始化方法之前被调用
Cat....@PostConstruct...
cat...afterPropertiesSet...
Cat.initCat()......
postProcessAfterInitialization...cat=>com.atguigu.bean.Cat@6591f517// 在所有初始化方法之后被调用
容器创建完成...
Cat....@PreDestroy...// 销毁方法不需要关注
cat...destroy...
Cat.cleanup()......

通过上面这个例子,已经很显然BeanPostProcessor的用法,它是在容器中bean初始化前后被调用。


源码调用分析:

我们在eclipse中启用debug模式,

看看这个方法的源码,直接在方法注释中进行分析

    protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {if (System.getSecurityManager() != null) {AccessController.doPrivileged(new PrivilegedAction<Object>() {@Overridepublic Object run() {invokeAwareMethods(beanName, bean);return null;}}, getAccessControlContext());}else {invokeAwareMethods(beanName, bean);}Object wrappedBean = bean;if (mbd == null || !mbd.isSynthetic()) {// 初始化前调用BeanPostProcessorwrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);}try {//初始化方法invokeInitMethods(beanName, wrappedBean, mbd);}catch (Throwable ex) {throw new BeanCreationException((mbd != null ? mbd.getResourceDescription() : null),beanName, "Invocation of init method failed", ex);}if (mbd == null || !mbd.isSynthetic()) {// 初始化后调用BeanPostProcessorwrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);}return wrappedBean;}

就看到这里,里面内容比较多,可以进invokeInitMethods看看几个初始化方法的调用顺序,JSR-250注解@PostConstruct是如何起作用的等等 ,我们这里只是来源码中找找它在源码中的位置。


又是一个夜晚,一船的清梦。

转载于:https://www.cnblogs.com/heliusKing/p/11391271.html

八、spring生命周期之BeanPostProcessor相关推荐

  1. spring生命周期七个过程_Spring杂文(三)Spring循环引用

    众所周知spring在默认单例的情况下是支持循环引用的 Appconfig.java类的代码 @Configurable @ComponentScan("com.sadow") p ...

  2. 【Java从0到架构师】Spring - 生命周期、代理

    生命周期.代理 bean 的生命周期 代理 业务层的一些问题 静态代理 (Static Proxy) 动态代理 (Dynamic Proxy) JDK 动态代理 - Proxy.newProxyIns ...

  3. 老司机带你从源码开始撸Spring生命周期!!!

    导读 Spring在Java Web方面有着举足轻重的地位,spring的源码设计更是被很多开发者所惊叹,巧妙的设计,精细的构思,都注定他的地位.今天陈某大言不惭的带你来从源码角度解析Spring的生 ...

  4. Spring生命周期详解

    导读 Spring中Bean的生命周期从容器的启动到停止,涉及到的源码主要是在org.springframework.context.support.AbstractApplicationContex ...

  5. Spring 生命周期详解

    Spring 生命周期详解 一.传统JAVA bean的生命周期 使用Java关键字 new 进行Bean 的实例化,然后该Bean 就能够使用了. 一旦bean不再被使用,则由Java自动进行垃圾回 ...

  6. Spring生命周期——简介

    文章目录 Spring生命周期 1 Bean 生命周期的整个执行过程描述如下: 2 Spring中的循环依赖是怎么处理的 3 重写Spring生命周期中的接口方法: Spring生命周期 Spring ...

  7. Spring生命周期Bean初始化过程详解

    Spring生命周期Bean初始化过程详解 Spring 容器初始化 Spring Bean初始化 BeanFactory和FactoryBean 源码分析 Bean的实例化 preInstantia ...

  8. 详解spring生命周期的扩展点

    详解spring生命周期的扩展点,加速你追赶高手的脚步 详解spring生命周期的扩展点

  9. 【SSM - Spring篇01】spring详细概述,Spring体系结构,bean、property属性,Spring生命周期方法

    文章目录 1. Spring介绍 2. Spring体系架构 2.1 Spring核心容器(Core Container) 2.2 数据访问/集成(Data Access/Integration) 2 ...

最新文章

  1. 深蓝学院的深度学习理论与实践课程:第二章
  2. Linux下程序时间消耗监控与统计
  3. 一个球从100m高度自由落下,第10次反弹多高
  4. 分布式计算—MapReduce、Spark、Storm、Flink分别适用什么场景
  5. [JS-BOM]BOM_History历史记录对象
  6. poj1419 Graph Coloring 最大独立集(最大团)
  7. [旧文新读] 深度学习在Airbnb搜索的应用实践
  8. 数据结构 5-3-3 二叉树的线索化
  9. java到底是值传递还是引用传递?
  10. Sort Integers by the Number of 1 Bits
  11. 计算机学硕编码,怎么区分学硕和专硕代码
  12. linux 电源管理 power supply class
  13. 计算机化验中红细胞的测量程序,血液常规检查检验程序.doc
  14. 国内搜索引擎技术现状 zZ
  15. 颜色转换rgb24 to yuv420
  16. Opencv环境的配置与基本使用
  17. 脚下,梦開始的地方——七月总结
  18. MyBatis第十一章:项目案例——update配置及set动态语句操作
  19. “银行家算法”讲解,在前端表格中利用自定义公式实现“四舍六入五成双”
  20. 如何对大硬盘进行低格

热门文章

  1. ICCV 2019 | 首个镜子分割网络问世,大连理工、鹏城实验室、香港城大出品
  2. 机器学习的下一站:AutoML | 文末送书
  3. 【活动】师兄喊你来读博,优秀CV实验室推荐!
  4. PyTorch | 通过torch.arange创建等差数列张量 | torch.arange()如何使用?torch.arange()使用方法 torch.arange()举例说明
  5. 收藏 | 13则PyTorch使用的小窍门
  6. 学术 | 基于深度学习的图像边缘和轮廓提取方法介绍
  7. 大数据预测实战-随机森林预测实战(一)-数据预处理
  8. 想做数学建模?先看看这些MATLAB函数吧!
  9. Pandas-DataFrame基础知识点总结
  10. R-CNN 物体检测第一弹