八、spring生命周期之BeanPostProcessor
BeanPostProcessor我们一般称为Bean的后置处理器,它与我们前面介绍的InitialingBean
、init-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相关推荐
- spring生命周期七个过程_Spring杂文(三)Spring循环引用
众所周知spring在默认单例的情况下是支持循环引用的 Appconfig.java类的代码 @Configurable @ComponentScan("com.sadow") p ...
- 【Java从0到架构师】Spring - 生命周期、代理
生命周期.代理 bean 的生命周期 代理 业务层的一些问题 静态代理 (Static Proxy) 动态代理 (Dynamic Proxy) JDK 动态代理 - Proxy.newProxyIns ...
- 老司机带你从源码开始撸Spring生命周期!!!
导读 Spring在Java Web方面有着举足轻重的地位,spring的源码设计更是被很多开发者所惊叹,巧妙的设计,精细的构思,都注定他的地位.今天陈某大言不惭的带你来从源码角度解析Spring的生 ...
- Spring生命周期详解
导读 Spring中Bean的生命周期从容器的启动到停止,涉及到的源码主要是在org.springframework.context.support.AbstractApplicationContex ...
- Spring 生命周期详解
Spring 生命周期详解 一.传统JAVA bean的生命周期 使用Java关键字 new 进行Bean 的实例化,然后该Bean 就能够使用了. 一旦bean不再被使用,则由Java自动进行垃圾回 ...
- Spring生命周期——简介
文章目录 Spring生命周期 1 Bean 生命周期的整个执行过程描述如下: 2 Spring中的循环依赖是怎么处理的 3 重写Spring生命周期中的接口方法: Spring生命周期 Spring ...
- Spring生命周期Bean初始化过程详解
Spring生命周期Bean初始化过程详解 Spring 容器初始化 Spring Bean初始化 BeanFactory和FactoryBean 源码分析 Bean的实例化 preInstantia ...
- 详解spring生命周期的扩展点
详解spring生命周期的扩展点,加速你追赶高手的脚步 详解spring生命周期的扩展点
- 【SSM - Spring篇01】spring详细概述,Spring体系结构,bean、property属性,Spring生命周期方法
文章目录 1. Spring介绍 2. Spring体系架构 2.1 Spring核心容器(Core Container) 2.2 数据访问/集成(Data Access/Integration) 2 ...
最新文章
- 深蓝学院的深度学习理论与实践课程:第二章
- Linux下程序时间消耗监控与统计
- 一个球从100m高度自由落下,第10次反弹多高
- 分布式计算—MapReduce、Spark、Storm、Flink分别适用什么场景
- [JS-BOM]BOM_History历史记录对象
- poj1419 Graph Coloring 最大独立集(最大团)
- [旧文新读] 深度学习在Airbnb搜索的应用实践
- 数据结构 5-3-3 二叉树的线索化
- java到底是值传递还是引用传递?
- Sort Integers by the Number of 1 Bits
- 计算机学硕编码,怎么区分学硕和专硕代码
- linux 电源管理 power supply class
- 计算机化验中红细胞的测量程序,血液常规检查检验程序.doc
- 国内搜索引擎技术现状 zZ
- 颜色转换rgb24 to yuv420
- Opencv环境的配置与基本使用
- 脚下,梦開始的地方——七月总结
- MyBatis第十一章:项目案例——update配置及set动态语句操作
- “银行家算法”讲解,在前端表格中利用自定义公式实现“四舍六入五成双”
- 如何对大硬盘进行低格
热门文章
- ICCV 2019 | 首个镜子分割网络问世,大连理工、鹏城实验室、香港城大出品
- 机器学习的下一站:AutoML | 文末送书
- 【活动】师兄喊你来读博,优秀CV实验室推荐!
- PyTorch | 通过torch.arange创建等差数列张量 | torch.arange()如何使用?torch.arange()使用方法 torch.arange()举例说明
- 收藏 | 13则PyTorch使用的小窍门
- 学术 | 基于深度学习的图像边缘和轮廓提取方法介绍
- 大数据预测实战-随机森林预测实战(一)-数据预处理
- 想做数学建模?先看看这些MATLAB函数吧!
- Pandas-DataFrame基础知识点总结
- R-CNN 物体检测第一弹