狭义
广义
在传统的 Java 应用中,Bean 的生命周期很简单,使用关键字 new 实例化 Bean,当不需要该 Bean 时,由 Java 自动进行垃圾回收。
Spring Bean的生命周期只有这四个阶段。
1.实例化->Instantiation
2.属性赋值->Populate
3.初始化->Initialization
4.销毁->Destruction
实例化 -> 属性赋值 -> 初始化 -> 销毁
Spring Bean生命周期执行流程
在Spring中bean的生命周期就像我们在上面的图片看到一样,加了一些过滤条件(黑色框的平时基本上不会用到)。那分别介绍下上面的流程
1.Spring对bean进行实例化,调用bean的构造参数
2.设置对象属性,调用bean的set方法,将属性注入到bean的属性中
3.检查bean是否实现BeanNameAware、BeanFactoryAware、ApplicationContextAware接口,如果实现了这几个接口Spring会分别调用其中实现的方法。
BeanNameAware:setBeanName(String name)方法,参数是bean的ID
BeanFactoryAware:setBeanFactory(BeanFactory bf)方法,参数是BeanFactory容器
ApplicationContextAware:setApplicationContext(ApplicationContext context)方法,参数是bean所在的引用的上下文,如果是用Bean工厂创建bean,那就可以忽略ApplicationContextAware。
4.如果bean是否实现BeanPostProcessor接口,Spring会在初始化方法的前后分别调用postProcessBeforeInitialization和postProcessAfterInitialization方法
5.如果bean是否实现InitalizingBean接口,将调用afterPropertiesSet()方法
6.如果bean声明初始化方法,也会被调用
7.使用bean,bean将会一直保留在应用的上下文中,直到该应用上下文被销毁。
8.检查bean是否实现DisposableBean接口,Spring会调用它们的destory方法
9.如果bean声明销毁方法,该方法也会被调用
别人的博客
bean的生命周期
有几个细节问题
四个主生命周期
(1)实例化之前干预 InstantiationAwareBeanPostProcessorAdapter.postProcessBeforeInstantiation()
1.实例化
(2)实例化之后干预 InstantiationAwareBeanPostProcessorAdapter.postProcessAfterInstantiation()
2.填充属性(给属性赋值)
(1)初始化之前干预 BeanPostProcessor.postProcessBeforeInitialization()
3.初始化化(比如准备资源文件)
3) 属性进行干预 ----修改属性或属性值
(2)初始化之后干预 BeanPostProcessor.postProcessAfterInitialization()
4.销毁(释放资源—对象从内存销毁)
两个生命周期接口
实例化和属性赋值都是Spring帮助我们做的,能够自己实现的有初始化和销毁两个生命周期阶段。
1.InitializingBean 对应生命周期的初始化阶段,在源码的invokeInitMethods(beanName, wrappedBean, mbd);方法中调用。
2.DisposableBean 类似于InitializingBean,对应生命周期的销毁阶段,以ConfigurableApplicationContext#close()方法作为入口,实现是通过循环取所有实现了DisposableBean接口的Bean然后调用其destroy()方法 。
**
总结:
**
Bean 生命周期的整个执行过程描述如下:
1.如果创建了一个类继承了InstantiationAwareBeanPostProcessorAdapter接口,并在配置文件中配置了该类的注入,即InstantiationAwareBeanPostProcessorAdapter和bean关联,则Spring将调用该接口的postProcessBeforeInstantiation()方法。
2.根据配置情况调用 Bean 构造方法或工厂方法实例化 Bean。
3.如果InstantiationAwareBeanPostProcessorAdapter和bean关联,则Spring将调用该接口的postProcessAfterInstantiation()方法。
4.利用依赖注入完成 Bean 中所有属性值的配置注入。
5.如果 Bean 实现了 BeanNameAware 接口,则 Spring 调用 Bean 的 setBeanName() 方法传入当前 Bean 的 id 值。
6.如果 Bean 实现了 BeanFactoryAware 接口,则 Spring 调用 setBeanFactory() 方法传入当前工厂实例的引用。
7.如果 Bean 实现了 ApplicationContextAware 接口,则 Spring 调用 setApplicationContext() 方法传入当前 ApplicationContext 实例的引用。
8.如果 BeanPostProcessor 和 Bean 关联,则 Spring 将调用该接口的预初始化方法 postProcessBeforeInitialzation() 对 Bean 进行加工操作,此处非常重要,Spring 的 AOP 就是利用它实现的。
9.如果 Bean 实现了 InitializingBean 接口,则 Spring 将调用 afterPropertiesSet() 方法。
10.如果在配置文件中通过 init-method 属性指定了初始化方法,则调用该初始化方法。
11.如果 BeanPostProcessor 和 Bean 关联,则 Spring 将调用该接口的初始化方法 postProcessAfterInitialization()。
注意:以上工作完后才能以后就可以应用这个bean了,那这个bean是一个singleton的,所以一般这种情况下我们调用同一个id的bean会是在内容地址相同的实例,当然在spring配置文件中也可以配置非Singleton。
12.如果 Bean 实现了 DisposableBean 接口,则 Spring 会调用 destory() 方法将 Spring 中的 Bean 销毁;如果在配置文件中通过 destory-method 属性指定了 Bean 的销毁方法,则 Spring 将调用该方法对 Bean 进行销毁。
引用
引用