spring学习笔记(四)我对spring中bean生命周期的理解
我相信大部分同学对spring中bean的生命周期都不陌生,但是如果要详细的说出每一个步骤,可能能说出来的也不多,我之前也是这样,前几天调了一下spring的源码,看了一点书,突然一下明朗了,理解了spring中bean的生命周期。接下来就跟大家分享下我的心得,有什么不对的也希望大家帮忙指正~
我们先看一下spring中bean的生命周期:
这是我在网上随便找的一张图,大家估计也看得不少,接下来我就这张图一步步分析spring为什么会这么设计bean的生命周期。
首先,我们知道spring的一大亮点就是IOC(控制反转)跟DI(依赖注入)。对于前两步,实例化对话以及设置对象属性我相信大家都没什么疑问。对应的步骤如下:
- Bean的建立, 由BeanFactory读取Bean定义文件,并生成各个实例
- Setter注入,执行Bean的属性依赖注入
后面的步骤,我们可以将其分为三步,
第一步,实现Aware一系列接口唤醒bean自身,使bean能感知到容器的存在。
第二步:初始化bean,这里的初始化是指实现我们自己定义的初始化方法。
第三步:销毁。
很明显,bean核心生命周期就在第二步
我们分析为什么会有第一步?为什么不直接初始化呢?
为了回答这个问题我们要知道,spring与spring所管理的bean默认是无状态的,即bean默认是无法感知到spring容器的。
但是为了实现bean的初始化,我们又不得不拿到容器对象,类似的代码就像这样
/**
* @Author: dmz
* @Description:
* @Date: Create in 23:51 2019/3/18
*/
public class Person implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
private String name;
public Person(String name) {
this.name = name;
}
}
只有经过上面的步骤,我们的bean才跟spring发生了耦合,这里顺便说一下,spring中的容器有两种,一种是BeanFactory,一种是ApplicationContext。所以我们实现ApplicationContextAware 跟实现BeanFactoryAware的目的是一样,都是为了使bean感知到容器。
我们要知道的是,第一步使bean感知到容器,是为了帮助bean完成接下来的初始化。至于为什么最开始是(BeanNameAware的setBeanName(), 如果实现该接口,则执行其setBeanName方法),我相信这也不难理解,自身的优先级自然是高于容器的,在拿到容器对象前先获取自身Id也是可以理解的
对应步骤为:
- BeanNameAware的setBeanName(), 如果实现该接口,则执行其setBeanName方法
- BeanFactoryAware的setBeanFactory(),如果实现该接口,则执行其setBeanFactory方法
- 若有Bean类实现了org.springframework.context.ApplicationContextAware接口,则执行其setApplicationContext()方法
接下来是第二步的分析:第二步可以拆分成三个部分:
1.初始化前:
- BeanPostProcessor的processBeforeInitialization(),如果有关联的processor,则在Bean初始化之前都会执行这个实例的processBeforeInitialization()方法
2.执行初始化:
- InitializingBean的afterPropertiesSet(),如果实现了该接口,则执行其afterPropertiesSet()方法
- Bean定义文件中定义init-method
3.初始化后
- BeanPostProcessors的processAfterInitialization(),如果有关联的processor,则在Bean初始化之前都会执行这个实例的processAfterInitialization()方法
对于这一步我们应该知道的是,BeanPostProcessor这个接口的作用,是对bean在初始化前后做一些操作
而我们自定义的initMethod方法跟实现InitializingBean,是为了帮助我们对bean进行初始化
最后是第三步:销毁
- DisposableBean的destroy(),在容器关闭时,如果Bean类实现了该接口,则执行它的destroy()方法
- Bean定义文件中定义destroy-method,在容器关闭时,可以在Bean定义文件中使用“destory-method”定义的方法
我们一步步分析下来就会发现,每一步的存在都有其合理性,并且顺序上也合理,不能随意打乱
经过这次我也发现,只有真正的理解才能记住,死记是记不住的,平常多调调源码帮助还是很大的。
以后工作学习中要多问问自己问什么,为什么要这样设计,为什么要这样写~~!!
spring学习笔记(四)我对spring中bean生命周期的理解的更多相关文章
- Typescript 学习笔记四:回忆ES5 中的类
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- 【Spring学习笔记-MVC-15.1】Spring MVC之异常处理=404界面
作者:ssslinppp 异常处理请参考前篇博客:<[Spring学习笔记-MVC-15]Spring MVC之异常处理>http://www.cnblogs.com/sssl ...
- 【Spring学习笔记-MVC-13.2】Spring MVC之多文件上传
作者:ssslinppp 1. 摘要 前篇文章讲解了单文件上传<[Spring学习笔记-MVC-13]Spring MVC之文件上传>http://www.cnblogs.co ...
- 【Spring学习笔记-MVC-5】利用spring MVC框架,实现ajax异步请求以及json数据的返回
作者:ssslinppp 时间:2015年5月26日 15:32:51 1. 摘要 本文讲解如何利用spring MVC框架,实现ajax异步请求以及json数据的返回. Spring MV ...
- Spring学习笔记(二)——Spring相关配置&属性注入&Junit整合
一.Spring的相关配置 1.1 Bean元素 class属性:被管理对象的完整类名 name属性:给Bean起个名字,能重复,能使用特殊字符.后来属性 id属性:给Bean起个名字,不能重复,不能 ...
- Spring中Bean生命周期
Spring中的bean生命周期是一个重要的点,只有理解Bean的生命周期,在开发中会对你理解代码是非常有用的.对于Bean的周期,个人认为可以分为四个阶段.第一阶段:Bean的实例化,在该阶段主要是 ...
- Android学习笔记(十五)——碎片的生命周期(附源代码)
碎片的生命周期 点击下载源代码 与活动类似.碎片具有自己的生命周期.理解了碎片的生命周期后.我们能够在碎片被销毁时正确地保存事实上例,在碎片被重建时将其还原到前一个状态. 1.使用上一篇的项目Frag ...
- Spring学习笔记四 整合SSH
三大框架架构(整合原理) 步骤1:导包 Hibernate包 1.Hibernate包,hibernate/lib/required 2.hibernate/lib/jpa | java persis ...
- spring学习笔记四:spring常用注解总结
使用spring的注解,需要在配置文件中配置组件扫描器,用于在指定的包中扫描注解 <context:component-scan base-package="xxx.xxx.xxx.x ...
随机推荐
- WinForm:API
一.WndProc: 主要用在拦截并处理系统消息和自定义消息 比如:windows程序会产生很多消息,比如你单击鼠标,移动窗口都会产生消息.这个函数就是默认的消息处理函数.你可以重载这个函数来制定自 ...
- C#集合类型——Array、ArrayList、List 之浅谈
在学习或工作中,集合是经常用到的,可以换一句话说“无项目无集合”,“项目皆有集合”.它一般存储一系列数据或者将一系列数据进行相关操作.在这里先大略谈一些集合类型的相关知识用于回顾. 数组(Array) ...
- Oracle Database 12C 安装教程
一.下载地址 Oracle Database 官方下载地址:https://www.oracle.com/database/technologies/oracle-database-software- ...
- 原生Js贪吃蛇游戏实战开发笔记
前言 本课程是通过JavaScript结合WebAPI DOM实现的一版网页游戏---贪吃蛇的开发全过程,采用面向以象的思想设计开发.通过这个小游戏的开发, 不仅可以掌握JS的语法的应用,还可以学会D ...
- python 利用numpy同时打乱列表的顺序,同时打乱数据和标签的顺序
可用于网络训练打乱训练数据个标签,不改变对应关系 方法一: np.random.shuffle (无返回值,直接打乱原列表) state = np.random.get_state() np.rand ...
- 关于vagrant环境下项目中图片缓存的问题
之前用的是iis所以可能没有这些问题,后来换了nginx之后发现图片缓存问题很严重,本项目用的是thinkphp5框架:浏览器.runtime.session.cookie.加参数,后台,所有缓存都清 ...
- python学习24之异常
'''''''''1.低级错误:纯语法错误2.中级错误:代码存在隐性错误,逻辑缺陷3.高级错误:软件面对不确定性的异常错误''''''一.捕获异常1.基本异常捕获语句try: #异常捕捉语句的开始 代 ...
- 数据包的抓取[tcpdump]的应用
[root@server ~]# yum install tcpdump [root@server ~]# yum install wireshark 1.默认情况下,直接启动tcpdump将监视第一 ...
- ip-端口-协议等基本概念
互联网上的计算机,都会有一个唯一的32位的地址——ip地址.我们访问服务器,就必须通过这个ip地址. 局域网里也有预留的ip地址:192/10/172开头.局域网里的ip地址也是唯一的. NA ...
- 8.Python中装饰器是什么?
Python中装饰器是什么? A Python decorator is a specific change that we make in Python syntax to alter functi ...