1.基本概念
- bean 就是由IOC 容器初始化、装配及管理的对象。
- Spring中的bean默认都是单例的,那么单例Bean在多线程程序下如何保证线程安全呢?
- Spring的单例是基于BeanFactory也就是Spring容器的,单例Bean在此容器内只有一个,Java的单例是基于 JVM,每个 JVM 内只有一个实例。所以非分布式服务情况下,单例Bean可以保证线程安全
2.Bean的作用范围
创建一个bean定义,其实质是用该bean定义对应的类来创建真正实例的“配方”。把bean定义看成一个配方很有意义,它与class很类似,只根据一张“处方”就可以创建多个实例。不仅可以控制注入到对象中的各种依赖和配置值,还可以控制该对象的作用域。这样可以灵活选择所建对象的作用域,而不必在Java Class级定义作用域。
Spring Framework支持五种作用域
类别 | 作用域 | 说明 |
Singlenton | 在Spring IoC容器中只会存在一个共享的 bean 实例,bean以单例方式存在,默认模式 | |
Prototpye | 表示一个 bean 定义对应多个对象实例。 prototype 作用域的 bean 会导致在每次对该 bean 请求时,都返回一个新的实例 | |
Request | 只适用于webApplicationContext 环境 | 每一次 HTTP 请求都会产生一个新的bean |
Session | 每一次 HTTP 请求都会产生一个新的 bean,同时该 bean 仅在当前 HTTP session 内有效.与request作用域一样 | |
globalSession | 定于全局portlet Session的生命周期范围 |
3.bean的生命周期
引用:https://zhuanlan.zhihu.com/p/108198655
Bean 的生命周期概括起来就是 4 个阶段
- 实例化(Instantiation)
- 属性赋值(Populate)
- 初始化(Initialization)
- 销毁(Destruction)
实例化过程:
BeanWrapper调用createBeanInstance方法。
属性赋值:
bean 设置相关属性和依赖
初始化:
(主要了解Bean在实例)
Aware接口:
- Spring 检测到 bean 实现了 Aware 接口,则会为其注入相应的依赖。
BeanFactory 类型的容器
- BeanNameAware:注入当前 bean 对应 beanName;
- BeanClassLoaderAware:注入加载当前 bean 的 ClassLoader(类加载器);
- BeanFactoryAware:注入 当前BeanFactory容器 的引用。
ApplicationContext 类型的容器
- EnvironmentAware:注入 Enviroment,一般用于获取配置属性;
- EmbeddedValueResolverAware:注入 EmbeddedValueResolver(Spring EL解析器),一般用于参数解析;
- ApplicationContextAware(ResourceLoader、ApplicationEventPublisherAware、MessageSourceAware):注入 ApplicationContext 容器本身。
BeanPostProcessor后置处理器
public interface BeanPostProcessor {
// 初始化前置处理
default Object postProcessBeforeInitialization(Object bean,
String beanName) throws BeansException {
return bean;
}
// 初始化后置处理
default Object postProcessAfterInitialization(Object bean,
String beanName) throws BeansException {
return bean;
}
}
InitializingBean 和 init-method 是 Spring 为 bean 初始化提供的扩展点。(可以扩展初始化逻辑)
DisposableBean 和 destory-method是 Spring 为 bean 销毁提供的扩展点
bean生命周期详细过程如下:
- ResouceLoader加载配置信息
- 解析配置信息,生成一个一个的BeanDefintion
- BeanDefintion由BeanDefintionRegistry管理起来
- BeanFactoryPostProcessor对配置信息进行加工(也就是处理配置的信息,一般通过PropertyPlaceholderConfigurer来实现)
- 实例化Bean
- 如果该Bean配置/实现了InstantiationAwareBean,则调用对应的方法
- 使用BeanWarpper来完成对象之间的属性配置(依赖)
- 如果该Bean配置/实现了Aware接口,则调用对应的方法
- 如果该Bean配置了BeanPostProcessor的before方法,则调用
- 如果该Bean配置了init-method或者实现InstantiationBean,则调用对应的方法
- 如果该Bean配置了BeanPostProcessor的after方法,则调用
- 将对象放入到HashMap中
- 最后如果配置了destroy或者DisposableBean的方法,则执行销毁操作
总结:
首先是实例化、属性赋值、初始化、销毁这 4 个大阶段
再是初始化的具体操作,有 Aware 接口的依赖注入、BeanPostProcessor 在初始化前后的处理以及 InitializingBean 和 init-method 的初始化操作;(或**@PostConstruct注解**)
销毁的具体操作,有注册相关销毁回调接口,最后通过DisposableBean 和 destory-method 进行销毁。(@PreDestory注解也可实现)