淘小兔

基于编程开发实践,不仅深度解析Spring 5的原理与新特性,更从环境准备、顶层结构设计、数据访问等方面一步步地推导出Spring的设计原理。在每个知识点上,均以大量的经典代码案例辅助讲解,使理论紧密联系实际。最后手写30个类,以体会Spring作者的创作过程,让每一位读者学以致用。

Spring5核心原理与30个类手写实战

Spring5核心原理与30个类手写实战资料目录

知识兔

第1篇 Spring内功心法聽

第1章 软件架构设计原则 2聽

1.1 开闭原则 2聽

1.2 依赖倒置原则 4聽

1.3 单一职责原则 7聽

1.4 接口隔离原则 10聽

1.5 迪米特原则 12聽

1.6 里氏替换原则 14聽

1.7 合成复用原则 19聽

1.8 设计原则总结 20聽

第2章 Spring中常用的设计模式 21聽

2.1 为什么要从设计模式开始 21聽

2.1.1 写出优雅的代码 22聽

2.1.2 更好地重构项目 24聽

2.1.3 经典框架都在用设计模式解决问题 36聽

2.2 工厂模式详解 36聽

2.2.1 工厂模式的由来 36聽

2.2.2 简单工厂模式 37聽

2.2.3 工厂方法模式 41聽

2.2.4 抽象工厂模式 43聽

2.2.5 利用工厂模式重构的实践案例 47聽

2.3 单例模式详解 53聽

2.3.1 单例模式的应用场景 53聽

2.3.2 饿汉式单例模式 53聽

2.3.3 懒汉式单例模式 54聽

2.3.4 反射破坏单例 60聽

2.3.5 序列化破坏单例 61聽

2.3.6 注册式单例模式 68聽

2.3.7 线程单例实现ThreadLocal 74聽

2.3.8 单例模式小结 75聽

2.4 原型模式详解 75聽

2.4.1 原型模式的应用场景 75聽

2.4.2 浅克隆 77聽

2.4.3 深克隆 79聽

2.4.4 克隆破坏单例模式 81聽

2.4.5 clone()方法的源码 82聽

2.5 代理模式详解 82聽

2.5.1 代理模式的应用场景 82聽

2.5.2 静态代理 83聽

2.5.3 动态代理 88聽

2.5.4 代理模式与Spring 107聽

2.5.5 静态代理和动态代理的本质区别 108聽

2.5.6 代理模式的优缺点 109聽

2.6 委派模式详解 109聽

2.6.1 委派模式的定义及应用场景 109聽

2.6.2 委派模式在源码中的体现 111聽

2.7 策略模式详解 .114聽

2.7.1 策略模式的应用场景 114聽

2.7.2 用策略模式实现选择支付方式的业务场景 .114聽

2.7.3 策略模式在JDK源码中的体现 122聽

2.7.4 策略模式的优缺点 125聽

2.7.5 委派模式与策略模式综合应用 125聽

2.8 模板模式详解 129聽

2.8.1 模板模式的应用场景 129聽

2.8.2 利用模板模式重构JDBC操作业务场景 132聽

2.8.3 模板模式在源码中的体现 136聽

2.8.4 模板模式的优缺点 138聽

2.9 适配器模式详解139聽

2.9.1 适配器模式的应用场景 139聽

2.9.2 重构第三方登录自由适配的业务场景141聽

2.9.3 适配器模式在源码中的体现 149聽

2.9.4 适配器模式的优缺点 153聽

2.10 装饰者模式详解 153聽

2.10.1 装饰者模式的应用场景 153聽

2.10.2 装饰者模式和适配器模式对比 163聽

2.10.3 装饰者模式在源码中的应用 163聽

2.10.4 装饰者模式的优缺点 165聽

2.11 观察者模式详解 165聽

2.11.1 观察者模式的应用场景 165聽

2.11.2 观察者模式在源码中的应用 175聽

2.11.3 基于Guava API轻松落地观察者模式 176聽

2.11.4 观察者模式的优缺点 177聽

2.12 各设计模式的总结与对比 177聽

2.12.1 GoF 23种设计模式简介 177聽

2.12.2 设计模式之间的关联关系 178聽

