本系列帖子为鼠鼠复习八股巩固记忆和个人理解所写,如有错误纯属本人实力不佳,欢迎各位大佬阅读指正
1.Bean的生命周期?
实例化Instantiation,Spring根据BeanDefinition,利用反射创建Bean原始对象。
属性填充Populate Bean,自动扫描依赖,通过反射完成依赖注入(DI),给对象属性赋值。
Aware接口回调,容器检测Bean是否实现各类Aware接口,注入容器相关资源。
BeanPostProcessor前置处理postProcessBeforeInitialization,执行后置处理器的初始化前置方法,可对Bean进行包装修改。
初始化Initialization
BeanPostProcessor后置处理postProcessAfterInitialization,初始化完成后执行,AOP代理就是在这里生成代理对象。
容器关闭,销毁Destruction
2.Bean是否单例?
默认单例,但不是全部都是单例,由scope作用域决定。
作用域:
singleton,单例整个IOC容器中只创建一个Bean实例,容器启动时创建,存入单例池复用。
prototype,多例每次getBean()都会新建全新对象,容器不管理它的销毁,适用于状态非常瞬时的Bean。
request,一次HTTP请求创建一个实例,仅在Spring Web应用程序有效 ,适用于web应用中需求局部性Bean。
session,同一个会话一个实例,该Bean实例在用户会话范围内共享,尽在Spring web应用中有效,适用于用户会话相关Bean。
globalSession,Protlet相关,极少使用。
application,整个web应用全局共享,尽在Spring web应用中有效,适用于应用程序范围内共享的Bean。
webSocket,在webSocket范围内只存在一个Bean实例,仅在支持WebSocket的应用程序中有效,适用于在WebSocket会话范围内共享的Bean。
custom scopes,Spring允许开发者自定义作用域,通过实现Scope接口来创建新的Bean作用域。
追问:Bean的单例和非单例,生命周期是否一样?
创建阶段生命周期一致,销毁阶段完全不同。
销毁阶段:
单例:容器启动时创建,存入单例池,容器关闭时,IOC容器自动触发销毁方法。
多例:每次getBean都会创建实例,Spring容器不负责维护prototype Bean的销毁工作,容器关闭时不会主动调用它的销毁回调,资源释放需要业务自己手动处理。