IOC流程:
1)准备工作,设置启动时间,设置closed为false,设置active为true,初始化一些资源,创建一些set
2.1)创建工厂,创建出来的工厂名字叫做DefaultListableBeanFactory
2.2)设置工厂的一些属性值
2.3)读取配置文件信息,将beanNanme和beanClass设置到Definitions中
//2.1
DefaultListableBeanFactory beanFactory = createBeanFactory();
//2.2
beanFactory.setSerializationId(getId());
customizeBeanFactory(beanFactory);
//2.3
loadBeanDefinitions(beanFactory);
this.beanFactory = beanFactory;
3)初始化beanFactory的属性
prepareBeanFactory(beanFactory);
4)执行一些扩展方法,没有默认实现,需要的时候再进行实现
protected void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) {
}
5)实例化并调用所有已注册的BeanFactoryPostProcessor Bean
invokeBeanFactoryPostProcessors(beanFactory);
6)将实例化好的BeanFactoryPostProcessor注册进去
registerBeanPostProcessors(beanFactory);
7)做一些国际化处理,可以不理它
initMessageSource();
8)初始化多播器,和监听器,方便后面进行事件的监听和广播
initApplicationEventMulticaster();
registerListeners();
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");
// Prepare this context for refreshing.
//(1)准备容器环境
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
//(2)获取新鲜的工厂,创建出来的工厂名字叫做DefaultListableBeanFactory
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for use in this context.
(3)
prepareBeanFactory(beanFactory);
try {
// Allows post-processing of the bean factory in context subclasses.
4)
postProcessBeanFactory(beanFactory);
StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");
// Invoke factory processors registered as beans in the context.
(5)
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
(6)
registerBeanPostProcessors(beanFactory);
beanPostProcess.end();
// Initialize message source for this context.
initMessageSource();
// Initialize event multicaster for this context.
(7)
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclasses.
onRefresh();
// Check for listener beans and register them.
(8)
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
(9)
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
finishRefresh();
}
以上是在对做一些工厂的准备工作,对应我们图上的左边部分,到了第九步,就要开始实例化bean了
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
(1)先遍历List,取出所有的BeanDefinition,对里面的bean进行实例化
(1.1)先从单例池中拿,拿不到再开始进行实例化
// Eagerly check singleton cache for manually registered singletons.
Object sharedInstance = getSingleton(beanName);
(1.2)获取构造方法,利用反射进行bean的创建
Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
return instantiateBean(beanName, mbd);
return ctor.newInstance(argsWithDefaultValues);
(2)实例化bean后,就开始填充属性
populateBean(beanName, mbd, instanceWrapper);
(3)填充完属性就开始调用aware方法,以及调用BeanPostProcessor:before,执行init,初始化bean,以及调用BeanPostProcessor:after方法
exposedObject = initializeBean(beanName, exposedObject, mbd);
点进去:
invokeAwareMethods(beanName, bean);
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
invokeInitMethods(beanName, wrappedBean, mbd);
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
以上是一个bean被创建的完整过程的主要脉络,至于AOP,循环依赖等,都是在这个脉络中的分支,只要理清了AbstractApplicationContext这个抽象类中的refresh()方法,那看源码时就不会晕了