spring bean生命周期-子篇-源码笔记

---------springbean的生命周期(简要版)--------------------

在这里插入图片描述

在这里插入图片描述

---------实例化-------------
实例化 Instantiation--
期间所做工作:即调用Bean的构造函数,JVM创建对象(并不是完整的bean), 例:Student st=new Student();这样就行了


---------属性赋值-------------
属性赋值 Populate--申明时赋值,或理解为改变一个类变量的值
期间所做工作:IOC 依赖注入(和成员变量赋值)、成员方法(set方法)初始化、
拓展:
Bean若实现了 BeanNameAware 接口,会调自已拓展实现的 setBeanName(String)方法
Bean若实现了 BeanFactoryAware 接口,会调自已拓展实现的 setBeanFactory(BeanFactory)方法
Bean若实现了 ApplicationContextAware 接口,会调自已拓展实现的setApplicationContext(ApplicationContext)方法
Bean若实现了 BeanPostProcessor 接口,会调自已拓展实现的postProcessBeforeInitialization(Object obj, String s)方法 

----------初始化------------
初始化 Initialization(即调用Bean的setter,设置Bean的属性)---非申明时直接赋值,对象中的各字段值进行赋一下初始值
期间所做工作: init-method 属性调用,如果没实现就不用做啥
拓展:
Bean若实现了 BeanPostProcessor 接口,会调自已拓展实现的postProcessAfterInitialization(Object obj, String s)方法 (等同Spring 配置文件中配置了 init-method 属性)

----------销毁之前要调的方法------------
销毁 Destruction---
期间所做工作:对象没使用了,也没被引用传递了,就随便GC销毁
拓展:
Bean若实现了 方法上的 @PostConstruct (等同Spring 配置文件中配置了init-method  属性)
Bean若实现了 DisposableBean 接口,destroy()方法 (等同Spring 配置文件中配置了 destroy-method属性和方法上的@PreDestroy)
 

---------springbean的生命周期--完整版---------

一、进阶版spring bean的完整生命周期巧记:

1)启动IOC容器--ApplicationContext
2)调用容器的refresh()方法
2.1)在refresh()方法中,先解析XML的bean配置和注解@autowired等
2.2)做一些预处理,比如设置类加载器
2.3)生成beandefinition(未实例化)数据-生成BeanDefinition建模对象
2.4)注册bean的前后置处理器 BeanPostProcessor(这只是注册加载后置处理器,真正执行是在bean的初始化方法init-method前后)
2.5)接下来调#createBean进行bean正式实例化-创建JVM对象和属性赋值等:
2.5.1)单例、非懒加载、非抽象,才会调用getBean实例化
2.5.2) 先调getSingleton(beanName),从缓存中获取bean,依次从1,2,3级缓存中拿实例,都没有才去创建对应的Bean实例
2.5.3)调doCreateBean再调用createBeanInstance方法进行Bean的实例化。
2.5.3.1)createBeanInstance方法,先创建bean实例对象(执行构造函数),即JVM堆已分配;
2.5.3.2)把创建好的bean存放在容器缓存中 //存入三级缓存-解决循环依赖最关键点;
2.5.3.3)bean属性赋值(注入相关依赖);
2.5.3.4)调用bean的初始化方法,执行前后置处理器BeanpostProcessor
2.5.3.5)调getSingleton进行缓存移动,移入二级缓存;;
2.5.3.6)注册bean的销毁前指行的方法,即JVM堆GC前会调的方法;
2.6)bean创建完,还会调#addSingleton立马刷入一级缓存-put到单例池——bean完成;
在#doGetBean里执行

二、源码完整笔记:

----------------------@PostConstruct-----------------

@PostConstruct

@PostConstruct注解好多人以为是Spring提供的。其实是Java自己的注解。
Java中该注解的说明:@PostConstruct该注解被用来修饰一个非静态的void()方法。被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。

通常我们会是在Spring框架中使用到@PostConstruct注解 该注解的方法在整个Bean初始化中的执行顺序:
Constructor(构造方法) -> @Autowired(依赖注入) -> @PostConstruct(注释的方法)

参考:https://blog.csdn.net/qq360694660/article/details/82877222

@PostConstruct与static的区别:构造方法的加载都在@PostConstruct注解的方法前,而static修饰的方法是在构造方法前的(当前类,所以static比@PostConstruct更优先加载)

以下参考:https://blog.csdn.net/zl834205311/article/details/78803845

----------------------继承InitializingBean,重写afterPropertiesSet----------------

容器初始化类AbstractAutowireCapableBeanFactory.invokeInitMethods方法里,会有判断:是否继承了InitializingBean,有就会属性初始化后调用一下afterPropertiesSet

----------------------XML来配置Bean的话,可以指定属性init-method---------------

<bean id="testInitializingBean" class="com.TestInitializingMyBean" init-method="testMyInit"></bean>

注意:TestInitializingMyBean这个bean里要有自定义的testMyInit方法,bean容器启动加载后会执行这个方法

建议这样写:
<!-- 容器启动后执行:需要执行初始化方法,所以必须直接实例化,取消懒加载-->
<bean id="initData" class="com.TestInitializingMyBean" init-method="testMyInit"  lazy-init="false" />

--------实现ApplicationListener<ContextRefreshedEvent>接口的onApplicationEvent方法----------------

当Spring将所有的Bean都初始化完成后,会执行如下接口的方法onApplicationEvent

@Component  
public class InstantiationTracingBeanPostProcessor implements  
        ApplicationListener<ContextRefreshedEvent> {  
  
    @Override  
    public void onApplicationEvent(ContextRefreshedEvent arg0) {  
        System.out.println("-----所有Bean载入完成---");  
    }  
}  

--------实现BeanPostProcessor接口的onApplicationEvent方法----------------

BeanPostProcessor,针对所有Spring上下文中所有的bean初始化前后进行拦截,可以在配置文档applicationContext.xml中配置一个BeanPostProcessor,然后对所有的bean进行一个初始化之前和之后的代理。BeanPostProcessor接口中有两个方法: postProcessBeforeInitialization和postProcessAfterInitialization。 postProcessBeforeInitialization方法在bean初始化之前执行, postProcessAfterInitialization方法在bean初始化之后执行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

java_爱吃肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值