大致分为3个阶段:创建、使用、销毁
创建可详细分为:实例化、初始化、注册destruction回调
创建流程主要在AbstractAutowireCapableBeanFactory这个类中
销毁流程主要在DisposableBeanAdapter这个类中
1、创建
源码找到AbstractAutowireCapableBeanFactory类
1、实例化Bean
- 方法createBeanInstance
public abstract class AbstractAutowireCapableBeanFactory extends... {
protected Object doCreateBean()throws BeanCreationException {
...
if (instanceWrapper == null) {
// 根据指定bean使用对应的策略创建新的实例
// 如: 工厂方法 构造函数自动注入 简单初始化
instanceWrapper = createBeanInstance(beanName, mbd, args);
}
Object bean = instanceWrapper.getWrappedInstance();
...
if (earlySingletonExposure) {
...
// 避免循环依赖, 在bean初始化完成前 将创建实例的ObjectFactory加入三级缓存
addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
}
}
}
这里插一句:实例化后会将beanName、beanDefinition、beanInstance封装成一个bean对象工厂放进三级缓存,其实就是一个函数式接口实现类,后面遇到循环依赖就会从缓存中获取beanInstance
2、设置属性
- 方法populateBean
这一步主要就是填充bean,简单讲就是set各种属性,发现循环依赖就会递归初始化依赖的bean
public abstract class AbstractAutowireCapableBeanFactory extends... {
protected Object doCreateBean()throws BeanCreationException {
...
//装配bean 将各个属性注入其中 可能存在依赖其他bean的属性则会递归初始化依赖的bean
populateBean(beanName, mbd, instanceWrapper);
}
protected void populateBean(...) {
...
// 根据beanName注入
if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {
autowireByName(beanName, mbd, bw, newPvs);
}
// 根据beanType注入
if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
autowireByType(beanName, mbd, bw, newPvs);
}
...
}
}
3、检查Aware接口实现
- 方法invokeAwareMethods
(initializeBean方法中调用)
检查当bean是否实现了BeanNameAware、BeanClassLoaderAware、BeanFactoryAware接口,spring会自动帮我们调用这些接口的实现方法
public abstract class AbstractAutowireCapableBeanFactory extends... {
protected Object doCreateBean()throws BeanCreationException {
...
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
protected Object initializeBean(...) {
//对bean的特殊处理执行aware beanClassLoaderAware beanFactoryAware
invokeAwareMethods(beanName, bean);
}
}
4、BeanPostProcessor前置处理
- 方法applyBeanPostProcessorsBeforeInitialization
(initializeBean方法中调用)
检查当bean是否实现了BeanPostProcessor接口, 并执行postProcessBeforeInitialization方法对当前bean进行处理
public abstract class AbstractAutowireCapableBeanFactory extends... {
protected Object doCreateBean()throws BeanCreationException {
...
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
protected Object initializeBean(...) {
//后置处理器
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
}
5、InitializingBean (这一步可以理解为 依赖注入 完之后, 你希望spring帮忙执行的一些逻辑)
方法afterPropertiesSet initializeBean方法 -> invokeInitMethods方法中调用
检查当bean是否实现了InitializingBean接口, 并执行afterPropertiesSet方法, 比如你可以用这个接口实现一个策略工厂, 将一个接口所有的实现类封装进一个工厂的Map中
public abstract class AbstractAutowireCapableBeanFactory extends... {
protected Object doCreateBean()throws BeanCreationException {
...
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
protected Object initializeBean(...) {
//激活用户自定义的initMethod方法
invokeInitMethods(beanName, wrappedBean, mbd);
}
protected void invokeInitMethods(...) throws Throwable {
//如果实现可InitializingBean接口 调用afterPropertiesSet方法
((InitializingBean) bean).afterPropertiesSet();
}
}
6、执行自定义的init-method方法
- 方法invokeCustomInitMethod
initializeBean方法 -> invokeInitMethods方法中调用
public abstract class AbstractAutowireCapableBeanFactory extends... {
protected Object doCreateBean()throws BeanCreationException {
...
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
protected Object initializeBean(...) {
//激活用户自定义的initMethod方法
invokeInitMethods(beanName, wrappedBean, mbd);
}
protected void invokeInitMethods(...) throws Throwable {
//执行用户自定义init方法
invokeCustomInitMethod(beanName, bean, mbd, initMethodName);
}
}
7、BeanPostProcessor后置处理
- 方法applyBeanPostProcessorsAfterInitialization
(initializeBean方法中调用)
检查当bean是否实现了BeanPostProcessor接口, 并执行postProcessAfterInitialization方法对当前bean进行处理
public abstract class AbstractAutowireCapableBeanFactory extends... {
protected Object doCreateBean()throws BeanCreationException {
...
exposedObject = initializeBean(beanName, exposedObject, mbd);
}
protected Object initializeBean(...) {
//应用后处理器
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}
}
到这里这个bean其实已经可用了
8、注册destruction回调
- 方法registerDisposableBeanIfNecessary
检查当前bean是否实现了DisposableBean接口或自定义了销毁方法,spring容器会给当前bean注册一个销毁回调 (在容器关闭的时候执行这段逻辑)
public abstract class AbstractAutowireCapableBeanFactory extends... {
protected Object doCreateBean()throws BeanCreationException {
...
//根据scope注册bean 如果实现了了destroy-method 这里就会注册以便销毁的时候调用
registerDisposableBeanIfNecessary(beanName, bean, mbd);
}
}
2、使用
以上8步走完这个bean就完全初始化好了, 此时就可以使用了
3、销毁
源码找到DisposableBeanAdapter类
容器关闭的时候会执行DisposableBeanAdapter#destroy()方法
- DisposableBean接口的destroy方法
- 配置文件中配置的destory-method方法
主要执行这两个方法中的逻辑