2.12.3 Spring中常用的设计模式 182聽

2.13 Spring中的编程思想总结 183聽

第2篇 Spring环境预热聽

第3章 Spring的前世今生 186聽

3.1 一切从Bean开始 187聽

3.2 Spring的设计初衷 188聽

3.3 BOP编程伊始 188聽

3.4 理解BeanFactory 189聽

3.5 AOP编程理念 189聽

第4章 Spring 5系统架构 191聽

4.1 核心容器 192聽

4.2 AOP和设备支持192聽

4.3 数据访问与集成193聽

4.4 Web组件 194聽

4.5 通信报文 194聽

4.6 集成测试 194聽

4.7 集成兼容 194聽

4.8 各模块之间的依赖关系 194聽

第5章 Spring版本命名规则 196聽

5.1 常见软件的版本命名 196聽

5.2 语义化版本命名通行规则 197聽

5.3 商业软件中常见的修饰词 197聽

5.4 软件版本号使用限定 198聽

5.5 Spring版本命名规则 199聽

第6章 Spring源码下载及构建技巧 200聽

6.1 Spring 5源码下载 200聽

6.2 基于Gradle的源码构建技巧 201聽

6.3 Gradle构建过程中的坑 207聽

第3篇 Spring核心原理聽

第7章 用300行代码手写提炼Spring核心原理 210聽

7.1 自定义配置 210聽

7.1.1 配置application.properties文件 210聽

7.1.2 配置web.xml文件 210聽

7.1.3 自定义注解 211聽

7.1.4 配置注解 212聽

7.2 容器初始化 213聽

7.2.1 实现1.0版本 213聽

7.2.2 实现2.0版本 216聽

7.2.3 实现3.0版本 223聽

7.3 运行效果演示 227聽

第8章 一步一步手绘Spring IoC运行时序图 228聽

8.1 Spring核心之IoC容器初体验 228聽

8.1.1 再谈IoC与DI 228聽

8.1.2 Spring核心容器类图 229聽

8.1.3 Web IoC容器初体验 232聽

8.2 基于XML的IoC容器的初始化 237聽

8.2.1 寻找入口 238聽

8.2.2 获得配置路径 238聽

8.2.3 开始启动 240聽

8.2.4 创建容器 242聽

8.2.5 载入配置路径 243聽

8.2.6 分配路径处理策略 244聽

8.2.7 解析配置文件路径 247聽

8.2.8 开始读取配置内容 249聽

8.2.9 准备文档对象 250聽

8.2.10 分配解析策略 251聽

8.2.11 将配置载入内存 252聽

8.2.12 载入<bean>元素 257聽

8.2.13 载入<property>元素 261聽

8.2.14 载入<property>子元素 264聽

8.2.15 载入<list>子元素 266聽

8.2.16 分配注册策略 267聽

8.2.17 向容器注册 267聽

8.3 基于注解的IoC初始化 270聽

8.3.1 注解的前世今生 270聽

8.3.2 定位Bean扫描路径 271聽

8.3.3 读取注解的元数据 273聽

8.3.4 扫描指定包并解析为BeanDefinition 277聽

8.3.5 注册注解BeanDefinition 283聽

8.4 IoC容器初始化小结 285聽

第9章 一步一步手绘Spring DI运行时序图 287聽

9.1 Spring自动装配之依赖注入 287聽

9.1.1 依赖注入发生的时间 287聽

9.1.2 寻找获取Bean的入口 288聽

9.1.3 开始实例化 293聽

9.1.4 选择Bean实例化策略 297聽

9.1.5 执行Bean实例化 299聽

9.1.6 准备依赖注入 301聽

9.1.7 解析属性依赖注入规则 306聽

9.1.8 注入赋值 310聽

9.2 Spring IoC容器中那些鲜为人知的细节 314聽

9.2.1 关于延时加载 314聽

9.2.2 关于FactoryBean和BeanFactory 317聽

9.2.3 再述autowiring 322聽

第10章 一步一步手绘Spring AOP运行时序图 326聽

10.1 Spring AOP初体验 326聽

10.1.1 再述Spring AOP应用场景 326聽

