源码解析:Spring源码解析笔记(五)接口设计总览

本文由colodoo(纸伞)整理

QQ 425343603

Java学习交流群(717726984)

Spring解析笔记 启动过程部分已经完成,对启动过程源码有兴趣的朋友可以作为参考文章。

启动过程篇幅已经阅读结束,后续如果有遗漏的和错误的地方都会进行修正,接下来我们就要深入的学习一下Spring的设计。

我们先从启动过程章节中经常用到的比较核心的一个类AbstractApplicationContext作为起点,先简单画出它相应的类图。

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

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

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 属性。

总结

因为是总览,所以不会对源码中提及的类进行深入的阅读。

本章的目的就是找出一些,我们必要要掌握的一些类以及接口,为后面我们的逐行解析进行规整。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值