本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Bean 生命周期
容器使用map结构的三级缓存来存储对象,且整个bean的生命周期都是由容器来管理的,简单来说bean生命周期分为实例化、属性赋值、初始化、销毁四步,还有可详细扩展的地方。
在表述的时候不要只说图片中有的关键点,要学会扩展描述
设置对象这步骤 可以衍生出循环依赖的问题。
1.实例化Bean,通过反射生成对象并申请内存空间,对象属性都是默认值。
2.属性赋值,给Bean的属性赋值,为引用类型设置对应bean的引用。循环依赖的问题(三级缓存)
3.检查Aware相关接口并设置相关依赖,获取容器Bean的信息。
4.调用BeanPostProcessor的**前置处理方法
**。
5.调用初始化方法,若Bean实现了InitializingBean接口,则调用afterPropertiesSet方法。
6.调用BeanPostProcessor的**后置处理方法
**:spring的aop就是在此处实现的。
7.获取到完整的对象,可以通过getBean的方式获取对象。
8.销毁对象流程 :
①检查是否实现了DisposableBean接口,若实现了则调用destroy方法
②调用配置文件中配置的destroy-Method
方法。
Bean 的作用域
singleton、prototype、request、session、global-session、
1)singleton 单实例
定义bean时默认为singleton ,IOC容器每次返回同一个Bean。
2)prototype 多实例
每次调用getBean方法返回的都是新实例。
3)singleton 和 prototype 区别
第一 singleton 单实例,prototype 多实例
singleton 时,加载 spring 配置文件时候就会创建单实例对象。
prototype 时,在调用getBean方法时候创建多实例对象。
4)request 该属性仅对HTTP请求产生作用,使用该属性定义Bean时,每次HTTP请求都会创建一个新的Bean,适用于WebApplicationContext环境。
5)session 该属性仅用于HTTP Session,同一个Session共享一个Bean实例。不同Session使用不同的实例。
6)global-session 该属性仅用于HTTP Session,同session作用域不同的是,所有的Session共享一个Bean实例。