10.1.2 AOP中必须明白的几个概念 327聽

10.1.3 使用Spring AOP的两种方式 329聽

10.1.4 切入点表达式的配置规则 333聽

10.2 Spring AOP源码分析 334聽

10.2.1 寻找入口 334聽

10.2.2 选择代理策略 338聽

10.2.3 调用代理方法 341聽

10.2.4 触发通知 347聽

第11章 一步一步手绘Spring MVC运行时序图 352聽

11.1 初探Spring MVC请求处理流程 352聽

11.2 Spring MVC九大组件 353聽

11.2.1 HandlerMapping 353聽

11.2.2 HandlerAdapter 353聽

11.2.3 HandlerExceptionResolver 354聽

11.2.4 ViewResolver 354聽

11.2.5 RequestToViewNameTranslator 354聽

11.2.6 LocaleResolver 354聽

11.2.7 ThemeResolver 355聽

11.2.8 MultipartResolver 355聽

11.2.9 FlashMapManager 355聽

11.3 Spring MVC源码分析 355聽

11.3.1 初始化阶段 356聽

11.3.2 运行调用阶段 359聽

11.4 Spring MVC优化建议 367聽

第4篇 Spring手写实战聽

第12章 环境准备 370聽

12.1 IDEA集成Lombok插件 370聽

12.1.1 安装插件 370聽

12.1.2 配置注解处理器 373聽

12.1.3 使用插件 374聽

12.2 从Servlet到ApplicationContext 375聽

12.3 准备基础配置376聽

12.3.1 application.properties配置.377聽

12.3.2 pom.xml配置 377聽

12.3.3 web.xml配置 378聽

12.3.4 GPDispatcherServlet 378聽

第13章 IoC顶层结构设计 380聽

13.1 Annotation(自定义配置)模块 380聽

13.1.1 @GPService 380聽

13.1.2 @GPAutowired 381聽

13.1.3 @GPController 381聽

13.1.4 @GPRequestMapping 382聽

13.1.5 @GPRequestParam 382聽

13.2 core(顶层接口)模块 382聽

13.2.1 GPFactoryBean 382聽

13.2.2 GPBeanFactory 383聽

13.3 beans(配置封装)模块 383聽

13.3.1 GPBeanDefinition 383聽

13.3.2 GPBeanWrapper 384聽

13.4 context(IoC容器)模块 385聽

13.4.1 GPAbstractApplicationContext 385聽

13.4.2 GPDefaultListableBeanFactory 385聽

13.4.3 GPApplicationContext385聽

13.4.4 GPBeanDefinitionReader 388聽

13.4.5 GPApplicationContextAware 391聽

第14章 完成DI模块的功能 392聽

14.1 从getBean()方法开始 393聽

14.2 GPBeanPostProcessor 395聽

第15章 完成MVC模块的功能 396聽

15.1 MVC顶层设计 396聽

15.1.1 GPDispatcherServlet 396聽

15.1.2 GPHandlerMapping 402聽

15.1.3 GPHandlerAdapter 403聽

15.1.4 GPModelAndView 406聽

15.1.5 GPViewResolver 406聽

15.1.6 GPView 407聽

15.2 业务代码实现409聽

15.2.1 IQueryService 409聽

15.2.2 QueryService 410聽

15.2.3 IModifyService 410聽

15.2.4 ModifyService 411聽

15.2.5 MyAction 412聽

15.2.6 PageAction 413聽

15.3 定制模板页面414聽

15.3.1 first.html 414聽

15.3.2 404.html 414聽

15.3.3 500.html 415聽

15.4 运行效果演示415聽

第16章 完成AOP代码织入 417聽

16.1 基础配置 .417聽

16.2 完成AOP顶层设计 418聽

16.2.1 GPJoinPoint 418聽

16.2.2 GPMethodInterceptor .419聽

16.2.3 GPAopConfig 419聽

16.2.4 GPAdvisedSupport 420聽

16.2.5 GPAopProxy 422聽

16.2.6 GPCglibAopProxy 423聽

16.2.7 GPJdkDynamicAopProxy 423聽

16.2.8 GPMethodInvocation425聽

16.3 设计AOP基础实现 427聽

