Spring Bean 生命周期之“我从哪里来?” 懂得这个很重要
Spring bean 的生命周期很容易理解。实例化 bean 时,可能需要执行一些初始化以使其进入可用 (Ready for Use)状态。类似地,当不再需要 bean 并将其从容器中移除时,可能需要进行一些清理,这就是它的生命周期

上一篇文章 面试还不知道BeanFactory和ApplicationContext的区别? 中说明了接口 Beanfactory 和 Applicationcontext 可以通过 T getBean(String name, Class<T> requiredType) 方法从 Spring 容器中获取bean,区别是,前者是懒加载形式,后者是预加载的形式。那么问题来了:
这些 Spring Beans 是怎么生成出来的呢?
在正式回答这个问题之前,先解答一些有关 Java Bean, Spring Bean 和 Spring IoC 容器这些概念性的疑惑,我希望通过下面这个例子形象说明这些问题:
小学生 (Java Bean)通过提交资料申请(元数据配置)加入了少先队(Spring Ioc 容器),学习了一些精神与规定之后,变成了少先队员(Spring Bean)
从这里可以看出,Java Bean 和 Spring Bean 都是具有特定功能的对象,小学生还是那个小学生,只不过加入了少先队之后有了新的身份,新的身份要按照组织 (Spring Ioc)的规定履行特定义务
来看下图加深一下了解

首先要有容器,实例化 Spring Ioc 容器是非常简单的,接口 org.springframework.context.ApplicationContext 表示Spring IoC容器,负责实例化,配置和组装上述 bean。 容器通过读取配置元数据获取有关要实例化,配置和组装的对象的指令。 配置元数据通常以XML,Java 注解或代码的形式表示。 它允许你自己表达组成应用程序的对象以及这些对象之间丰富的相互依赖性,比如这样:
ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"spring.xml", "spring1.xml"});
有了容器,我们需要做哪些处理,使其内部对象变为
Ready for Use的状态?
我们需要通过 Spring 容器实例化它们,Spring 为我们提供了三种方式:
三种初始化方式
InitializingBean
Spring 为我们提供了 InitializingBean 接口
public interface InitializingBean {
void afterPropertiesSet() throws Exception;
}
我们可以通过实现 InitializingBean 接口,在其唯一方法 afterPropertiesSet 内完成实例化的工作,但是 Spring Framework 官方并不建议我们通过这种方法来完成 Bean 的实例化,这是一种强耦合的方式,我们看到框架层面才会用到这个方法。
@PostConstruct
这种方式是 Spring 非常提倡的一种方式,我们通常将其标记在方法上即可,通常习惯将这个方法起名为 init()
@PostConstruct
public void init() {
System.out.println("Inside init() method...");
}
init-method
你应该见过这种初始化方式:
public class MyClass {
public void init() {
// perform post-creation logic here
}
}
@Configuration
public class AppConfig {
@Bean(initMethod = "init")
public MyClass myclass() {
return new MyClass ();
}
}
你也应该见过这种配置方式:
<bean id="myClass" class="com.demo.MyClass" init-method="init"/>
没错,这只是同样功能的不同实现方式罢了
以上就是三种初始化 Spring Beans 的方式,我们在框架中看到过三种方式在组合使用,那么组合使用的调用顺序是什么呢?
- 首先@PostConstruct 会被最先调用
- 其次
InitializingBean.afterPropertiesSet()方法将会被调用 - 最后调用通过 XML 配置的 init-method 方法或通过设置 @Bean 注解 设置 initMethod 属性的方法
了解了这些,你也就了解了 Spring Bean 是怎么来的了
通过图示来说明一下:

组合shying,这个调用顺序很难记忆吗吗?
PostConstruct
(P),afterPropertiesSet(A),init-method(I)--->PAI (圆周率π)
BeanPostProcessor
BeanPostProcessor 接口,大家也应该有印象,里面只有两个方法:
public interface BeanPostProcessor {
Object postProcessBeforeInitialization(Object var1, String var2) throws BeansException;
Object postProcessAfterInitialization(Object var1, String var2) throws BeansException;
}
看方法名,BeforeInitialization 和 AfterInitialization,我们应该猜得出,这是在上述三种方式的前和后,算是一种全局的切面思想,我们经常会使用 postProcessAfterInitialization 方法,通过读取 Bean 的注解完成一些后续逻辑编写与属性的设定,现在 Ready for Use之前是这样:

在 Ready for Use 之前,了解这些内容,已可以基本满足日常的工作内容,但这并不是 Ready for Use 的全部内容,Spring Bean 整个生命周期的流程应该是这样的,后续文章会逐步点亮:

灵魂追问
- 了解了 Spring Bean 是怎么来的?那它是怎么没的呢?什么时候需要销毁他们呢?
- Spring 框架中 XxxxAware,这些类有什么作用,能在
Ready for Use之前有用处吗? - 你日常的工作中有充分利用今天说明的这些内容吗?懂得这些会大大方便你的编程
补充说明
- 虽然当下流行以注解声明方式进行编程,甚至高版本 Spring 会将一些方法标记为过时,但文章说明依旧会使用
XMLBeanFactory这类方法,包括 XML 配置。这样做,只不过为了更清晰的说明问题。 - 另外将 Spring Bean 声明周期的讲解,进行拆分,是为了让大家有独立的思考空间,带着问题去思考、时间,而不是被动的填充,最终串联起自己的学习网络,这样理解的更深刻,具体请看之前写的文章 程序猿为什么要看源码, 后续内容请持续关注
欢迎持续关注公众号:「日拱一兵」,后续会出一系列文章点亮 Spring Bean 周期图,以完整代码施力说明这个周期的顺序;同时进行 Spring 知识点解释与串联,轻松搞定面试那点事,以及在工作中充分利用 Spring 的特性
推荐阅读
- 面试还不知道 BeanFactory 和 ApplicationContext 的区别?
- 如何有效预防 XSS?这几招管用!!
- 犯罪心理解读 Mybatis 拦截器
- 不得不知的责任链设计模式
- 如何设计好的 RESTful API?

