Spring------生命周期

转:https://blog.csdn.net/qq_42112846/article/details/81368862

如图所示:

一下就是对上图的解释:

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------生命周期的更多相关文章

  1. spring生命周期

    Github地址 最近在整合mybatis-spring. 公司里面已经有一个叫做kylin-datasource的开发包,以前能够提供master和slave2个数据源,最近更新了2.0版本,支持自 ...

  2. 说下spring生命周期

    面试官:说下spring生命周期 程序员:不会 那你先回去等消息吧     Bean实现了BeanNameAware,Spring会将Bean的ID透传给setBeanName java.后端开发.程 ...

  3. Spring生命周期详解

    导读 Spring中Bean的生命周期从容器的启动到停止,涉及到的源码主要是在org.springframework.context.support.AbstractApplicationContex ...

  4. Spring学习总结(4)-Spring生命周期的回调

    参考文档:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans ...

  5. 【源码】spring生命周期

    一.spring生命周期 1. 实例化Bean 对于BeanFactory容器,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚未初始化的依赖时,容器就会调用crea ...

  6. Spring生命周期 Constructor > @PostConstruct > InitializingBean > init-method

    项目中用到了 afterPropertiesSet: 于是具体的查了一下到底afterPropertiesSet到底是什么时候执行的.为什么一定要实现 InitializingBean; **/ @C ...

  7. spring 生命周期最详解

    转载. https://blog.csdn.net/qq_23473123/article/details/76610052 目的 在大三开始学习spring时,老师就说spring bean周期非常 ...

  8. spring生命周期流程图

    Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring ...

  9. spring源码学习(四)-spring生命周期用到的后置处理器

    生命周期的九大后置处理器 第一次调用后置处理器org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory# ...

  10. 七、spring生命周期之初始化和销毁方法

    一.通过@Bean指定初始化和销毁方法 在以往的xml中,我们是这样配置的 <bean id="exampleInitBean" class="examples.E ...

随机推荐

  1. day35-python 操作memcache二

    Memcache常用命令 存储命令: set/add/replace/append/prepend/cas 获取命令: get/gets 其他命令: delete/stats.. add方法 添加一条 ...

  2. Angular2 NgModule 模块详解

    原文  https://segmentfault.com/a/1190000007187393 我们今天要学习的是Angular2的模块系统,一般情况下我们使用一个根模块去启动我们的应用,然后使用许多 ...

  3. HDU5616 天平能否称出物体重量问题 01背包变形或者折半搜索

    //hdu5616 void solve1(){dp[0]=1;for(int i=1;i<=n;i++){for(int j=INF;j>=val[i];j--){dp[j]|=(dp[ ...

  4. nginx——优化 Nginx 站点目录

    1. 禁止解析指定目录下的指定程序 location ~ ^/data/.*.(php|php5|sh|pl|py)$ { # 根据实际来禁止哪些目录下的程序,且该配置必须写在 Nginx 解析 PH ...

  5. locate语法

    1.命令格式:locate [参数] [文件] 2.命令功能:locate命令可以在搜寻数据库时快速找到档案,数据库由updatedb程序来更新,updatedb是由cron daemon周期性建立的 ...

  6. 基于Verilog的串口发送程序

    一.模块框图及基本思路 tx_bps_module:波特率时钟产生模块 tx_control_module:串口发送的核心控制模块 tx_module:前两个模块的组合 control_module: ...

  7. 解决ubuntu下firefox的flash全屏后不能恢复问题 ZT

    sudo mkdir /etc/adobe echo "OverrideGPUValidation=true" >~/mms.cfg sudo mv ~/mms.cfg /e ...

  8. APP加急审核

    提交加急审核需要理由,一般涉及到银行信息,或者崩溃打不开这种的比较容易通过.反正苹果很苛刻,一般不给处理.如果处理第二天就可以下载最新了,省去了漫漫的等待.一个成功加急审核的借口-- We found ...

  9. tofile和fromfile数组内建函数

    numpy教程:基本输入输出和文件输入输出Input and output 使用数组的方法函数tofile可以方便地将数组中数据以二进制的格式写进文件.tofile输出的数据没有格式,因此用numpy ...

  10. Pyhon全栈之路----数据类型

    1.定义时不需要像C语言一样加 ' int ' , 'char ' 等,直接写即可,解释器会直接自动识别数据类型.例:  age = 22    (默认为数字类型)      name = 'Alex ...