除了BeanPostProcessor、BeanFactory、Listener等特殊实例,大部分业务代码实例是在finishBeanFactoryInitialization(beanFactory);这一步实例化的。
对finishBeanFactoryInitialization(beanFactory)打断点来看看 单实例的创建流程。
单元测试
@Test
public void test01(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConifgOfAutowired.class);
BookService bookService = applicationContext.getBean(BookService.class);
System.out.println(bookService);
applicationContext.close();
}
配置类,扫描的包里有自定义的类就行。
@Configuration
@ComponentScan({"com.atguigu.service","com.atguigu.dao",
"com.atguigu.controller","com.atguigu.bean"})
public class MainConifgOfAutowired {
beanFactory.preInstantiateSingletons();初始化后剩下的单实例bean
preInstantiateSingletons方法
- 获取容器中的所有Bean,依次进行初始化和创建对象
- 获取Bean的定义信息;RootBeanDefinition
- 判断Bean不是抽象的,是单实例的,不是懒加载,满足条件则进行下一步;
- 判断是否是FactoryBean;是否是实现FactoryBean接口的Bean;
- 不是工厂Bean。利用getBean(beanName);创建对象
不是工厂Bean。利用getBean(beanName);创建对象
在将所有单实例创建完成后,会执行实现SmartInitializingSingleton实例的 afterSingletonsInstantiated 方法。
getBean方法
再进入doGetBean
- transformedBeanName 返回bean的规范名称
- Object sharedInstance = getSingleton(beanName); 从缓存中寻找bean
如何从缓存中寻找:会把单例的bean实例放到 singletonObjects 一个 线程安全的map中
回到doGetBean,如果缓存中有就执行完成,如果缓存没有 继续创建。
把断点调试到当前bean没有缓存的实例。 一个自定义的 Service
进行校验和标记
获取bean定义,先创建依赖的bean, 和创建当前bean一样,依然是调用 BeanFactory.getBean 去创建依赖bean
如果bean是单例的,就通过getSingleton创建bean
getSingleton方法
先看 sharedInstance = getSingleton(beanName, new ObjectFactory<Object>() {}),第二个参数是匿名内部类,一个 工厂。
singletonObject = singletonFactory.getObject();是在得到bean,下个标题讲这个方法
在singletonFactory.getObject()得到bean后,进行异常处理、创建完成后续工作
看看addSingleton方法,是对缓存的处理 singletonObjects 和 registeredSingletons 加缓存,singletonFactories和earlySingletonObjects减缓存
AbstractBeanFactory.createBean
getSingleton参数new了一个工厂去createBean 创建实例,执行getSingleton就会进入createBean方法。
断点进入的是 AbstractAutowireCapableBeanFactory
resolveBeforeInstantiation
InstantiationAwareBeanPostProcessor. postProcessBeforeInstantiation 在创建实例前执行
InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation 在创建实例后执行
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
执行BeanPostProcessor的 AfterInitialization ,在实例初始化后执行
doCreateBean(beanName, mbdToUse, args);
前面的InstantiationAwareBeanPostProcessor 没有能得到实例,则执行doCreateBean方法。
断点来到 AbstractAutowireCapableBeanFactory.doCreateBean
1.createBeanInstance(beanName, mbd, args); 是真正用反射创建实例的方法。
2.创建实例后,执行MergedBeanDefinitionPostProcessors
属性赋值、初始化
Bean属性赋值 populate方法
以下是populateBean方法
InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation 在创建实例后执行
还是InstantiationAwareBeanPostProcessor 执行 postProcessPropertyValues
applyPropertyValues,用set方法设置属性
Bean初始化 initializeBean(beanName, exposedObject, mbd)
回到doCreateBean ,设置了属性后,执行initializeBean
invokeAwareMethods ,判断bean如果实现了Aware接口,设置对应的Aware组件注入。
applyBeanPostProcessorsBeforeInitialization,遍历BeanPostProcessors 执行 postProcessBeforeInitialization
invokeInitMethods,执行bean的初始化方法。
自定义初始化方法有很多种方式 https://blog.csdn.net/u014203449/article/details/86665963
applyBeanPostProcessorsAfterInitialization,遍历BeanPostProcessors
到此为止,bean的初始化完成
registerDisposableBeanIfNecessary
回到 doCreateBean 方法。registerDisposableBeanIfNecessary 注册销毁方法
执行完这步,doCreateBean就执行完成,createBean也执行完成,回到了 getSingleton方法,继续讲过的加入Singleton缓存等步骤。