一、Spring是什么
1.1 概述
1.1.1 官方概述
Spring是一个开源的轻量级Java SE(Java标准版本)/Java EE(Java企业版本)开发应用框架,其目的是用于简化企业级应用程序开发。
1.1.2 非官方概述
Spring名字的含义是春天,代表生机勃勃,春意盎然。Spring是Java体系里的一个重要框架。可以理解为,在Spring出现之前,Java的生态体系是暗淡的,没有生机的,是一种休眠状态(Java刚出来比较简单),Spring出现后,像是Java的春天来了,充满了活力,有了Spring后,Java变得非常简单、灵活、方便。
1.2 内容
- 轻量级:零配置编程、API使用简单。
- 面向Bean:只需要编写非常普通的Bean。
- 松耦合:充分利用AOP思想。
- 万能胶:与主流框架无缝集成。
- 设计模式:将Java中经典的设计模式运用得淋漓尽致。
1.2.1 轻量级
不像有些框架,配置繁多,接口复杂。
1.2.2 面向Bean
Java是爪哇岛上的一种咖啡,Bean可以理解成是咖啡豆,是Java里的对象。
Spring里写的就是普通的Java Bean,不依赖任何东西,不像Java的Swing、Hibernate、EJB等框架都需要依赖自己特有的Bean或接口。
1.2.3 松耦合
各种框架独立开发,最后集成在一起运行。
1.2.4 万能胶
能与当今主流的框架无缝集成,比如与Hibernate、MyBatis、Dubbo等框架集成。
1.2.5 设计模式
Spring源码中用到了很多设计模式,比如单例模式、工厂模式、代理模式、观察者模式等等。
二、一切从Bean开始
2.1 Spring设计伊始
2.1.1 Spring为什么而存在
最根本的使命:简化Java开发。
2.1.2 内容
Spring是为解决企业级应用开发的复杂性而设计,它可以做很多事。但归根到底支撑Spring的仅仅是少许的基本概念,而所有这些的基本概念都可以追溯到一个根本的使命:简化开发。这是一个郑重的承诺,其实许多框架都声称在某些方面做了简化。
而Spring则立志于全方面的简化Java开发。对此,它主要采取了4个关键策略:
-
基于POJO的轻量级和最小侵入性编程。(不需要实现任何接口,也不需要继承任何类。代码不交织在一起,你的就是你的,我的就是我的,但可以合在一起运行)
-
通过依赖注入和面向接口松耦合。(变量注入、构造器注入、setter方法注入)
-
基于切面和惯性进行声明式编程。(声明式:比如声明一个事务注解,就能实现事务管理功能。惯性:更符合我们的编程习惯)
-
通过切面和模板减少样板式代码。(RedisTemplate、JdbcTemplate)
而它主要是通过:面向Bean、依赖注入以及面向切面这三种方式达成的。
2.2 面向Bean
2.2.1 Bean
Spring是面向Bean的编程(Bean Oriented Programming,BOP),Bean在Spring中才是真正的主角。Bean在Spring中作用就像是Object对OOP的意义一样,Spring中没有Bean也就没有Spring存在的意义。Spring提供了IOC容器通过配置文件或注解的方式来管理对象之间的依赖关系。

2.2.2 控制反转
控制反转,其中最常见的方式叫依赖注入(Dependency Injection,DI),还有一种方式叫做“依赖查找”(Dependency Lookup,DL),它在C++、Java、PHP以及.NET中都运用。在最早的Spring中是包含有依赖注入方式和依赖查询的,但因为依赖查询使用频率过低,不久就被Spring移除了,所以在Spring中控制反转也被称作依赖注入。它的基本概念是:不创建对象,但是描述创建他们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器(在Spring框架中是IOC容器)负责将这些联系在一起。
在典型的IOC场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法。
补充:IOC容器,存的是Java Bean。Web容器,存的是Servlet。IOC容器的最终目的是为了实现依赖注入。
2.3 依赖注入
Spring设计的核心org.springframework,beans
包(架构核心是org.springframework.core
包)它的设计目标是与JavaBean组件一起使用。这个包通常不是由用户直接使用,而是由服务器将其用作其他多数功能的底层中介。下一个最高级抽象是BeanFactory接口,它是工厂设计模式的实现,允许通过名称创建和检索对象。BeanFactory也可以管理对象之间的关系。
BeanFactory支持两种对象模型:
-
单例:模型提供了具有特定名称的对象的共享实例,可以在查询时对其进行检索。Singleton是默认的也是最常用的对象模型,对于无状态服务对象很理想。
-
原型:模型确保每次检索都会创建单独的对象,在每个用户都需要自己的对象时,原型模型最适合。
Bean工厂的概念是Spring作为IOC容器的基础。IOC则将处理事情的责任从应用程序代码转移到框架。
2.4 面向切面
面向切面编程,即AOP,是一种编程思想,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP的核心构造是切面,它将那些影响多个类的行为封装到可重用的模块中。
AOP和IOC是补充性的技术,他们都运用模块化方式解决企业应用程序开发中的复杂问题。在典型的面向对象开发方式中,可能要将日志记录语句放到所有方法和Java类中才能实现日志功能。在AOP方式中,可以反过来将日志服务模块化,并以声明的方式将他们应用到需要日志的组件上。当然,优势就是Java类不需要知道日志服务的存在,也不需要考虑相关的代码。所以,用Spring AOP编写的应用程序代码是松散耦合的。
AOP的功能完全集成到了Spring事务管理、日志和其他各种特性的上下文中。
AOP常见应用:
- Authentication 权限认证
- Logging 日志
- Transaction Manager 事务
- Lazy Loading 懒加载
- Context Process 上下文处理
- Error Handler 错误跟踪(异常捕获机制)
- Cache 缓存
补充:面向切面编程,也可以理解成是面向规则(切面)编程,一个切面就是一个规则(有规律的事情,如事务、日志等),面向切面编程,重点就是找到切面(规则),如果发现某些事情有一定的规律且重复,则可以考虑用切面来做。
AOP的核心宗旨是:解耦。
三、Spring思想&应用场景

3.1 控制反转
控制反转 可理解为 控制权反转。【控制权】指的是对Bean的控制权,比如Bean的创建、销毁、管理等等。没有Spring之前,对这些Bean的控制都由程序员我们自己完成,有了Spring后,这些控制权都交给了Spring,控制权反转了,所以叫控制反转。
3.2 AOP、IOC、DI之间的关系

3.3 Spring注解编程

四、Spring 5 架构
4.1 架构图


4.2 Spring系统架构模块
4.2.1 核心模块

4.2.2 切面编程模块

4.2.3 数据访问与集成模块

4.2.4 web模块

4.2.5 通信报文模块

4.2.6 集成测试模块

4.2.7 集成兼容模块

4.3 去Servlet化

五、Spring版本命名规则
5.1 常用的软件版本命名规则

5.2 语义化版本命名通用规则

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

5.4 Spring版本命名规则

网友评论