版权声明:转载请注明本文源地址 https://blog.csdn.net/qwe6112071/article/details/85221670
BeanFactory
BeanFacotry作为Spring的根容器对象,提供了对Bean的基础操作功能,包括实例化、配置、管理Bean等。
ApplicationContext
ApplicationContext对BeanFactory进行了进一步地封装,内置了BeanFacotry实例,不仅具备BeanFactory提供的所有功能,还提供了更丰富的配置管理BeanFacotry生命周期的能力。除此之外,ApplicationContext还额外提供了Spring事件管理机制,国际化/本地资源访问等能力
总体类图如下所示:
从ClassPathXmlApplicationContext实现类分析继承关系,来梳理相关类和接口功能,具体如下:
- ClassPathXmlApplicationContext:基于类路径下xml文件配置的Spring容器上下文。定义了根据资源路径创建Spring容器的相关构造函数入口。
- AbstractXmlApplicationContext:基于xml配置的针对ApplicationContext的基础实现类,封装了初始化XmlBeanDefinitionReader来加载BeanDefinitions的逻辑
- AbstractRefreshableConfigApplicationContext:封装了根据路径处理xml文件的逻辑,主要用来供子类如FileSystemXmlApplicationContext,ClassPathXmlApplicationContext等调用解析资源路径
- AbstractRefreshableApplicationContext:ApplicationContext的基础实现类封装了创建、初始化、刷新内置BeanFactory的相关功能逻辑,定义了
loadBeanDefinitions
抽象方法,供子类实现根据不同的方式加载BeanDefinitions,实现了createBeanFactory
,refreshBeanFactory
,hasBeanFactory
,getBeanFactory
,closeBeanFactory
等相关逻辑对BeanFactory的生命周期进行管理(具体创建、刷新核心逻辑由夫类AbstractApplicationContext实现),提供了customizeBeanFactory函数对内置的beanFactory进行进一步的定制 - AbstractApplicationContext:ApplicationContext的基础实现,提供了
refresh
方法实现创建BeanFacotry的核心逻辑,具体实现内容可参照refresh
函数:
public void refresh() throws BeansException, IllegalStateException {
synchronized (this.startupShutdownMonitor) {
// 供子类拓展,添加创建前必需属性,校验如果必需属性不存在则抛出MissingRequiredPropertiesException已成
prepareRefresh();
// 调用子类实现方法获取(创建或刷新)BeanFacotry容器,对于ClassPathXmlApplicationContext,主要调用了AbstractRefreshableApplicationContext中实现的方法
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// 设定类加载器,spel解析器,属性编辑解析器等,忽略特定接口的依赖注册(在特定时刻相关Bean再完成注入),注册一些系统Bean供依赖注入使用。
prepareBeanFactory(beanFactory);
try {
// BeanFactory创建完的后置处理。当前为空实现,供子类拓展
postProcessBeanFactory(beanFactory);
// 调用BeanFacotry的相关后置处理器,如果实现了Order相关接口,会先进行排序。
invokeBeanFactoryPostProcessors(beanFactory);
// 注册相关BeanPostProcessor,供Bean生成前后调用。
registerBeanPostProcessors(beanFactory);
// 初始化国际化信息源
initMessageSource();
// 初始化Spring相关上下文时间广播器
initApplicationEventMulticaster();
// 模版方法供子类实现,用于初始化一些特殊Bean配置等
onRefresh();
// 注册实现了ApplicationListener接口的事件监听器,用于后续广播器广播事件
registerListeners();
// BeanFactory初始化完成时调用,初始ConversionService Bean,冻结beanFactory配置,并开始创建BeanFactory中所有非懒加载的单例Bean
finishBeanFactoryInitialization(beanFactory);
// 初始化Lifecycle处理器,调用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;
}
}
}
- BeanNameAware: 定义了
setBeanName
方法,在初始化spring容器的实现了该接口的Bean时会调用本方法,设置BeanName属性 - InitializingBean:定义了
afterPropertiesSet
方法,在spring容器创建实现了该接口的Bean并完成相关依赖注入后调用 - Aware:标志Spring容器在实现了本接口的Bean进行创建后要注入相关的依赖属性
- DisposableBean:定义了
destroy
方法,在spring容器销毁单例的时候会触发调用 - DefaultResourceLoader:ResourceLoader的基础实现,定义了设置、获取ClassLoader,通过路径字符串获取Resource资源对象的方法
- Resource类:继承自InputStreamSource接口,描述了资源相关操作方法,如判断是否存在、可读,获取File对象、URL、文件名、描述等相关信息
- ResourceLoader接口:定义了获取资源和类加载器的方法规范
- ConfigurableApplicationContext:定义了除ApplicationContext中的方法外,更多的用于配置AplicationContext方法规范,包括配置环境,刷新、获取容器,添加应用监听器,BeanFactory后置处理器等相关方法
- ApplicationContext:应用上下文顶层中心接口,除本身的一些获取应用上下文名的基础方法,通过继承EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver等类界定了ApplicationContext的基础功能。 - EnvironmentCapable:定义了
getEnvironment
方法获取当前Environment环境属性- Environment接口:继承自PropertyResolver,定义了
getActiveProfiles
,getDefaultProfiles
获取当前激活的环境类型。 - PropertyResolver接口:定义了根据key和类获取属性、解析占位符等基础能力
- Environment接口:继承自PropertyResolver,定义了
- MessageSource:定义了获取国际化资源的基础能力
- ApplicationEventPublisher: 定义了发布上下文时间的基础能力
- ResourcePatternResolver: 策略接口,用于定义获取不同类型资源(classpath,xml,url)的能力
- ListableBeanFactory:定义了根据各种条件(类型/名称/注解类型)获取Bean配置列表,如根据类型获取相应的bean名称,Class元类等
- BeanFactory:Spring容器顶层接口,定义了获取Bean实例,判断Bean类型,根据名字获取Bean类型、别名等相关方法
具体实现方法参照下图