版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/asdasd3418/article/details/80985170
引言
之前大致分析了spirngIOC容器的整体设计思路,接下来我们来分析一下spring是如何加载和解析bean的。
Bean加载流程
spring容器的初始化大致可以分为3个步骤:资源定位–>解析配置–>初始化。对应到一个bean来说,首先需要找到配置信息资源对应的位置,然后解析配置信息,最后初始化bean。
我们以ClassPathXmlApplicationContext为例,看看springIOC是如何初始化的。
我们从构造函数入手
public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
throws BeansException {
super(parent);
setConfigLocations(configLocations);
if (refresh) {
//初始化入口
refresh();
}
}
ClassPathXmlApplicationContext提供了多个构造函数,最后都会调用上面的构造函数。其中refresh方法触发了ioc容器的初始化。
找到AbstractApplicationContext的refresh方法
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// 主要做些准备工作,比如初始化环境信息的资源占位符
prepareRefresh();
// 获取beanFactory,资源的定位以及解析bean都是在这里发生
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 对beanFactory做一些设置,比如设置一些依赖注入需要忽略的接口,设置一些bean的后置处理器
prepareBeanFactory(beanFactory);
try {
// BeanFactory的后置处理,交由子类实现
postProcessBeanFactory(beanFactory);
// 调用BeanFatory的后置处理器。
invokeBeanFactoryPostProcessors(beanFactory);
// 注册bean的后置处理器
registerBeanPostProcessors(beanFactory);
// 初始化国际化相关
initMessageSource();
// 初始化事件广播
initApplicationEventMulticaster();
// 交由子类初始化特殊的bean
onRefresh();
// 注册listener,主要是实现ApplicationListener以及ApplicationEvent的类
registerListeners();
// 实例化并触发依赖注入
finishBeanFactoryInitialization(beanFactory);
// 初始化并触发LifecycleProcessor,分发刷新事件
finishRefresh();
}
catch (BeansException ex) {
if (logger.isWarnEnabled()) {
logger.warn("Exception encountered during context initialization - " +
"cancelling refresh attempt: " + ex);
}
// Destroy already created singletons to avoid dangling resources.
destroyBeans();
// Reset 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
finally {
// Reset common introspection caches in Spring's core, since we
// might not ever need metadata for singleton beans anymore...
resetCommonCaches();
}
}
}
这里可以看到IOC容器整体的初始化流程,过程比较清晰。我们重点关注资源的载入,解析和bean的实例化。