16.3.1 GPAdvice 427聽

16.3.2 GPAbstractAspectJAdvice 427聽

16.3.3 GPMethodBeforeAdvice 428聽

16.3.4 GPAfterReturningAdvice 429聽

16.3.5 GPAfterThrowingAdvice 430聽

16.3.6 接入getBean()方法 430聽

16.4 织入业务代码432聽

16.4.1 LogAspect 432聽

16.4.2 IModifyService 433聽

16.4.3 ModifyService 434聽

16.5 运行效果演示435聽

第5篇 Spring数据访问聽

第17章 数据库事务原理详解 438聽

17.1 从Spring事务配置说起 438聽

17.2 事务的基本概念 439聽

17.3 事务的基本原理 439聽

17.4 Spring事务的传播属性 440聽

17.5 数据库事务隔离级别 441聽

17.6 Spring中的事务隔离级别 441聽

17.7 事务的嵌套 442聽

17.8 Spring事务API架构图 444聽

17.9 浅谈分布式事务 444聽

第18章 Spring JDBC源码初探 446聽

18.1 异常处理 447聽

18.2 config模块 448聽

18.3 core模块450聽

18.4 DataSource 456聽

18.5 object模块 457聽

18.6 JdbcTemplate 458聽

18.7 NamedParameterJdbcTemplate 458聽

第19章 基于Spring JDBC手写ORM框架 459聽

19.1 实现思路概述459聽

19.1.1 从ResultSet说起 459聽

19.1.2 为什么需要ORM框架 464聽

19.2 搭建基础架构467聽

19.2.1 Page 467聽

19.2.2 ResultMsg 470聽

19.2.3 BaseDao 471聽

19.2.4 QueryRule 473聽

19.2.5 Order.479聽

19.3 基于Spring JDBC实现关键功能 480聽

19.3.1 ClassMappings 480聽

19.3.2 EntityOperation 483聽

19.3.3 QueryRuleSqlBuilder 488聽

19.3.4 BaseDaoSupport 498聽

19.4 动态数据源切换的底层原理 507聽

19.4.1 DynamicDataSource 508聽

19.4.2 DynamicDataSourceEntry 509聽

19.5 运行效果演示510聽

19.5.1 创建Member实体类 510聽

19.5.2 创建Order实体类 511聽

19.5.3 创建MemberDao 512聽

19.5.4 创建OrderDao 512聽

19.5.5 修改db.properties文件 514聽

19.5.6 修改application-db.xml文件 515聽

19.5.7 编写测试用例 516聽

第6篇 Spring经验分享聽

第20章 Spring 5新特性总结 520聽

20.1 升级到Java SE 8和Java EE 7 520聽

20.2 反应式编程模型 521聽

20.3 使用注解进行编程 521聽

20.4 函数式编程 522聽

20.5 使用 REST 端点执行反应式编程 523聽

20.6 支持HTTP/2 523聽

20.7 Kotlin和Spring WebFlux 523聽

20.8 使用Lambda表达式注册Bean 524聽

20.9 Spring Web MVC 支持最新的 API 524聽

20.10 使用JUnit 5执行条件和并发测试 525聽

20.11 包清理和弃用 526聽

20.12 Spring核心和容器的一般更新 526聽

20.13 我如何看Spring 5 527聽

第21章 关于Spring的经典高频面试题 528聽

21.1 什么是Spring框架,Spring框架有哪些主要模块 528聽

21.2 使用Spring框架能带来哪些好处 528聽

21.3 什么是控制反转(IoC),什么是依赖注入 529聽

21.4 在Java中依赖注入有哪些方式 529聽

21.5 BeanFactory和ApplicationContext有什么区别 530聽

21.6 Spring分享几种配置方式来设置元数据 530聽

21.7 如何使用XML配置方式配置Spring .531聽

21.8 Spring分享哪些配置形式 532聽

21.9 怎样用注解的方式配置Spring 533聽

21.10 请解释Spring Bean的生命周期 534聽

21.11 Spring Bean作用域的区别是什么 535聽

21.12 什么是Spring Inner Bean 535聽

21.13 Spring中的单例Bean是线程安全的吗 536聽

