Spring解析笔记 启动过程部分已经完成,对启动过程源码有兴趣的朋友可以作为参考文章。
- 源码解析:Spring源码解析笔记(二)启动过程(上)
- 源码解析:Spring源码解析笔记(三)启动过程(中)
- 源码解析:Spring源码解析笔记(四)启动过程(下)
启动过程篇幅已经阅读结束,后续如果有遗漏的和错误的地方都会进行修正,接下来我们就要深入的学习一下Spring的设计。
我们先从启动过程章节中经常用到的比较核心的一个类AbstractApplicationContext作为起点,先简单画出它相应的类图。
我们还是从源码入手,平时大家可能不太愿意直接去看冗长的注释,Spring的源码注释还是很规范的,这样能更直接理解设计的思路。
AbstractApplicationContext(抽象应用程序上下文)
org.springframework.context.support.AbstractApplicationContext
- 简单的实现最常见的上下文功能。
- 模板方法设计模式(设计模式),需要子类去实现抽象方法。
- 检测其内存bean工厂中定义的特殊bean,并自动注册
- BeanFactoryPostProcessors(Bean工厂后置处理器)
- BeanPostProcessors(Bean后置处理器)
- ApplicationListeners(应用程序监听器)
- MessageSource(消息源)
- ApplicationEventMulticaster(多播器)
- 默认多播器:SimpleApplicationEventMulticaster
- 扩展DefaultResourceLoader实现资源加载
- 非URL资源路径被视为类路径资源
- 可在子类重写getResourceByPath方法进行改造
接下来解析AbstractApplicationContext的直接依赖类和接口。
- ConfigurableApplicationContext(可配置的应用程序上下文)
- DefaultResourceLoader(默认资源加载器)
ConfigurableApplicationContext(可配置的应用程序上下文)
org.springframework.context.ConfigurableApplicationContext
接下来解析ConfigurableApplicationContext这个接口,它包含:
- 应用程序上下文(ApplicationContext)
- Closeable(可关闭)
- Lifecycle(生命周期)
ApplicationContext(应用程序上下文)
org.springframework.context.ApplicationContext
为应用程序提供配置的中央接口。 这在应用程序运行时是只读的,但如果实现支持它可能会重新加载。
- 提供访问bean的工厂方法(继承自ListableBeanFactory接口)
- 通用方式加载文件资源的能力(继承自ResourceLoader接口)
- 能够将时间发布到注册的侦听器(继承自ApplicationEventPublisher接口)
- 解析消息的能力,支持国际化(继承自MessageSource接口)
- 从父上下文继承。 后代上下文中的定义将始终优先
- 父上下文被整个Web应用程序使用
- 每个servlet都有自己的子上下文,子上下文独立于任何其他servlet的子上下文
- BeanFactory生命周期
- 实现检测和调用接口
- ApplicationContextAware(应用程序上下文)
- ResourceLoaderAware(资源加载)
- ApplicationEventPublisherAware(应用程序事件发布)
- MessageSourceAwar(消息源)
BeanFactory(Bean工厂)
org.springframework.beans.factory.BeanFactory
- 访问Spring Bean容器的根接口。
- Bean容器的基本客户端视图,ListableBeanFactory和ConfigurableBeanFactory可用于特定目的。
- 该接口由包含多个 bean 定义的对象实现,每个定义由一个字符串名称唯一标识。
- 根据 bean 定义,工厂将返回包含对象的独立实例(原型设计模式),或单个共享实例(单例设计模式的高级替代方案,其中实例是范围内的单例工厂)。
- 从 Spring 2.0 开始,根据具体的应用程序上下文(例如 Web 环境中的“请求”和“会话”范围),可以使用更多范围。
- 通常 BeanFactory 将加载存储在配置源(例如 XML 文档)中的 bean 定义,并使用org.springframework.beans包来配置 bean。
- 初始化方法及其标准顺序:
- BeanNameAware的setBeanName
- BeanClassLoaderAware的setBeanFactory
- EnviromenetAware的setEnvronment
- EmbeddedValueResolverAware的setEmbeddedValueResolver
- ResourceLoaderAware 的setResourceLoader(仅在应用程序上下文中运行时适用)
- ApplicationEventPublisherAware 的setApplicationEventPublisher (仅在应用程序上下文中运行时适用)
- MessageSourceAware 的setMessageSource (仅在应用程序上下文中运行时适用)
- ApplicationContextAware 的setApplicationContext (仅在应用程序上下文中运行时适用)
- ServletContextAware 的setServletContext (仅在 web 应用上下文中运行时适用)
- BeanPostProcessors 的postProcessBeforeInitialization方法
- InitializingBean 的afterPropertiesSet
- 自定义初始化方法定义
- BeanPostProcessors 的postProcessAfterInitialization方法
- 在关闭 bean 工厂时,以下生命周期方法适用
- DestructionAwareBeanPostProcessors 的postProcessBeforeDestruction方法
- DisposableBean 的destroy
- 自定义销毁方法定义
Closeable(可关闭)
java.io.Closeable
Closeable是可以关闭的数据源或目标。 调用 close 方法来释放对象持有的资源(例如打开的文件)。
Lifecycle(生命周期)
org.springframework.context.Lifecycle
- 定义启动/停止生命周期控制方法的通用接口
- 典型的用例是控制异步处理
- 可以由组件(Bean)和容器(ApplicationContext)实现。
- 容器将开始/结束 新皓传播到应用的每个容器内的所有组件。
DefaultResourceLoader(默认资源加载器)
org.springframework.core.io.DefaultResourceLoader
- ResourceLoader接口的默认实现
- 由ResourceEditor ,并作为org.springframework.context.support.AbstractApplicationContext基类。
- 也可以单独使用
- 如果位置值是 URL,则返回UrlResource如果是非 URL 路径或“classpath:”伪 URL,则返回ClassPathResource
ResourceLoader(资源加载器)
org.springframework.core.io.ResourceLoader
- 用于加载资源(例如类路径或文件系统资源)的策略接口。
- 需要ApplicationContext来提供此功能,以及扩展的ResourcePatternResolver支持。
- DefaultResourceLoader是一个独立的实现,可以在 ApplicationContext 之外使用,也被ResourceEditor 。
- 在 ApplicationContext 中运行时,可以使用特定上下文的资源加载策略从字符串填充类型为 Resource 和 Resource 数组的 Bean 属性。
总结
因为是总览,所以不会对源码中提及的类进行深入的阅读。
本章的目的就是找出一些,我们必要要掌握的一些类以及接口,为后面我们的逐行解析进行规整。