一、Spring Bean是什么
- Spring Bean是被实例的,组装的及被Spring容器管理的Java对象。Spring容器会自动完成@Bean对象的实例化
二、Spring Bean生命周期
Spring Bean的生命周期只有四个阶段:
实例化 -> 属性赋值 -> 初始化 -> 销毁
1.实例化Instantiation
2.属性赋值Populate
3.初始化Initialization
4.销毁Destruction
主要逻辑都在doCreate()方法中,逻辑清晰,就是顺序调用以下三个方法,这三个方法与三个生命周期阶段一一对应。 1.createBeanInstance() --> 实例化
2.populateBean() --> 属性赋值
3.initializeBean() --> 初始化
// 忽略了无关代码
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
throws BeanCreationException {
// Instantiate the bean.
BeanWrapper instanceWrapper = null;
if (instanceWrapper == null) {
// 实例化阶段!
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
// Initialize the bean instance.
Object exposedObject = bean;
try {
// 属性赋值阶段!
populateBean(beanName, mbd, instanceWrapper);
// 初始化阶段!
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
}
至于销毁,是在容器关闭时调用的,详见ConfigurableApplicationContext#close()
三、Spring Bean生命周期的扩展点
常用扩展点有两大类:
第一大类:影响多个Bean的接口
第二大类:只调用一次的接口
1.第一大类:影响多个Bean的接口
(1)BeanPostProcessor:作用于初始化阶段的前后
(2)InstantiationAwareBeanPostProcessor:作用于实例化阶段的前后
InstantiationAwareBeanPostProcessor实际上继承了BeanPostProcessor接口

2.第二大类:只调用一次的接口
(1)Aware类型的接口
Aware类型接口的作用就是让我们能够拿到Spring容器中的一些资源。Aware之前的名字就是可以拿到什么资源,例如BeanNameAware可以拿到BeanName,以此类推。
Aware都是在初始化阶段之前调用的。
Aware接口具体可以分为两组:
Aware Group1:
1)BeanNameAware
2)BeanClassLoaderAware
3)BeanFactoryAware
Aware Group2:
1)EnvironmentAware
2)EmbeddedValueResolverAware//实现该接口能够获取Spring EL解析器,用户的自定义注解需要支持spel表达式的时候可以使用,非常方便。
3)ApplicationContextAware
(ResourceLoaderAware\ApplicationEventPublisherAware\MessageSourceAware)//这几个接口其返回值实质上都是当前的ApplicationContext对象,因为ApplicationContext是一个复合接口。
(2)生命周期接口
实例化和属性赋值都是Spring帮助我们做的,能够自己实现的有初始化和销毁两个生命周期阶段。
1)InitializingBean对应生命周期的初始化阶段。另外,因为Aware方法都是执行在初始化方法之前,所以可以在初始化方法中放心大胆的使用Aware接口获取的资源,这也是我们自定义扩展Spring的常用方法。
2)DisposableBean类似于InitializingBean,对应生命周期的销毁阶段,以ConfigurableApplicationContext#close()方法作为入口,实现是通过循环获取所有实现了DisposableBean接口的Bean,然后调用其destory()方法。
四、Spring Bean加载过程

一个Bean的加载会经历这么几个阶段(用绿色标记):
1.获取BeanName,对传入的name进行解析,转化为可以从Map中获取到BeanDefinition的bean name。
2.合并Bean定义,对父类的定义进行合并和覆盖,如果父类还有父类,会进行递归合并,以获取完整的Bean定义信息。
3.实例化,使用构造或者工厂方法创建Bean实例。
4.属性填充,寻找并且注入依赖,依赖的Bean还会递归调用getBean方法获取。
5.初始化,调用自定义的初始化方法。
6.获取最终的Bean,如果FactoryBean需要调用getObject方法,如果需要类型转换调用TypeConverter进行转化。
整个流程最为复杂的是对循环依赖的解决方案。
更多内容:
Spring篇(1)--SpringBoot是什么?原理是怎么样的?
Spring篇(4-1)--Spring Bean 是什么及其生命周期阶段
本文详细介绍了SpringBean的概念、生命周期的四个关键阶段(实例化、属性赋值、初始化、销毁),并深入探讨了生命周期中的扩展点,包括BeanPostProcessor、InstantiationAwareBeanPostProcessor等接口的应用场景,以及Aware接口和生命周期接口的使用。
7501

被折叠的 条评论
为什么被折叠?



