【Spring源码阅读】IOC核心容器基础和继承体系结构

版权声明:转载请注明本文源地址 https://blog.csdn.net/qwe6112071/article/details/85221670

BeanFactory

BeanFacotry作为Spring的根容器对象,提供了对Bean的基础操作功能,包括实例化、配置、管理Bean等。

ApplicationContext

ApplicationContext对BeanFactory进行了进一步地封装,内置了BeanFacotry实例,不仅具备BeanFactory提供的所有功能,还提供了更丰富的配置管理BeanFacotry生命周期的能力。除此之外,ApplicationContext还额外提供了Spring事件管理机制,国际化/本地资源访问等能力

总体类图如下所示:

image
从ClassPathXmlApplicationContext实现类分析继承关系,来梳理相关类和接口功能,具体如下:

  1. ClassPathXmlApplicationContext:基于类路径下xml文件配置的Spring容器上下文。定义了根据资源路径创建Spring容器的相关构造函数入口。
  2. AbstractXmlApplicationContext:基于xml配置的针对ApplicationContext的基础实现类,封装了初始化XmlBeanDefinitionReader来加载BeanDefinitions的逻辑
  3. AbstractRefreshableConfigApplicationContext:封装了根据路径处理xml文件的逻辑,主要用来供子类如FileSystemXmlApplicationContext,ClassPathXmlApplicationContext等调用解析资源路径
  4. AbstractRefreshableApplicationContext:ApplicationContext的基础实现类封装了创建、初始化、刷新内置BeanFactory的相关功能逻辑,定义了loadBeanDefinitions抽象方法,供子类实现根据不同的方式加载BeanDefinitions,实现了createBeanFactoryrefreshBeanFactoryhasBeanFactorygetBeanFactorycloseBeanFactory等相关逻辑对BeanFactory的生命周期进行管理(具体创建、刷新核心逻辑由夫类AbstractApplicationContext实现),提供了customizeBeanFactory函数对内置的beanFactory进行进一步的定制
  5. 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;
		}
	}
}
  1. BeanNameAware: 定义了setBeanName方法,在初始化spring容器的实现了该接口的Bean时会调用本方法,设置BeanName属性
  2. InitializingBean:定义了afterPropertiesSet方法,在spring容器创建实现了该接口的Bean并完成相关依赖注入后调用
  3. Aware:标志Spring容器在实现了本接口的Bean进行创建后要注入相关的依赖属性
  4. DisposableBean:定义了destroy方法,在spring容器销毁单例的时候会触发调用
  5. DefaultResourceLoader:ResourceLoader的基础实现,定义了设置、获取ClassLoader,通过路径字符串获取Resource资源对象的方法
    1. Resource类:继承自InputStreamSource接口,描述了资源相关操作方法,如判断是否存在、可读,获取File对象、URL、文件名、描述等相关信息
    2. ResourceLoader接口:定义了获取资源和类加载器的方法规范
  6. ConfigurableApplicationContext:定义了除ApplicationContext中的方法外,更多的用于配置AplicationContext方法规范,包括配置环境,刷新、获取容器,添加应用监听器,BeanFactory后置处理器等相关方法
  7. ApplicationContext:应用上下文顶层中心接口,除本身的一些获取应用上下文名的基础方法,通过继承EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
    MessageSource, ApplicationEventPublisher, ResourcePatternResolver等类界定了ApplicationContext的基础功能。
  8. EnvironmentCapable:定义了getEnvironment方法获取当前Environment环境属性
    1. Environment接口:继承自PropertyResolver,定义了getActiveProfiles,getDefaultProfiles获取当前激活的环境类型。
    2. PropertyResolver接口:定义了根据key和类获取属性、解析占位符等基础能力
  9. MessageSource:定义了获取国际化资源的基础能力
  10. ApplicationEventPublisher: 定义了发布上下文时间的基础能力
  11. ResourcePatternResolver: 策略接口,用于定义获取不同类型资源(classpath,xml,url)的能力
  12. ListableBeanFactory:定义了根据各种条件(类型/名称/注解类型)获取Bean配置列表,如根据类型获取相应的bean名称,Class元类等
  13. BeanFactory:Spring容器顶层接口,定义了获取Bean实例,判断Bean类型,根据名字获取Bean类型、别名等相关方法

具体实现方法参照下图
image

猜你喜欢

转载自blog.csdn.net/qwe6112071/article/details/85221670