refresh()
prepareRefresh();
准备上下文的环境
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
告诉子类刷新内部bean工厂
createBeanFactory()
创建Bean工厂
customizeBeanFactory
如果用户自定义了允许Bean定义覆盖和允许循环引用则设置为定义的,<br>默认为不允许<br>
loadBeanDefinitions
加载bean,根据上下文不同,会由不同的解析器加载,例如xml,web,注解等
prepareBeanFactory(beanFactory);
这个方法主要是配置BeanFactory的各种类加载器,需要的依赖和需要忽略的依赖,后处理器,解析器等
postProcessBeanFactory(beanFactory);
空实现<br>允许子类添往bean工厂里添加一下自己的公用bean,像子类的一些包扫描加载的bean
invokeBeanFactoryPostProcessors(beanFactory);
实现了BeanFactoryPostProcessor的bean会在这步直接初始化,<br>初始化后后面其他bean实例化时就可以被这个bean"监控到"
调用之前加载进去beanFactory里面的处理器,可以修改各个注册的Bean或动态注册bean
invokeBeanFactoryPostProcessors
invokeBeanDefinitionRegistryPostProcessors
这个是注册bean了,如果是通过注释启动的容器(配置类),就会通过配置类为起点开始进行各种扫描,各种bean进行注册
postProcessBeanDefinitionRegistry
这里是注释解析器
ConfigurationClassPostProcessor
基本上大部分的基于注解的解析功能都在这里了
ConfigurationClassParser
创建一个配置类解析
ComponentScanAnnotationParser
processConfigBeanDefinitions
parser.parse
这里开始解析@controller,@servcie等等那些注解
processConfigurationClass
processConfigurationClass
BeanDefinitionRegistryPostProcessor
postProcessBeanDefinitionRegistry
可以动态将Bean注册
invokeBeanFactoryPostProcessors
BeanFactoryPostProcessor
postProcessBeanFactory
可以修改各个注册的Bean
通过该接口修改IOC容器里的bean定义,一般用不到<br>但如果需要修改第三方接口IOC容器的bean定义,这个是最好的接入点
registerBeanPostProcessors(beanFactory);
实现了BeanPostProcessor的bean会在这步直接初始化,<br>初始化后后面其他bean实例化时就可以被这个bean"监控到"<br>
initMessageSource();
初始化上下文的消息源。
initApplicationEventMulticaster();
初始化上下文的事件传播器
onRefresh();
在特定上下文子类中初始化其他特殊bean
registerListeners();
检查监听器bean并注册它们
finishBeanFactoryInitialization(beanFactory);
所有初始化工作已经准备完毕,把bean工厂作为参数传入,准备调用bean工厂,实例化bean
DefaultListableBeanFactory
beanFactory.preInstantiateSingletons();
List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);
获取所有bean定义
for (String beanName : beanNames) {
一个个实例化
getBean(beanName)
AbstractBeanFactory
doGetBean
getSingleton(<br>beanName,<br>singletonFactory)<br>lamba表达式<br>
先尝试从缓存map里取
singletonFactory
AbstractAutowireCapableBeanFactory
createBean
resolveBeforeInstantiation
Give BeanPostProcessors a chance to return a proxy instead of the target bean instance
InstantiationAwareBeanPostProcessor
postProcessBeforeInstantiation
doCreateBean
createBeanInstance(beanName, mbd, args);
instantiateBean
调用构造函数实例化
boolean earlySingletonExposure
是否允许提前暴露?
是否单例?
是否创建中?
是否允许循环依赖?
addSingletonFactory
允许提前暴露则把bean存到缓存map中
此时bean的生命周期没有完成,只是实例一个对象到map里,
populateBean
注入工作
InstantiationAwareBeanPostProcessor
扩展点:循环一个个后置处理器
postProcessAfterInstantiation
autowire
自动注入
bean里面的成员如果有@Autoware则解释
InstantiationAwareBeanPostProcessor
扩展点
postProcessPropertyValues
initializeBean
初始化
invokeAwareMethods
BeanNameAware
BeanClassLoaderAware
BeanFactoryAware
applyBeanPostProcessorsBeforeInitialization
BeanPostProcessor
postProcessBeforeInitialization
invokeInitMethods
InitializingBean
afterPropertiesSet
applyBeanPostProcessorsAfterInitialization
BeanPostProcessor
postProcessAfterInitialization
对象销毁时会调用
myDestory
自定义销毁方法
先执行DisposableBean再执行myDestory
addSingleton(beanName, singletonObject);
创建成功,加入缓存
SmartInitializingSingleton
afterSingletonsInstantiated
所有bean初始化完成后,触发
finishRefresh();
initLifecycleProcessor()
初始化属于bean自己的生命周期
LifecycleProcessor
如果没有,IOC默认创造一个<font color="#f15a23"><b>DefaultLifecycleProcessor</b></font>管理全部实现了LifecycleProcessor的类
getLifecycleProcessor().onRefresh();
DefaultLifecycleProcessor
对实现了Lifecycle的接口的bean开始属于它自己的生命周期,eureka
publishEvent(new ContextRefreshedEvent(this));