Spring Bean生命周期
Spring Bean生命周期
- SpringBean加载过程
- 知识点
- 附录 参考文档和学习视频
SpringBean加载过程
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