本文由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 属性。

总结

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

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

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

  1. Spring Boot 框架学习笔记(五)( SpringSecurity安全框架 )

    Spring Boot 框架学习笔记(五) SpringSecurity安全框架 概述 作用 开发示例: 1. 新建项目 2. 引入依赖 3. 编写`SecurityConfig`类,实现认证,授权, ...

  2. Spring源码:Spring源码阅读环境搭建

    本篇内容包括:Mac 环境下 gradle 的安装和配置.源码克隆.新建测试类,测试Spring源码 等内容! 第一步:Mac 环境下 gradle 的安装和配置 1.下载安装包 # 到 GitHub ...

  3. 【框架源码】Spring源码解析之BeanDefinition加载流程解析

    观看本文之前,我们先思考一个问题,Spring是如何描述Bean对象的? Spring是根据BeanDefinition来创建Bean对象,BeanDefinition就是Spring中表示Bean定 ...

  4. 【框架源码】Spring源码底层IOC容器加入对象的方式

    1.Spring容器加入对象方式简介 使用XML配置文件 在XML配置文件中使用< bean >标签来定义Bean,通过ClassPathXmlApplicationContext等容器来 ...

  5. 【Spring Data JPA自学笔记五】一对多、多对多和级联

    文章目录 数据库表的关系 一对多 多对多 Spring Data JPA实现一对多 基本配置 实现一对多 放弃维护权 Spring Data JPA实现多对多 基本配置 实现多对多 级联 之前的所有操 ...

  6. spring in action 学习笔记五:@Autowired这个注解如何理解

    @Autowired这个注解的意思就是自动装配.他把一个bean对象自动装配到另一个对象中.下面的案例证明了spring的自动装配. 定义一个Sixi类.代码如下: 1 package com.qls ...

  7. freertos源码详解与应用开发 pdf_互联网企业面试必问Spring源码?搞定Spring源码,看完这篇就够了...

    不用说,Spring已经成为Java后端开发的事实上的行业标准.无数公司选择Spring作为基本开发框架.大多数Java后端程序员在日常工作中也会接触到Spring.因此,如何很好地使用Spring, ...

  8. idea调试源代码c语言,IDEA阅读spring源码并调试

    目标:搭建起Spring源码阅读和代码调试跟踪的环境,顺便建立一个简单的Demo,能够调试Spring的源代码 本节,主要介绍一下Spring源码阅读和调试的相关环境搭建,并使用MVN创建一个非常简单 ...

  9. 结合Spring源码学习单例设计模式

    之前我学习了 Spring Ioc,明白了 Spring IoC 容器是一个管理Bean的容器,在Spring的定义中,它要求所有的IoC容器都需要实现接口 BeanFactory ,它是一个顶级容器 ...

最新文章

  1. 怎么样做一个合格而又可爱的面试官
  2. Windows 7 + Fedora 17 双系统安装详解
  3. MATLAB之界面介绍
  4. POJ2230 Watchcow——欧拉回路——Pku2230
  5. UA MATH567 高维统计II 随机向量8 图的Max-cut问题 0.5近似算法的运行时间分析
  6. 腾讯云实时音视频技术发展简史 — 从编解码器容错优化到云端决策系统
  7. 左神算法:两个单链表相交的一系列问题(链表是否有环 / 两无环链表是否相交 / 两有环链表是否相交)
  8. RabbitMq入门以及使用教程
  9. P5405-[CTS2019]氪金手游【树形dp,容斥,数学期望】
  10. python web py官网_python web.py
  11. 保留小数点后三位_【Meta分析】Stata制作森林图时,如何保留三位小数?
  12. mysql shell
  13. 开启ssh不能用root登入的限制
  14. HP推出UFT新版本UFT12 5以及LeanFT
  15. 冰点文库下载器,免积分下载百度文库文档
  16. android自定义日历代码,Android自定义日历Calender代码实现
  17. 趣味Python — 不到20行代码制作一个 “手绘风” 视频
  18. Robotics正运动学求解仿真(附代码和解释)
  19. 系统测试缺陷检出密度越大越好吗?
  20. 分享 - 怎样实习才能成长最快

热门文章

  1. oracle假如存在才删除该字段,Oracle删除表、字段之前判断表、字段是否存在
  2. 基于“业务中台”构建的一些理解
  3. curl http POST请求出现405错误
  4. python查看excel编码格式_[Python]实现处理读写xlsx xls excel文件格式(含中文处理方法)...
  5. SendMessage和PostMessage及Windows消息机制简介
  6. 5G及后5G时代:万物互联到万物智能的黄金时代
  7. 车内看车头正不正技巧_史上最全:新手开车/停车技巧(真实图解)
  8. 《C++ Primer Plus》(第6版)第3章编程练习
  9. typedef和typename的区别
  10. 并发问题中的乐观锁和悲观锁