关于java:源码解析Spring源码解析笔记五接口设计总览

本文由colodoo(纸伞)整顿
QQ 425343603
Java学习交换群(717726984)

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

总结

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

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

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理