很多萌新在学习Java的初期经常会被什么Spring、SpringFramework、SpringBoot、SpringMVC、SpringCloud...搞得焦头烂额,对这些名词傻傻分不清楚,当然也包括博主本人,那我们今天就一起来看看他们究竟是何方神圣!本来想一篇博客把这些都讲清楚,但是发现每一个都可以细致讲解很多东西,所以就拆分成了几篇文章(Paul:我真是苦啊!)
Spring/SpringFramework
Spring 和 Spring Framework 实际上是指同一个开源 Java 框架,通常简称为 Spring。
百度百科中关于Spring的起源介绍如下:
Spring的历史
要谈Spring的历史,就要先谈J2EE。J2EE应用程序的广泛实现是在1999年和2000年开始的,它的出现带来了诸如事务管理之类的核心中间层概念的标准化,但是在实践中并没有获得绝对的成功,因为开发效率,开发难度和实际的性能都令人失望。
Spring的一个最大的目的就是使Java企业级应用开发更加容易。Spring致力于提供一个以统一的、高效的方式构造整个应用,并且可以将单层框架以最佳的组合揉和在一起建立一个连贯的体系。可以说Spring是一个提供了更完善开发环境的一个框架,可以为POJO(Plain Old Java Object)对象提供企业级的服务。POJO即简单普通的java对象,一般用在数据层映射到数据库表的类,类的属性与表字段一一对应。
Spring 最核心的思想就是不重新造轮子,开箱即用,提高开发效率。
Spring 翻译过来就是春天的意思,它的出现给 Java 程序员带来了春天啊!Amazing!
Java能有今天这种辉煌的市场占比,Spring功不可没,可封内阁首辅大臣!
Spring的特性和优势
Spring Framework有哪些特性,用了这个框架对开发而言有什么好处呢?
从Spring 框架的特性来看:
-
非侵入式:基于Spring开发的应用中的对象可以不依赖于Spring的API
-
控制反转:IOC——Inversion of Control,指的是将对象的创建权交给 Spring 去创建。使用 Spring 之前,对象的创建都是由我们自己在代码中new创建。而使用 Spring 之后。对象的创建都是给了 Spring 框架。
-
依赖注入:DI——Dependency Injection,是指依赖的对象不需要手动调用 setXX 方法去设置,而是通过配置赋值。
-
面向切面编程:Aspect Oriented Programming——AOP
-
容器:Spring 是一个容器,因为它包含并且管理应用对象的生命周期
-
组件化:Spring 实现了使用简单的组件配置组合成一个复杂的应用。在 Spring 中可以使用XML和Java注解组合这些对象。
-
一站式:在 IOC 和 AOP 的基础上可以整合各种企业应用的开源框架和优秀的第三方类库(实际上 Spring 自身也提供了表现层的 SpringMVC 和持久层的 Spring JDBC)
从使用Spring 框架的好处看:
-
Spring 可以使开发人员使用 POJOs 开发企业级的应用程序。只使用 POJOs 的好处是你不需要一个 EJB 容器产品,比如一个应用程序服务器,但是你可以选择使用一个健壮的 servlet 容器,比如 Tomcat 或者一些商业产品。
-
Spring 在一个单元模式中是有组织的。即使包和类的数量非常大,你只要担心你需要的,而其它的就可以忽略了。
-
Spring 不会让你白费力气做重复工作,它真正的利用了一些现有的技术,像 ORM 框架、日志框架、JEE、Quartz 和 JDK 计时器,其他视图技术。
-
测试一个用 Spring 编写的应用程序很容易,因为环境相关的代码被移动到这个框架中。此外,通过使用 JavaBean-style POJOs,它在使用依赖注入注入测试数据时变得更容易。
-
Spring 的 web 框架是一个设计良好的 web MVC 框架,它为比如 Structs 或者其他工程上的或者不怎么受欢迎的 web 框架提供了一个很好的供替代的选择。MVC 模式导致应用程序的不同方面(输入逻辑,业务逻辑和UI逻辑)分离,同时提供这些元素之间的松散耦合。模型(Model)封装了应用程序数据,通常它们将由 POJO 类组成。视图(View)负责渲染模型数据,一般来说它生成客户端浏览器可以解释 HTML 输出。控制器(Controller)负责处理用户请求并构建适当的模型,并将其传递给视图进行渲染。
-
Spring 对 JavaEE 开发中非常难用的一些 API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。
-
轻量级的 IOC 容器往往是轻量级的,例如,特别是当与 EJB 容器相比的时候。这有利于在内存和 CPU 资源有限的计算机上开发和部署应用程序。
-
Spring 提供了一致的事务管理接口,可向下扩展到(使用一个单一的数据库,例如)本地事务并扩展到全局事务(例如,使用 JTA)
Spring有哪些模块/组件?
可以分成下面这七大模块👇
-
数据模块(Data Access / Integration)
-
Web模块
-
切面模块(Aop,Aspects,Instrumentation,Messaging)
-
工具模块(Instrumentation)
-
消息模块
-
核心模块
-
测试模块
1.Data Access/Integration(数据访问/集成)
数据访问/集成层包括 JDBC、ORM、OXM、JMS 和 Transactions 5个模块,具体介绍如下。
-
JDBC 模块:提供了一个 JDBC 的样例模板,使用这些模板能消除传统冗长的 JDBC 编码还有必须的事务控制,而且能享受到 Spring 管理事务的好处。
-
ORM 模块:提供与流行的“对象-关系”映射框架无缝集成的 API,包括 JPA、JDO、Hibernate 和 MyBatis 等。而且还可以使用 Spring 事务管理,无需额外控制事务。
-
OXM 模块:提供了一个支持 Object /XML 映射的抽象层实现,如 JAXB、Castor、XMLBeans、JiBX 和 XStream。将 Java 对象映射成 XML 数据,或者将XML 数据映射成 Java 对象。
-
JMS 模块:指 Java 消息服务,提供一套 “消息生产者、消息消费者”模板用于更加简单的使用 JMS,JMS 用于用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
-
Transactions 事务模块:支持编程和声明式事务管理。
2.Web模块
Spring 的 Web 层包括 Web、Servlet、WebSocket 和 Webflux 4个组件,具体介绍如下。
-
Web 模块:提供了基本的 Web 开发集成特性,例如多文件上传功能、使用的 Servlet 监听器的 IOC 容器初始化以及 Web 应用上下文。
-
Servlet 模块/WebMVC:提供了一个 Spring MVC Web 框架实现。Spring MVC 框架提供了基于注解的请求资源注入、更简单的数据绑定、数据验证等及一套非常易用的 JSP 标签,完全无缝与 Spring 其他技术协作。
-
WebSocket 模块:提供了简单的接口,用户只要实现响应的接口就可以快速的搭建 WebSocket Server,从而实现双向通讯。
-
Webflux 模块: Spring WebFlux 是 Spring Framework 5.x中引入的新的响应式web框架。与Spring MVC不同,它不需要Servlet API,是完全异步且非阻塞的,并且通过Reactor项目实现了Reactive Streams规范。Spring WebFlux 用于创建基于事件循环执行模型的完全异步且非阻塞的应用程序。
此外Spring4.x中还有Portlet 模块,在Spring 5.x中已经移除
-
Portlet 模块:提供了在 Portlet 环境中使用 MVC 实现,类似 Web-Servlet 模块的功能。
3.切面模块
在 Core Container 之上是 AOP、Aspects 等模块,具体介绍如下:
Aop
: Aspect Oriented Programming , 面向切面编程 ,是对 OOP
的补充
Aspects
: 切面
Spring AOP是一个基于代理的 Aop 框架 ,日常使用比较多的
-
AOP 模块:提供了面向切面编程实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态的把这些功能添加到需要的代码中,这样各司其职,降低业务逻辑和通用功能的耦合。
-
Aspects 模块:提供与 AspectJ 的集成,是一个功能强大且成熟的面向切面编程(AOP)框架。
-
Instrumentation 模块:提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。
-
messaging 模块:Spring 4.0 以后新增了消息(Spring-messaging)模块,该模块提供了对消息传递体系结构和协议的支持。
-
jcl 模块: Spring 5.x中新增了日志框架集成的模块。
4.工具模块
Instrumentation , 这个是 Java 的一个接口,可以用来做
-
监控代理
-
事件日志记录
-
代码覆盖率
Examples of such benign tools include monitoring agents, profilers, coverage analyzers, and event loggers.
—— 来自该接口的注释
AspectJ
的 LTW(load-time-weaver) 就是通过该方式来进行切面织入的
5.消息模块
Spring-messaging
模块提供了一种基于 WebSocket
的 STOMP
协议实现
STOMP
(Simple Text Oriented Messaging Protocol) 是一种流文本定向消息协议,也是一种为MOM(Message Oriented Middleware,面向消息的中间件)设计的简单文本协议
常见的这几个MQ都支持该协议,比如 RocketMQ
,RabbitMQ
,ActiveMQ
简单版:启用简单内置消息代理时使用的组件
进阶版:对接外部 MQ
来实现这个广播,订阅等
6 Core Container(Spring的核心容器)
Spring 的核心容器是其他模块建立的基础,也是Spring
最核心的部分,这里有我们熟悉的 控制反转 (Inversion of Control, IOC )和依赖注入( Dependency Injection, DI),由 Beans 模块、Core 核心模块、Context 上下文模块和 SpEL 表达式语言模块组成,没有这些核心容器,也不可能有 AOP、Web 等上层的功能。具体介绍如下:
-
Beans 模块:提供了框架的基础部分,包括控制反转和依赖注入。
控制反转: Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部
(容器),这种思想称为控制反转。
对象的创建权由程序员主动创建转移到容器(由容器创建、管理对象)。这个容器称为:IOC容器或Spring容器
依赖注入: Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,
称之为依赖注入。
程序运行时需要某个资源,此时容器就为其提供这个资源。
例:EmpController程序运行时需要EmpService对象,Spring容器就为其提供并注入EmpService对象
IOC容器中创建、管理的对象,称之为:bean对象
-
Core 核心模块:封装了 Spring 框架的底层部分,包括资源访问、类型转换及一些常用工具类。
-
Context 上下文模块:建立在 Core 和 Beans 模块的基础之上,集成 Beans 模块功能并添加资源绑定、数据验证、国际化、Java EE 支持、容器生命周期、事件传播等。ApplicationContext 接口是上下文模块的焦点。
-
spring-expression:提供对表达式语言(Spring Expression Language) SpEL 的支持,只依赖于 core 模块,不依赖于其他模块,可以单独使用。
7.Test模块
Test 模块:Spring 支持 JUnit(单元测试框架)、TestNG(类似 JUnit)、Mockito(主要用来 Mock 对象)、PowerMock(解决 Mockito 的问题比如无法模拟 final, static, private 方法)等等常用的测试框架,而且还额外提供了一些基于 Spring 的测试功能,比如在测试 Web 框架时,模拟 Http 请求的功能。
包含Mock Objects, TestContext Framework, Spring MVC Test, WebTestClient。