Spring Bean 生命周期之“我从哪里来?” 懂得这个很重要的更多相关文章
- Spring Bean 生命周期之destroy——终极信仰
上一篇文章 Spring Bean 生命周期之我从哪里来 说明了我是谁? 和 我从哪里来? 的两大哲学问题,今天我们要讨论一下终极哲学我要到哪里去? 初始化 Spring Bean 有三种方式: @P ...
- spring bean 生命周期和 ? 作用域? spirng bean 相互依赖? jvm oom ? jvm 监控工具? ThreadLocal 原理
1. spring bean 生命周期 1. 实例化一个bean ,即new 2. 初始化bean 的属性 3. 如果实现接口 BeanNameAware ,调用 setBeanName 4. Bea ...
- Spring点滴四:Spring Bean生命周期
Spring Bean 生命周期示意图: 了解Spring的生命周期非常重要,我们可以利用Spring机制来定制Bean的实例化过程. -------------------------------- ...
- 常见问题:Web/Servlet生命周期与Spring Bean生命周期
Servlet生命周期 init()初始化阶段 Servlet容器加载Servlet(web.xml中有load-on-startup=1;Servlet容器启动后用户首次向Servlet发请求;Se ...
- 大厂高频面试题Spring Bean生命周期最详解
Spring作为当前Java最流行.最强大的轻量级框架.Spring Bean的生命周期也是面试高频题,了解Spring Bean周期也能更好地帮助我们解决日常开发中的问题.程序员应该都知道Sprin ...
- Spring Bean生命周期,好像人的一生。。
大家好,我是老三,上节我们手撸了一个简单的IOC容器五分钟,手撸一个Spring容器!,这节我们来看一看Spring中Bean的生命周期,我发现,和人的一生真的很像. 简单说说IoC和Bean IoC ...
- 睡前聊一聊"spring bean 生命周期"
spring bean 生命周期=实属初销+2个常见接口+3个Aware型接口+2个生命周期接口 实属初销:spring bean生命周期只有四个阶段,即实例化->属性赋值->初始化-&g ...
- Spring Bean 生命周期2
在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Sin ...
- Spring bean 生命周期验证
一.从源码注释看bean生命周期 从JDK源码上看,BeanFactory实现类需要支持Bean的完整生命周期,完整的初始化方法及其标准顺序(格式:接口 方法)为: 1.BeanNameAware s ...
随机推荐
- C#中的DataGridView
关键字:C# DataGridView作者:peterzb来源:http://www.cnblogs.com/peterzb 1.DataGridView实现课程表 testcontrol.rar 2 ...
- [Songqw.Net 基础]WPF插件化中同步Style
原文:[Songqw.Net 基础]WPF插件化中同步Style 版权声明:本文为博主原创文章,未经博主允许可以随意转载 https://blog.csdn.net/songqingwei1988/a ...
- UVALive 6485 Electric Car Rally (BFS,PQ)
https://icpcarchive.ecs.baylor.edu/index.php? option=com_onlinejudge&Itemid=8&page=show_prob ...
- 在mac中如何清除.svn文件
有些时候在开发一个应用程序我们需要用到版本控制,它可以帮助我们很好的控制我们程序的代码,尤其在多人开发的时候,优点尤为突出. 但是在有些情况下我们又认为这些.svn真的很麻烦,那么我们怎么把他们一下子 ...
- Win10《芒果TV》更新v3.5.0夏至版:会员尊享蓝光画质,关联本地视频播放
在Win10秋季创意者更新前夕,Win10版<芒果TV>全平台同步更新夏至版v3.5.0,新增会员蓝光画质,关联本地视频播放,进一步提升使用体验. Win10版<芒果TV>V3 ...
- 我们错过了那么多机会,怎么办(就是预见未来的能力,并且要去做、要去投入,所以要主动学习、储备、选择,要不断的思考)good
那天在IT职业咨询QQ群里聊天,提到腾讯.阿里,我说跟着这两家公司从小到大的朋友,都获得了不菲的回报,成了富翁或者财务自由了. 有群友感叹说:“是啊,我们错过了那么多机会.” 看到这句话,我心里一动, ...
- mysql索引创建&查看&删除
1.索引作用 在索引列上,除了上面提到的有序查找之外,数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万倍. 例如,有 ...
- Qt文档系统分析(解释Qt文档的生成工具与过程)
写在前面 只要打开Qt Assistant或Qt Creator的Help,或是打开在线版的 http://doc.qt.nokia.com ,Qt的漂亮的文档就会呈现在我们眼前.而且 Qt的文档,长 ...
- 国家气象局 天气预报 城市代码(JSON格式)
如题 { "城市代码": [ { "省": "北京", "市": [ { "市名": "北 ...
- 无辜的RAD(RAD是让你去创造和使用可复用的组件,不是让程序员“变白痴”)good
无辜的RAD 2005-3-21 说实话,RAD很无辜.从出生的那天其就被骂,天天被指着鼻子说“不就是拖个控件嘛”,就好像当年说学电脑“不就是插个鼠标嘛”.也怪程序员大都天性犯贱,就爱一遍又一便的写基 ...