源码解析: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 属性。
总结
因为是总览,所以不会对源码中提及的类进行深入的阅读。
本章的目的就是找出一些,我们必要要掌握的一些类以及接口,为后面我们的逐行解析进行规整。
源码解析:Spring源码解析笔记(五)接口设计总览相关推荐
- Spring Boot 框架学习笔记(五)( SpringSecurity安全框架 )
Spring Boot 框架学习笔记(五) SpringSecurity安全框架 概述 作用 开发示例: 1. 新建项目 2. 引入依赖 3. 编写`SecurityConfig`类,实现认证,授权, ...
- Spring源码:Spring源码阅读环境搭建
本篇内容包括:Mac 环境下 gradle 的安装和配置.源码克隆.新建测试类,测试Spring源码 等内容! 第一步:Mac 环境下 gradle 的安装和配置 1.下载安装包 # 到 GitHub ...
- 【框架源码】Spring源码解析之BeanDefinition加载流程解析
观看本文之前,我们先思考一个问题,Spring是如何描述Bean对象的? Spring是根据BeanDefinition来创建Bean对象,BeanDefinition就是Spring中表示Bean定 ...
- 【框架源码】Spring源码底层IOC容器加入对象的方式
1.Spring容器加入对象方式简介 使用XML配置文件 在XML配置文件中使用< bean >标签来定义Bean,通过ClassPathXmlApplicationContext等容器来 ...
- 【Spring Data JPA自学笔记五】一对多、多对多和级联
文章目录 数据库表的关系 一对多 多对多 Spring Data JPA实现一对多 基本配置 实现一对多 放弃维护权 Spring Data JPA实现多对多 基本配置 实现多对多 级联 之前的所有操 ...
- spring in action 学习笔记五:@Autowired这个注解如何理解
@Autowired这个注解的意思就是自动装配.他把一个bean对象自动装配到另一个对象中.下面的案例证明了spring的自动装配. 定义一个Sixi类.代码如下: 1 package com.qls ...
- freertos源码详解与应用开发 pdf_互联网企业面试必问Spring源码?搞定Spring源码,看完这篇就够了...
不用说,Spring已经成为Java后端开发的事实上的行业标准.无数公司选择Spring作为基本开发框架.大多数Java后端程序员在日常工作中也会接触到Spring.因此,如何很好地使用Spring, ...
- idea调试源代码c语言,IDEA阅读spring源码并调试
目标:搭建起Spring源码阅读和代码调试跟踪的环境,顺便建立一个简单的Demo,能够调试Spring的源代码 本节,主要介绍一下Spring源码阅读和调试的相关环境搭建,并使用MVN创建一个非常简单 ...
- 结合Spring源码学习单例设计模式
之前我学习了 Spring Ioc,明白了 Spring IoC 容器是一个管理Bean的容器,在Spring的定义中,它要求所有的IoC容器都需要实现接口 BeanFactory ,它是一个顶级容器 ...
最新文章
- 怎么样做一个合格而又可爱的面试官
- Windows 7 + Fedora 17 双系统安装详解
- MATLAB之界面介绍
- POJ2230 Watchcow——欧拉回路——Pku2230
- UA MATH567 高维统计II 随机向量8 图的Max-cut问题 0.5近似算法的运行时间分析
- 腾讯云实时音视频技术发展简史 — 从编解码器容错优化到云端决策系统
- 左神算法:两个单链表相交的一系列问题(链表是否有环 / 两无环链表是否相交 / 两有环链表是否相交)
- RabbitMq入门以及使用教程
- P5405-[CTS2019]氪金手游【树形dp,容斥,数学期望】
- python web py官网_python web.py
- 保留小数点后三位_【Meta分析】Stata制作森林图时,如何保留三位小数?
- mysql shell
- 开启ssh不能用root登入的限制
- HP推出UFT新版本UFT12 5以及LeanFT
- 冰点文库下载器,免积分下载百度文库文档
- android自定义日历代码,Android自定义日历Calender代码实现
- 趣味Python — 不到20行代码制作一个 “手绘风” 视频
- Robotics正运动学求解仿真(附代码和解释)
- 系统测试缺陷检出密度越大越好吗?
- 分享 - 怎样实习才能成长最快
热门文章
- oracle假如存在才删除该字段,Oracle删除表、字段之前判断表、字段是否存在
- 基于“业务中台”构建的一些理解
- curl http POST请求出现405错误
- python查看excel编码格式_[Python]实现处理读写xlsx xls excel文件格式(含中文处理方法)...
- SendMessage和PostMessage及Windows消息机制简介
- 5G及后5G时代:万物互联到万物智能的黄金时代
- 车内看车头正不正技巧_史上最全:新手开车/停车技巧(真实图解)
- 《C++ Primer Plus》(第6版)第3章编程练习
- typedef和typename的区别
- 并发问题中的乐观锁和悲观锁