Spring------生命周期
Spring------生命周期
如图所示:
一下就是对上图的解释:
Spring生命周期
1.先实例化Bean工厂后处理器(Bean工厂处理器的实例化是先于bean的实例化的)
(BeanFactoryPostProcessor)
该接口只有一个postProcessBeanFactory方法,将加载所有bean定义,但是还没有实例化bean。
2.实例化Bean后处理器(BeanPostProcessor)
主要是两个能力:
(1)检验bean状态是否有效;
(2)判断bean是什么接口,然后进行set属性。应该就是api里面说的检查标记接口;
此时,ApplicationContext 可以在它们的beans definitions自动检测BeanPostProcessor bean并且把这些bean应用于随后的bean创建。
3.实例化感知的bean后处理器适配器(InstantiationAwareBeanPostProcessorAdapter)
它可以去调用三个方法:
postProcessBeforeInstantiation方法(实例化Bean之前调用)这个返回的bean也许是一个代理代替目标bean,有效地抑制目标bean的默认实例化。
postProcessAfterInitialization方法(实例化Bean之后调用)主要是对已经实例化的bean进行一些处理,比如说:可能这个bean在早期已经实例化了又是单例,那么就销毁这个bean用原来的bean。
postProcessPropertyValues方法(设置某个属性时调用)这个方法是校验需要注入的属性是否有属性值,并为bean注入属性
4执行Bean构造器,bean正式实例化
在实例化之前会先去调用postProcessBeforeInstantiation方法
在实例化之后就去调用postProcessAfterInitialization方法
在这里实例化就是调用postProcessPropertyValues去为所要实例化的bean注入属性
注:此处使用到的是Bean后处理器适配器的方法。
5. 调用BeanNameAware接口
通过其中的setBeanName(String name)方法对工厂bean进行set name
6. 调用BeanFactoryAware接口
通过其中的setBeanFactory(BeanFactory beanFactory)方法对工厂bean进行set name
它会为bean实例提供所属工厂的回调。但是,是在普通的bean属性值填充之后,在初始化回调之前,从而获得所属的beanFactory并拷贝到本对象中。
作用:可以通过这个bean所属的beanFactory检查bean依赖的bean、beanClassLoader、互斥的单例等。
7.调用Bean后处理器的postProcessBeforeInstantiation方法对属性进行更改
8.调用InitializingBean.afterPropertiesSet() ,检查是否已经set所有必要属性,
之后调用<bean>的init-method属性指定的初始化方法
9. 调用Bean后处理器的postProcessAfterInitialization对属性进行更改
注:7、9用到的是Bean后处理器的方法。
后处理器适配器与后处理器的这两个方法分不同之处在于:
前者实在目标bean初始化之前之后调用,而后者实在任何bean实例化回掉之前之后使用
所以后处理器适配器的方法是先与后处理器的方法被调用
10.调用后处理器适配器的postProcessAfterInitialization
11. 容器初始化成功,使用bean
12. 调用DiposibleBean接口的DiposibleBean.destory()
被一个BeanFactory调用销毁一个实例对象
destroy-method调用<bean>的destroy-method属性指定的销毁方法
Spring------生命周期的更多相关文章
- spring生命周期
Github地址 最近在整合mybatis-spring. 公司里面已经有一个叫做kylin-datasource的开发包,以前能够提供master和slave2个数据源,最近更新了2.0版本,支持自 ...
- 说下spring生命周期
面试官:说下spring生命周期 程序员:不会 那你先回去等消息吧 Bean实现了BeanNameAware,Spring会将Bean的ID透传给setBeanName java.后端开发.程 ...
- Spring生命周期详解
导读 Spring中Bean的生命周期从容器的启动到停止,涉及到的源码主要是在org.springframework.context.support.AbstractApplicationContex ...
- Spring学习总结(4)-Spring生命周期的回调
参考文档:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans ...
- 【源码】spring生命周期
一.spring生命周期 1. 实例化Bean 对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用crea ...
- Spring生命周期 Constructor > @PostConstruct > InitializingBean > init-method
项目中用到了 afterPropertiesSet: 于是具体的查了一下到底afterPropertiesSet到底是什么时候执行的.为什么一定要实现 InitializingBean; **/ @C ...
- spring 生命周期最详解
转载. https://blog.csdn.net/qq_23473123/article/details/76610052 目的 在大三开始学习spring时,老师就说spring bean周期非常 ...
- spring生命周期流程图
Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring ...
- spring源码学习(四)-spring生命周期用到的后置处理器
生命周期的九大后置处理器 第一次调用后置处理器org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory# ...
- 七、spring生命周期之初始化和销毁方法
一.通过@Bean指定初始化和销毁方法 在以往的xml中,我们是这样配置的 <bean id="exampleInitBean" class="examples.E ...
随机推荐
- Linux下实现ssh免密认证
添加域名映射 配置ssh免密登陆 拷贝master服务器公钥至本机 验证master服务器ssh免密登录其余服务器 添加域名映射 打开hosts文件 Vim /etc/hosts 添加域名对象 配置s ...
- C++遍历路径下的所有文件
intptr_t类型用于记录文件夹句柄,注意该类型不是指针类型,而是int型的重定义. _finddata_t结构体类型用于记录文件信息. _finddata_t结构体定义如下 struct _fin ...
- centos打开matlab的正确姿势
进入usr/local/MATLAB/R2015b/bin ./matlab
- ionic3 使用swiper插件 实现轮播效果
由于app的更新迭代 我需要完成新版本设计图的开发 刚开始就遇到一个问题 首页的banner图需要实现某种效果 而ionic3自带的轮播图效果怎么改都改不到我想要的效果 效果图如下 自动播放 不断 ...
- GitHub入门与实践 读书笔记一:欢迎来到GitHubde世界
1.什么是GitHub GitHubshi为开发者提供Git仓库的托管服务.除此之外,还为开发者提供能帮助提高代码效率和品质的功能. GitHub和Git的区别? Git是源码仓库而GitHub是在网 ...
- Oracle 创建存储过程 提示权限不足或者提示表和视图不存在问题
grant create view to hospital; --授予查询权限 grant select any table to hospital; --授予权限 grant select any ...
- noj装载问题
描述 有两艘船,载重量分别是c1. c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2.确定是否有可能将所有集装箱全部装入两艘船. 输入 多个测例,每个测例的输入占 ...
- oracle累积求和分析函数sum over的使用
oracle sum()over函数的使用 over不能单独使用,要和分析函数:rank(),dense_rank(),row_number()等一起使用. over函数的参数:over(partit ...
- easyui datagrid去掉全选按钮
第一步: F12查看元素,选中全选按钮,把全选按钮的class里边加上display:none属性.找到对应的class,即.datagrid-header-check. 第二步: 在加载 表格的时候 ...
- PythonStudy——python中如何使输出不换行
1.在python 3.x版本中,使用print(,end="") 可使输出不换行, 例如: