跳转到内容
wechat

Spring ​

日期迭代内容
23-11-241. 导学指引。确定一种学习和记忆 Spring 相关知识点的逻辑树。

导学指引

Java 作为一个编程语言,随着 JVM 功能的完善,Java 逐渐应用于工程领域(相对于科学计算领域)。但是在工程领域,人们实现的 Java 框架很庞大和臃肿,并不利于程序员的理解和应用,于是人们想要把程序员从繁重复杂的传统框架中解放出来。那怎么解决呢?

  1. 人们发现,把现实世界中的一些实际的例子抽象出来,搞出一些设计规则,更便于人们理解和实现程序,于是设计模式出现了。
  2. 之后人们又发现,前人归纳总结的设计模式并不适合“使用 Java 搞工程设计”这一特殊的领域。原因是面向对象编程过程中对象的构造权和对象的依赖关系的管理还是很复杂。于是人们就想,能不能开发一种“工具”——甭管叫什么吧,这种工具能够帮我们管理对象的构造权和对象的依赖关系,这样一来,程序员就可以只用去关注业务就行了。于是 Spring 登场。
  3. 既然要管理对象的构造权和对象的依赖关系,那就得知道什么是“使用 Java 搞工程设计”这一特殊的领域中的对象和对象的依赖关系是个啥吧?于是 JavaBean 的概念登场。
  4. 对象和对象的依赖关系的概念了解之后,就是要设计这个工具了吧。于是容器登场。要想完成容器的实现要解决以下几个问题:
    1. 假设容器这个工具已经有了,那如何把对象和对象的依赖关系与容器联系起来呢?或者说怎么把对象和对象的依赖关系配置给容器呢?于是不同的配置方式登场。
    2. 配置信息给到容器后,容器要把配置信息中的 JavaBean 解析出来吧,那怎么解析呢?解析完了得保存着吧,于是解析过程( BeanDefinite、BeanDefiniteReader……) 登场。
    3. 对象和对象的依赖关系给到容器后,下面就是业务代码用的时候,容器怎么反向查找业务代码所用到的 JavaBean,并构造出对应的对象和依赖关系,并给到业务代码呢?于是装配登场。至此,一个丐版的 容器 就算完成了。
    4. 丐版的容器完成后要看看 Spring 到底是怎么实现的吧,于是 BeanFactory 和 ApplicationContext 登场。
    5. 人们在实践演绎过程中又发现——Spring 实际上管理的是整个JavaBean 的生命周期呀。于是 JavaBean 生命周期登场。
    6. JavaBean 生命周期有了之后,人们发现在 JavaBean 的生命周期中有很多个阶段,每个阶段完成后都可以看作是这个事件完成了,于是人们就想,能不能基于这些事件做一些事情,这样一来不但能实现对生命周期更细粒度的控制,还能使 Spring 适用更丰富的业务场景。但是如何实现这种期望呢,幸好有字节码增强技术。于是事件机制和面向切面编程登场。
    7. 人们又深入了解,发现容器事实上也可以看作是一个 JavaBean 呀,只不过这个 JavaBean 比较特殊而已,这样的话,容器也应该有生命周期的概念,容器的生命周期就是应用上下文。好吧,应用上下文登场了。
  5. 至此,一个支持更加丰富特性的“豪华版”Spring 登场了,也似乎把程序员从复杂繁重的编码工作中解放出来了,但是这就够了嘛?答案是:还是不够。因为程序员还要应付更多复杂的业务场景,如通用的远程调用、国际化的支持、Web、测试等。于是 Spring 的高级特性登场。
  6. 这样就够了嘛?还是不够!那就接着演绎,于是“铂金版”的 Spring 登场——SpringBoot。
  7. 这样还不够?那就接着演绎,给你来个全家桶总可以了吧?于是 SpringCloud 登场。

上面导学指引指出了一种学习和理解 Spring 相关知识点的逻辑树,但为了便于归纳和总结,下面的文档并不完全按照上面👆的逻辑顺序。特此说明。

此外,由于 Spring 是由 Java 实现的,在面试时很多情况下会问到源码的部分。因此,在下面的文档里面,涉及到的源码部分就分散到各个文档中,不会再单独开篇解读。

1. 背景 ​

EJB 开发模式【POJO、JavaBean、对象的状态、RMI 和 RPC、多个 Bean】 EJB 的困境 两个示例证明“没有 Spring 的困境” DIP 设计模式原则之 DI 与 IoC 的区别、依赖注入和依赖查找、IoC 和 Spring Spring 的特点、相关组件、版本更新、SpringBoot 和 SpringCloud 等;

2. Bean ​

思路:容器中保存的内容就是Bean -> 那何为bean -> 如何描述Bean -> Bean注册到容器的方式 -> 在Bean中使用另一个Bean -> Bean的装配【何为装配、装配的分类】 -> Bean的生命周期 -> 针对生命周期的扩展使用 -> 实际的业务场景作为佐例 常用 Bean

3. 容器 ​

使用工厂模式实现自定义的容器 高层视图 BeanFactory Application FactoryBean BeanDefinition BeanDefinitionReader 常见容器、父子容器

4. AOP ​

  1. 实际业务开发过程中遇到的一些问题,引出代理模式
  2. 代理模式的基本概念、分类、实现原理
  3. 基于代理模式发展出面向切面编程(AOP)的相关概念
  4. Spring技术栈中的面向切面编程示例
  5. AOP的常见应用场景【统计方法执行耗时等】

5. Web ​

MVC 实现原理 扩展应用: 内容协商、过滤器、shiro、跨域等 WebFlux

6. 事务 ​

事务特性 Spring 实现事务的两种编程模型 Spring 中事务的相关属性【传播机制、隔离级别、超时控制、回滚策略】 事务失效原因 长事务概念、最佳实践 事务的原理

7. 事件机制 ​

观察者模式 基于 JDK 实现观察者模式 基于 Guaua 实现观察者模式 基于 Spring 实现观察者模式 Spring 中的内建事件类型 基于 SpringBoot 使用事件的示例【数据预热】

8. 应用上下文 ​

9. 资源操作 ​

10. 高级特性 ​

基于 Spring 核心框架,Spring 开发团队实现的扩展性应用,类似于三方包的组件,以便实现开箱即用的效果。

11. 数据校验 ​

使用过程

12. 国际化 ​

使用过程

13. 远程方法调用 ​

RestTemplate

Spring RMI

14. 缓存操作 ​

缓存操作

15. 测试 ​

junit 的使用 版本迭代

16. AOT ​

过程

17. 参考资料 ​

https://github.com/wuyouzhuguli/SpringAll 中关于Spring原理部分 https://doocs.github.io/source-code-hunter/#/ 中关于Spring原理部分

对比平台--EJB VS Spring之间的区别EJB究竟是什么,真的那么神奇吗??

  1. 面渣逆袭:Spring三十五问,四万字+五十图详解
  2. Spring系列课程(1)— 工厂

Web应用常见的业务场景 ​

权限框架 统一响应消息体 全局统一异常 日志接入的配置方案

make it come true