资料内容:
IOC容器概述
ApplicationContext接口相当于负责bean的初始化、配置和组装的IoC容器.
Spring为ApplicationContext提供了一些开箱即用的实现, 独立的应用可以使用
ClassPathXmlApplicationContext或者FileSystemXmlApplicationContext,web应用在web.xml配置监
听,提供xml位置和org.springframework.web.context.ContextLoaderListener即可初始化
WebApplicationContextIoC容器.
配置元数据
配置元数据配置了应用中实例的实例化、配置以及组装的规则,SpringIoC容器通过此配置进行管理
Bean. 配置元数据有以下几种方式:
基于XML配置: 清晰明了,简单易用
基于Java代码配置:无xml,通过 @Configuration 来声明配置、对象实例化与依赖关系
基于Java注解配置:少量的XML( <context:annotation-config/> ),通过注解声明实例化类与依
赖关系
后续的分析基于XML配置, 与Java代码和注解大体上的机制是一样
实例化容器
实例化容器非常简单,只需要提供本地配置路径或者根据 ApplicationContext 的构造器提供相应的资
源(Spring的另一个重要抽象)即可.
ApplicationContext context = new
ClassPathXmlApplicationContext("application.xml");
refresh()方法的实现代码如下
public void refresh() throws BeansException, IllegalStateException {
synchronized(this.startupShutdownMonitor) {
this.prepareRefresh(); // 准备工作
ConfigurableListableBeanFactory beanFactory =
this.obtainFreshBeanFactory(); // 获取ConfigurableListableBeanFactory最终的目的是
DefaultListableBeanFactory
this.prepareBeanFactory(beanFactory); // 准备bean工厂
try {
this.postProcessBeanFactory(beanFactory); // 一个空的实现,注意这里的
spring版本号为:5.3x
this.invokeBeanFactoryPostProcessors(beanFactory); // 注册bean的工厂
this.registerBeanPostProcessors(beanFactory);
this.initMessageSource(); // Spring 从所有的 @Bean 定义中抽取出来了
BeanPostProcessor,然后都注册进 beanPostProcessors,等待后面的的顺序调用 注册
BeanPostProcessor
this.initApplicationEventMulticaster(); // 初始化事件监听多路广播器
this.onRefresh(); // 一个空的实现
this.registerListeners(); // 注册监听器
this.finishBeanFactoryInitialization(beanFactory); // 到了spring加载流
程最复杂的一步,开始实例化所有的bd
this.finishRefresh();// 刷新完成工作
} catch (BeansException var9) {
if (this.logger.isWarnEnabled()) {
this.logger.warn("Exception encountered during context
initialization - cancelling refresh attempt: " + var9);
}
this.destroyBeans();
this.cancelRefresh(var9);
throw var9;
} finally {
this.resetCommonCaches();
}
}
}