Spring核心——Bean的生命周期
文章目录
- 序言
- 一:Bean生命周期流程图
- 二:测试方法以及步骤
- 1、创建一个bean
- 2、创建BeanFactoryPostProcessor 的实现实例
- 3、创建InstantiationAwareBeanPostProcessorAdapter实现实例
- 4、创建BeanPostProcessor实现实例
- 5、将实例注册到Spring中
- 6、测试代码
- 7、运行日志
序言
Bean是Spring框架的核心,无论我们用的是SpringMVC、SpringBoot、SpringCloud都绕不开Bean的构造,理解了Bean的生命周期有利于我们更好的了解自己的项目并且可以对现有的框架做一些扩展。
一:Bean生命周期流程图
首先,看一下Bean整个生命周期的流程图,这张图有利于我们了解整个过程中的调用情况。
原图:https://www.processon.com/view/link/5e421d84e4b00de9fd84a623
二:测试方法以及步骤
Spring中有很多继承于Aware
中的接口,aware的意思是已知的
,所以从这些Aware中我们能从Spring容器获取到已知的一些信息。
简单举例来说,比如我们实现了ApplicationContextAware,我们就可以从里面获取到ApplicationContext上下文对象。
public interface ApplicationContextAware extends Aware {void setApplicationContext(ApplicationContext var1) throws BeansException;
}
下面通过简单的代码示例来模拟bean的生命周期。
1、创建一个bean
这个Bean实现了一下接口:
BeanFactoryAware
BeanNameAware
BeanClassLoaderAware
ResourceLoaderAware
MessageSourceAware
EnvironmentAware
ApplicationContextAware
InitializingBean
DisposableBean
Bean的实现如下:
public class UserInfo implements BeanFactoryAware,BeanNameAware,BeanClassLoaderAware,ResourceLoaderAware,MessageSourceAware,EnvironmentAware,ApplicationContextAware,InitializingBean,DisposableBean {//用户idInteger id;//用户名称String name;//用户性别String gender;//用户年龄String age;//备注String remarks;public UserInfo() {System.out.println(DateUtil.getTimeNow() + "调用UserInfo构造方法");}public void myInit() {System.out.println(DateUtil.getTimeNow() + "调用UserInfo的myInit()方法");}public void myDestroy() {System.out.println(DateUtil.getTimeNow() + "调用UserInfo的myDestroy()方法");}public Integer getId() {return id;}public void setId(Integer id) {System.out.println(DateUtil.getTimeNow() + "调用UserInfo赋值属性的setId()");this.id = id;}public String getName() {return name;}public void setName(String name) {System.out.println(DateUtil.getTimeNow() + "调用UserInfo赋值属性的setName()");this.name = name;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public String getAge() {return age;}public void setAge(String age) {System.out.println(DateUtil.getTimeNow() + "调用UserInfo赋值属性的setAge()");this.age = age;}public String getRemarks() {return remarks;}public void setRemarks(String remarks) {this.remarks = remarks;}@Overridepublic String toString() {System.out.println(DateUtil.getTimeNow() + "调用UserInfo赋值属性的toString()");return DateUtil.getTimeNow() + "UserInfo{" +"id=" + id +", name='" + name + '\'' +", gender='" + gender + '\'' +", age='" + age + '\'' +", remarks='" + remarks + '\'' +'}';}@Overridepublic void setBeanClassLoader(ClassLoader classLoader) {System.out.println(DateUtil.getTimeNow() + "调用BeanClassLoaderAware的setBeanClassLoader()");}@Overridepublic void setBeanName(String s) {System.out.println(DateUtil.getTimeNow() + "调用BeanNameAware的setBeanName()");}@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {System.out.println(DateUtil.getTimeNow() + "调用ApplicationContextAware的setApplicationContext()");//模拟获取系统运行参数String sysProp = applicationContext.getEnvironment().getProperty("System.id");System.out.println(DateUtil.getTimeNow() + "获取系统参数System.id=" + sysProp);}@Overridepublic void setBeanFactory(BeanFactory beanFactory) throws BeansException {System.out.println(DateUtil.getTimeNow() + "调用BeanFactoryAware的setBeanFactory()");}@Overridepublic void setEnvironment(Environment environment) {System.out.println(DateUtil.getTimeNow() + "调用EnvironmentAware的setEnvironment()");System.out.println(DateUtil.getTimeNow() + environment.getProperty("user.dir"));//设置系统运行参数String sysProp = "springtest";System.out.println(DateUtil.getTimeNow() + "设置系统参数System.id=" + sysProp);System.setProperty("System.id", sysProp);}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println(DateUtil.getTimeNow() + "调用InitializingBean的afterPropertiesSet()");}@Overridepublic void setMessageSource(MessageSource messageSource) {System.out.println(DateUtil.getTimeNow() + "调用MessageSourceAware的setMessageSource()");}@Overridepublic void setResourceLoader(ResourceLoader resourceLoader) {System.out.println(DateUtil.getTimeNow() + "调用BeanClassLoaderAware的setBeanClassLoader()");}@Overridepublic void destroy() throws Exception {System.out.println(DateUtil.getTimeNow() + "调用DisposableBean赋值属性的destroy()");}}
2、创建BeanFactoryPostProcessor 的实现实例
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {public MyBeanFactoryPostProcessor() {super();System.out.println(DateUtil.getTimeNow() + "调用BeanFactoryPostProcessor构造方法");}@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory configurableListableBeanFactory) throws BeansException {System.out.println(DateUtil.getTimeNow() + "调用BeanFactoryPostProcessor的postProcessBeanFactor(),[" + configurableListableBeanFactory + "]");}
}
3、创建InstantiationAwareBeanPostProcessorAdapter实现实例
首先看一下UML图,了解一下跟BeanPostProcessor的关系:
然后接着去实例化InstantiationAwareBeanPostProcessorAdapter
public class MyInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessorAdapter {public MyInstantiationAwareBeanPostProcessor(){super();System.out.println(DateUtil.getTimeNow() + "调用InstantiationAwareBeanPostProcessor构造方法");}@Overridepublic Object postProcessBeforeInstantiation(Class<?> aClass, String s) throws BeansException {System.out.println(DateUtil.getTimeNow() + "调用InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation(),[" + s + "]");return null;}@Overridepublic boolean postProcessAfterInstantiation(Object o, String s) throws BeansException {boolean resule = true;System.out.println(DateUtil.getTimeNow() + "调用InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation(),[" + s + "], 返回: "+ resule);return resule;}@Overridepublic PropertyValues postProcessPropertyValues(PropertyValues propertyValues, PropertyDescriptor[] propertyDescriptors, Object o, String s) throws BeansException {System.out.println(DateUtil.getTimeNow() + "调用InstantiationAwareBeanPostProcessor的postProcessPropertyValues(),[" + s + "]");return propertyValues;}
}
4、创建BeanPostProcessor实现实例
public class MyBeanPostProcess implements BeanPostProcessor {public MyBeanPostProcess(){super();System.out.println(DateUtil.getTimeNow() + "调用BeanPostProcess构造方法");}@Overridepublic Object postProcessBeforeInitialization(Object o, String s) throws BeansException {System.out.println(DateUtil.getTimeNow() + "调用BeanPostProcess的postProcessBeforeInitialization(),[" + s + "]");return o;}@Overridepublic Object postProcessAfterInitialization(Object o, String s) throws BeansException {System.out.println(DateUtil.getTimeNow() + "调用BeanPostProcess的postProcessAfterInitialization(),[" + s + "]");return o;}
}
5、将实例注册到Spring中
将以上几个实例注册到Spring中,然后进行测试
<!-- 注入实例化的BeanFactoryPostProcessor--><bean class="com.leo.model.MyBeanFactoryPostProcessor"></bean><!-- 注入实例化的BeanPostProcessor --><bean class="com.leo.model.MyBeanPostProcess"></bean><!-- 注入实例化的InstantiationAwareBeanPostProcessor --><bean class="com.leo.model.MyInstantiationAwareBeanPostProcessor"></bean><!-- 手动定义一个bean --><bean id="userInfo" name="userInfo2" class="com.leo.model.UserInfo" init-method="myInit" destroy-method="myDestroy"><property name="id" value="1"></property><property name="name" value="张飒"></property><property name="age" value="18"></property></bean>
6、测试代码
private static final String CLASS_PATH_RESOURCE = "applicationContext-test.xml";@Testpublic void classPathXmlApplicationContextTest() throws InterruptedException {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(CLASS_PATH_RESOURCE);UserInfo userInfo = (UserInfo) applicationContext.getBean("userInfo");System.out.println(userInfo);TimeUnit.SECONDS.sleep(3);//模拟业务运行applicationContext.registerShutdownHook();//销毁容器}
7、运行日志
[2020-02-24 11:11:35.596] 调用BeanFactoryPostProcessor构造方法
[2020-02-24 11:11:35.644] 调用BeanFactoryPostProcessor的postProcessBeanFactor(),[org.springframework.beans.factory.support.DefaultListableBeanFactory@4dfa3a9d: defining beans [com.leo.model.MyBeanFactoryPostProcessor#0,com.leo.model.MyBeanPostProcess#0,com.leo.model.MyInstantiationAwareBeanPostProcessor#0,userInfo]; root of factory hierarchy]
[2020-02-24 11:11:35.649] 调用BeanPostProcess构造方法
[2020-02-24 11:11:35.650] 调用InstantiationAwareBeanPostProcessor构造方法
[2020-02-24 11:11:35.671] 调用InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation(),[userInfo]
[2020-02-24 11:11:35.672] 调用UserInfo构造方法
[2020-02-24 11:11:35.672] 调用InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation(),[userInfo], 返回: true
[2020-02-24 11:11:35.734] 调用InstantiationAwareBeanPostProcessor的postProcessPropertyValues(),[userInfo]
[2020-02-24 11:11:35.773] 调用UserInfo赋值属性的setId()
[2020-02-24 11:11:35.774] 调用UserInfo赋值属性的setName()
[2020-02-24 11:11:35.774] 调用UserInfo赋值属性的setAge()
[2020-02-24 11:11:35.775] 调用BeanNameAware的setBeanName()
[2020-02-24 11:11:35.775] 调用BeanClassLoaderAware的setBeanClassLoader()
[2020-02-24 11:11:35.777] 调用BeanFactoryAware的setBeanFactory()
[2020-02-24 11:11:35.779] 调用EnvironmentAware的setEnvironment()
[2020-02-24 11:11:35.780] E:\WorkSpace\Git\spring-framework-learning-example\chapter-4-springmvc-sourcecode-analysis
[2020-02-24 11:11:35.780] 设置系统参数System.id=springtest
[2020-02-24 11:11:35.781] 调用BeanClassLoaderAware的setBeanClassLoader()
[2020-02-24 11:11:35.783] 调用MessageSourceAware的setMessageSource()
[2020-02-24 11:11:35.783] 调用ApplicationContextAware的setApplicationContext()
[2020-02-24 11:11:35.784] 获取系统参数System.id=springtest
[2020-02-24 11:11:35.785] 调用BeanPostProcess的postProcessBeforeInitialization(),[userInfo]
[2020-02-24 11:11:35.787] 调用InitializingBean的afterPropertiesSet()
[2020-02-24 11:11:35.788] 调用UserInfo的myInit()方法
[2020-02-24 11:11:35.789] 调用BeanPostProcess的postProcessAfterInitialization(),[userInfo]
[2020-02-24 11:11:35.818] 调用UserInfo赋值属性的toString()
[2020-02-24 11:11:35.819] UserInfo{id=1, name='张飒', gender='null', age='18', remarks='null'}
[2020-02-24 11:11:38.833] 调用DisposableBean赋值属性的destroy()
[2020-02-24 11:11:38.834] 调用UserInfo的myDestroy()方法
Spring核心——Bean的生命周期相关推荐
- 深究Spring中Bean的生命周期
前言 这其实是一道面试题,是我在面试百度的时候被问到的,当时没有答出来(因为自己真的很菜),后来在网上寻找答案,看到也是一头雾水,直到看到了<Spring in action>这本书,书上 ...
- Spring 中 Bean 的生命周期
本文作者: 伯乐在线 - yemengying 智商捉鸡?,实在没办法一下子理解Spring IoC和AOP的实现原理,看的闹心也不太懂,所以...决定拆成小的不能在小的一个个问题,一点点啃.今天先来 ...
- 如果你每次面试前都要去背一篇Spring中Bean的生命周期,请看完这篇文章
前言 当你准备去复习Spring中Bean的生命周期的时候,这个时候你开始上网找资料,很大概率会看到下面这张图: 先不论这张图上是否全面,但是就说这张图吧,你是不是背了又忘,忘了又背? 究其原因在于, ...
- 面试问题:Spring中Bean 的生命周期
Spring Bean生命周期执行流程 在传统的 Java 应用中,Bean 的生命周期很简单,使用关键字 new 实例化 Bean,当不需要该 Bean 时,由 Java 自动进行垃圾回收. Spr ...
- (十)Spring中Bean的生命周期(下)
Spring官网阅读(十)Spring中Bean的生命周期(下) 在上篇文章中,我们已经对Bean的生命周期做了简单的介绍,主要介绍了整个生命周期中的初始化阶段以及基于容器启动停止时LifeCycle ...
- Spring中Bean的生命周期是怎样的?
对于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收.而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制.Spring中每个Bean的生命周期如下 ...
- Spring中Bean的生命周期以及三级缓存介绍
Bean的生命周期以及三级缓存介绍 简述 测试代码编写 创建IOC容器(Bean创建) 1.refresh()方法 2.finishBeanFactoryInitialization(beanFact ...
- spring --(12)bean的生命周期
2019独角兽企业重金招聘Python工程师标准>>> springIOC容器可以管理bean的生命周期,管理过程: 1>通过构造器或工厂方法创建bean实例 2>给be ...
- Spring中Bean的生命周期是怎样的
于普通的Java对象,当new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收.而由Spring IoC容器托管的对象,它们的生命周期完全由容器控制.Spring中每个Bean的生命周期如下: ...
最新文章
- 零基础Java学习之数组
- java h5获取ip,websocket中获取客户端通信的真实IP
- 一致代码段与非一致代码段
- NOIP2018 赛前集训总结反思
- ic卡复制软件_使用MCT复制IC卡0扇区的方法(适用于NFC手机复制或模拟门禁卡)...
- 一些相当不错的php开源 AJAX聊天工具
- eclipse鼠标变十了_Eclipse在过去十年中的主要成就
- [poj 3436]最大流+输出结果每条边流量
- Leetcode-496-下一个更大元素 I
- [转] Java/JSP中使用JDBC连接SQL Server 2005
- WPF TreeView tools
- android studio gjson,Android Studio插件GsonFormat
- C语言如何调用REFPROP软件,coolprop调用refprop计算流体的热力学性质和传输特性
- 使用jemeter进行接口压力测试
- 加拿大签证办理时解释信Explanation of Letter参考
- 池州学院数学与计算机足球队,池州学院数学与计算机科学系.ppt
- Python 图片透明化:使用代码轻松实现图片的透明化效果
- 新媒体音乐,不适合闭目欣赏的前卫艺术
- 关闭云鲸拖地机器人风干_评测云鲸拖地机器人:看它拖地后怎么自己洗抹布的?|未来科技范...
- 网易视频云干货分享:2B产品经理如何养成