文章目录
1、Spring IOC初始化整体流程
1.1 Spring IOC的容器体系介绍
IOC容器是Spring的核心模块,是抽象了对象管理、依赖关系管理的框架解决方案。Spring 提供了很多的容器,其中 BeanFactory 是顶层容器接口(根容器),不能被实例化,它定义了所有 IOC 容器必须遵从的一套原则,具体的容器实现可以增加额外的功能,比如我们常用到的ApplicationContext,其下更具体的实现如 ClassPathXmlApplicationContext 包含了解析 xml 等一系列的内容, AnnotationConfigApplicationContext 则是包含了注解解析等一系列的内容。Spring IOC 容器继承体系非常聪明,需要使用哪个层次用哪个层次即可,不必使用功能大而全的。
1.2 编写测试代码
@Test
public void testIoC() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
LagouBean lagouBean = applicationContext.getBean(LagouBean.class);
System.out.println(lagouBean);
}
1.3 初始化整体流程源码剖析
进入ClassPathXmlApplicationContext类,可以看到这个类的构造方法如下所示:
public ClassPathXmlApplicationContext(
String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
throws BeansException {
// 初始化父类
super(parent);
// 设置本地的配置信息
setConfigLocations(configLocations);
// 完成spring容器的初始化
if (refresh) {
refresh();
}
}
进入refresh()方法中,可以看到整体初始化流程源码如下:
public void refresh() throws BeansException, IllegalStateException {
// 对象锁加锁,启动的过程中不能被close()或其他方法调用
synchronized (this.startupShutdownMonitor) {
/**
* 刷新前的预处理
* 表示在真正做refresh操作之前需要准备做的事情:
* 设置Spring容器的启动时间
* 开启活跃状态、撤销关闭状态
* 验证环境信息里一些必须存在的属性等
*/
prepareRefresh();
/**
* 加载BeanFactory(实例化工厂),默认实现是DefaultListableBeanFactory
* 加载Bean信息并封装成BeanDefinition
* 然后注册到BeanDefinitionRegistry(以key/value形式放入map中)
*/
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
/**
* BeanFactory的预准备工作(BeanFactory进行一些设置,比如context的类加载器等)
*/
prepareBeanFactory(beanFactory);
try {
/**
* BeanFactory的准备工作完成后进行后置处理工作
*/
postProcessBeanFactory(beanFactory);
/**
* 实例化实现了BeanFactoryPostProcessor接口的Bean,并调用接口方法
*/
invokeBeanFactoryPostProcessors(beanFactory);
/**
* 注册BeanPostProcessor(Bean的后置处理器,在创建Bean的前后等执行)
*/
registerBeanPostProcessors(beanFactory);
/**
* 初始化MessageSource组件(做国际化功能:消息绑定,消息解析)
*/
initMessageSource();
/**
* 初始化时间派发器
*/
initApplicationEventMulticaster();
/**
* 子类重写这个方法,在容器刷新的时候可以自定义逻辑:如创建Tomcat、Jetty等web服务器
*/
onRefresh();
/**
* 注册应用的监听器,就是注册实现了ApplicationListener接口的监听器Bean
*/
registerListeners();
/**
* 初始化所有的剩下的非懒加载的单例bean
* 初始化创建非懒加载方式的单例Bean实例(未设置属性)
* 填充属性
* 初始化方法调用(比如调用afterPropertiesSet方法,init-method方法)
* 调用BeanPostProcessor(后置处理器)对实例Bean进行后置处理
* 解决循环依赖是在这个过程中
*/
finishBeanFactoryInitialization(beanFactory);
/**
* 完成context的刷新。主要是调用LifecycleProcessor的onRefresh()方法,并且发布事件(ContextRefreshedEvent)
*/
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();
}
}
}
1.4 初始化整体流程与时序图
初始化整体流程与时序图如下:
1)刷新前的预处理
2)加载BeanFactory(实例化工厂),默认实现是DefaultList