Spring Bean生命周期

SpringBean加载过程

Spring Bean生命周期

1. 容器启动Spring根据配置扫描指定路径的注解和配置文件中配置的Bean标签

注解类似于 Controller Service Component
bean标签则是application xml中配置的

2. 生成BeanDefinition

容器收集到了类信息封装成一个个 ,将这些BeanDefinition集中存储到了BeanDefinitionMap之中,以类名首字母小写为key,BeanDefinition为value(一般为GenericBeandefinition)

3.创建然后调用BeanFactoryPostProcessor

BeanFactory组建BeanFactoryPostProcessor
然后调用BeanFactoryPostProcessor(bean工厂后置处理器)的PostProcessorBeanFactory
在BeanFactory标准初始化之后调用,这时所有的bean定义已经保存加载到BeanDefinitionMap,来定制和修改BeanFactory的内容,如覆盖或添加属性

4.构造方法创建bean

根据BeanDefinition,利用反射实例化bean对象,默认调用无参构造方法

4. 调用Aware感知接口

4.1 BeanNameAware

调用setBeanName()方法给Bean设定beanName

4.2 BeanFactoryAware

调用setBeanFactory方法设置BeanFactory
BeanFactory是最基本的IOC容器只是一个接口,只有最基本的依赖注入(DI)功能
官方解释是提供给使用者获取beanFactory的功能,因为容器不一定只有一个

4.3 ApplicationContextAware

调用setApplicationContext()
ApplicationContext为应用上下文,它包含多种企业级的服务,例如解析配置文本信息等等

5.BeanPostProcessor (bean后置处理器)

预加载方法postProcessBeforeInitialization

6.如果bean实现了InitializingBean接口

如果bean实现了InitializingBean接口会调用bean的afterPropertiesSet方法,用于在初始化bean进行特殊处理,初始化bean。

7.BeanPostProcessor (bean后置处理器)

初始化之后的方法postProcessAfterInitialization

8.bean放入单例池

9.容器关闭 调用disposableBean的destory方法

10.调用bean自定义的destory

11.销毁

知识点

1.类信息池 BeanDefinitionMap

类型

ConcurrentHashMap

存储结构

key:beanName
value:BeanDefinition 类配置信息

2.单例池 SingletonObjects

类型

ConcurrentHashMap

存储结构

Key:beanName
value:bean的实例

3.Scope 生命周期类型

  • 默认的值是singleton(単例),spring容器只会创建一个相应的bean实例,所有的对该bean的请求,spring容器都只返回这个实例。
  • 还可取值proptotype(原型) ,每次请求都会获得新的bean实例。
  • 还可取值request、session、global session等(不常用)

singleton

spring容器中共享一个实例,内存占用少,GC开销小

proptotype

容器负责创建,由GC回收,多个实例,内存占用多,GC开销大

4.SpringBean加载方式

懒加载

实现方式

实体类加注解@Lazy
XML中加属性lazy-init=“true”

缺点

  • 因为指令重排有可能出现线程安全问题
  • 如果初始化有错误不能提前发现

优点

节省资源什么时候使用什么时候加载。

非懒加载

实现方式

默认情况就是非懒加载

缺点

浪费资源,和容器生命周期差不多一样长

优点

能提前发现错误

5.SpringBean如何定义

XML文件中定义或者通过注解(常见的Controller、service、Component)或者用@Autowired修饰成员变量

附录 参考文档和学习视频

https://www.bilibili.com/video/BV1F64y1F7Qt?p=1
http://blog.****.net/themessi/article/details/109022199