21.14 请举例说明如何在Spring中注入一个Java集合 536聽

21.15 如何向Spring Bean中注入java.util.Properties 537聽

21.16 请解释Spring Bean的自动装配 538聽

21.17 自动装配有哪些局限性 538聽

21.18 请解释各种自动装配模式的区别 539聽

21.19 请举例解释@Required注解 539聽

21.20 请举例说明@Qualifier注解 540聽

21.21 构造方法注入和设值注入有什么区别 540聽

21.22 Spring中有哪些不同类型的事件 541聽

21.23 FileSystemResource和ClassPathResource有什么区别 542聽

21.24 Spring中用到了哪些设计模式 542聽

21.25 在Spring中如何更有效地使用JDBC 543聽

21.26 请解释Spring中的IoC容器 543聽

21.27 在Spring中可以注入null或空字符串吗 543聽

Spring5核心原理与30个类手写实战介绍

知识兔

1996年,Java还只是一个新兴的、初出茅庐的编程语言。2004年3月24日Spring正式对外发布1.0版本。我在2009年开始接触Spring2.0版本,从此爱不释手。Spring的出现,恰如其名开启了全世界Java程序员的春天。如今,Spring已然成为一个生态,使用Spring简直就是一种享受。本书将结合本人多年的Spring使用经验,整理珍藏多年的学习笔记,采用类关系图和代码片段的形式,加以中文注释,通俗、生动、全面深入地剖析了Spring源码的重要细节。同时,本书也作为咕泡学院Java VIP高级课程的教案。要想练就"降龙十八掌”,先得修炼内功。本书用从设计模式开始讲解,希望可以帮助大家更好地理解Spring,让大家知其然,且知其所以然。聽

Spring源码框架

知识兔

Sring是一个基本的框架,Spring Cloud是在Spring的基础上构建出来的。

在Spring中包含两个基本的核心点:

第一个IOC,它表示说Spring是一个最基本的容器

第二个AOP,它分享了面向切面编程的这种思路,可以帮助我们在日志事务等各个层面,进行相关的一些扩展工作。

当然这些都是官方的描述,其实Spring就是一个基本的框架,它分享了基本的容器功能,该容器是用来存放具体的Bean对象的,当有了这些Bean对象后,为方便我们对Bean对象的获取,需要先声明好配置文件或注解,告诉Spring容器,你需要什么样的对象。

注解或配置文件定义好就开始解析了,通过IO流,Document文档去解析里边的标签,解析里边的属性值,解析后的文件我们称为BeanDefinition简称BD,根据BD中的描述信息来进行对象的实例化操作,通过反射的方式创建具体的对象,之后就可以通过Context.getBean()获取Bean对象。

Spirng作为一个容器,从创建到销毁,都不需要人为干预。

作为一个框架,最基本最主要的就是扩展性,在Spring中分享了一扩展点,让用户来随意进行扩展工作。在创建对象之前会有一个扩展点,BeanFactoryPostProcessor可以替换配置文件中的点位符,在BFPP还包含了BeanDefiintionRegistryPostProcessor可以随意地创建BD对象,Sping的装配原理:通过ConfigurationClassPostProcessor来实现。

Spring扩展在设计的时候留出了很多口子,让用户能够进行扩展工作。

像刚刚说的两个方法就可以扩展实现:

第一个方法的时候,其实非常简单,方法的参数是beanFactory,所以可以通过add,set,register的方式向容器中添加任何的对象

第二个方法OnRefresh没有参数,可以任意定义核心的功能组件,当具体进行调用的时候,需要继承当前的父类,在子类方法中进行扩展实现,调用的时候会直接找到子类方法执行,像Spring boot中的tomcat就是通过createWebServer方法实现的。

在前期完成基本的扩展工作后,开始进行bean对象的实例化操作,也就是整个生命周期。具体分为实例化和初始化,其中实例化是通过CreateBeanInstance来完成的,比如有new factorybean。

AOP也是在IOC基础之上完成的扩展功能。

那对象什么时候销毁?容器关闭的时候销毁。

下载仅供下载体验和测试学习,不得商用和正当使用。

下载体验

请输入密码查看内容!

如何获取密码?

 

点击下载