官网

Spring简介

J2EE作为一种企业级应用开发平台,其优异表现是我们有目共睹的。但纵使是最为强大的军队,如果没有一个好的指挥官,不知道如何发挥这支军队的强大战斗力,那这支军队也不可能取得太多辉煌的战果。在J2EE平台的一些早期实践中,就出现了对J2EE平台所提供的各项服务的滥用,将基于J2EE 平台的企业级开发带入了窘境。

Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作 《Expert One-on-One J2EE Design and Development》 中阐述的部分理念和原型衍生而来。它的最初目的主要是为了 简化Java EE的企业级应用开发,相对于过去EJB1时代 重量级 的企业应用开发而言,Spring框架的出现为曾经阴霾的天空带来了灿烂的阳光。

Spring 是一套分层的 full-stack(全栈) 轻量级开源框架,以 IoCAOP 为内核,提供了展现层 Spring MVC 和业务层事务管理等众多的企业级应⽤技术,还能整合开源世界众多著名的第三⽅框架和类库,已经成为使⽤最多的 Java EE 企业应⽤开源框架。在 Java 社区中特别流行,基本上完全代替了企业级JavaBeans(EJB)模型。

Spring特性

核心技术:依赖注入,AOP,事件,资源,i18n国际化,数据验证,数据绑定, 类型转换, SpEL。

测试支持:mock数据, TestContext框架, Spring MVC 测试, WebTestClient。

数据访问:事务管理, DAO层支持, JDBC, ORM, Marshalling XML。

Web框架:Spring MVC ,Spring WebFlux。

集成能力:远程处理, JMS, JCA, JMX, 邮件, 任务, 调度, 缓存。

语言支持:Kotlin, Groovy, 其他动态语言。

核心结构

Spring是⼀个分层⾮常清晰并且依赖关系、职责定位⾮常明确的轻量级框架,主要包括⼏个⼤模块:数据处理模块、Web模块、AOP(Aspect Oriented Programming)/Aspects模块、Core Container模块和 Test 模块,如下图所示,Spring依靠这些基本模块,实现了⼀个令⼈愉悦的融合了现有解决⽅案的零侵⼊的轻量级框架。

![](1-Spring 简介/2e275cb826d217904bbdeb2ec1777349.png)

  • 核⼼容器Core Container) 容器是Spring框架最核⼼的部分,它管理着Spring应⽤中bean的创建、配置和管理。在该模块中,包括了Spring bean⼯⼚,它为Spring提供了DI的功能。基于bean⼯⼚,我们还会发现有多种Spring应⽤上下⽂的实现。所有的Spring模块都构建于核⼼容器之上。
  • ⾯向切⾯AOP)/Aspects Spring对⾯向切⾯编程提供了丰富的⽀持。这个模块是Spring应⽤系统中开发切⾯的基础,与DI⼀样,AOP可以帮助应⽤对象解耦。
  • 数据访问Data Access/IntegrationSpringJDBCDAO模块封装了⼤量样板代码,这样可以使得数据库代码变得简洁,也可以更专注于我们的业务,还可以避免数据库资源释放失败⽽引起的问题。 另外,Spring AOP为数据访问提供了事务管理服务,同时Spring还对ORM进⾏了集成,如HibernateMyBatis等。该模块由JDBCTransactionsORMOXMJMS 等模块组成。
  • 网页支持 该模块提供了SpringMVC框架给Web应⽤,还提供了多种构建和其它应⽤交互的远程调⽤⽅案。 SpringMVC框架在Web层提升了应⽤的松耦合⽔平。
  • 测试支持 为了使得开发者能够很⽅便的进⾏测试,Spring提供了测试模块以致⼒于Spring应⽤的测试。 通过该模块,Spring为使⽤ServletJNDI等编写单元测试提供了⼀系列的mock对象实现。Test模块支持使用 JUnitTestNG 测试 Spring 组件。它提供一致的 Spring ApplicationContexts 加载和这些上下文的缓存。它还提供了可用于单独测试代码的模拟对象。

核心思想

Core核心 : 整个Spring框架构建在Core核心模块之上,它是整个框架的基础。

组成整个Spring框架的各种服务实现被划分到了多个相互独立却又相互依赖的模块当中。这些模块组成了Spring生命之树的枝和干,说白了也就是它们组成了Spring框架的核心骨架。抓住了这副骨架,也就抓住了Spring框架的学习主线。

依赖注入(Dependency Injection Containers)

IoC是轻量级容器(Lightweight Container)兴起而逐渐被很多人提起的一个名词,它的全称为 Inversion of Control,中文通常翻译为“控制反转”,它还有一个别名叫做依赖注入(Dependency Injection)。《Expert Spring MVC and Web Flow》 和 《Expert One-on-One J2EE without EJB》 等书中都将依赖注入看作是IoC的一种方式。

面向切面编程(Aspect-Oriented Programming)

OOP:Object Oriented Programming,OOP作为面向对象编程的模式,获得了巨大的成功,OOP的主要功能是数据封装、继承和多态。

而AOP是一种新的编程方式,它和OOP不同,OOP把系统看作多个对象的交互,AOP把系统分解为不同的关注点,或者称之为切面(Aspect)。

AOP织入

在Java平台上,对于AOP的织入,有3种方式:

  • 编译期:在编译时,由编译器把切面调用编译进字节码,这种方式需要定义新的关键字并扩展编译器,AspectJ就扩展了Java编译器,使用关键字aspect来实现织入;

  • 类加载器:在目标类被装载到JVM时,通过一个特殊的类加载器,对目标类的字节码重新“增强”;

  • 运行期:目标对象和切面都是普通Java类,通过JVM的动态代理功能或者第三方库实现运行期动态织入。

  • Spring的AOP实现就是基于JVM的动态代理。由于JVM的动态代理要求必须实现接口,如果一个普通类没有业务接口,就需要通过CGLIB或者Javassist这些第三方库实现。

使用场景

Spring各模块的依赖关系

![](1-Spring 简介/2ddae41aae4b0e89953b0017abd98ec3.png)

核心容器模块

名称 功能
spring-core 提供IoC和DI等功能
spring-beans 提供Bean容器等功能
spring-context 基于core和beans模块构建,扩展了功能
spring-expression 提供SpEL表达式支持

AOP模块

名称 功能
spring-aop 提供AOP(面向切面编程)支持
spring-aspects 提供AspectJ的集成
spring-instrument 提供类植入和类加载器的实现

数据访问模块

名称 功能
spring-jdbc 提供JDBC抽象层来代替原生JDBC功能
spring-orm 提供主流的ORM框架API支持
spring-oxm 提供支持对象和XML映射抽象层
spring-tx 提供编程式和声明式事务管理

Web模块

名称 功能
spring-web 提供Web功能支持
spring-webmvc 提供Web应用程序的MVC和REST Web Services支持
spring-webflux 提供基于响应式编程的Web框架
spring-websocket 提供Web Socket支持

测试模块

名称 功能
spring-test 提供JUnit或TestNG等主流单元测试框架的集成

集成模块

名称 功能
spring-context-support 支持整合第三方工具
spring-messaging 提供消息功能支持
spring-jms 提供支持JMS消息功能支持
spring-jcl 提供日志框架适配器

Spring优势

  • ⽅便解耦,简化开发

通过Spring提供的IoC容器,可以将对象间的依赖关系交由Spring进⾏控制,避免硬编码所造成的过度程序耦合。⽤户也不必再为单例模式类、属性⽂件解析等这些很底层的需求编写代码,可以更专注于上层的应⽤。

  • AOP编程的⽀持

通过Spring的AOP功能,⽅便进⾏⾯向切⾯的编程,许多不容易⽤传统OOP实现的功能可以通过AOP轻松应付。

  • 声明式事务的⽀持 @Transactional

可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式⽅式灵活的进⾏事务的管理,提⾼开发效率和质量。

  • ⽅便程序的测试

可以⽤⾮容器依赖的编程⽅式进⾏⼏乎所有的测试⼯作,测试不再是昂贵的操作,⽽是随⼿可做的事情。

  • ⽅便集成各种优秀框架

Spring可以降低各种框架的使⽤难度,提供了对各种优秀框架(StrutsHibernateHessianQuartz等)的直接⽀持。

  • 降低JavaEE API的使⽤难度

Spring对JavaEE API(如JDBCJavaMail远程调⽤等)进⾏了薄薄的封装层,使这些API的使⽤难度⼤为降低。

  • 源码是经典的 Java 学习范例

Spring的源代码设计精妙、结构清晰、匠⼼独⽤,处处体现着⼤师对Java设计模式灵活运⽤以及对Java技术的⾼深造诣。它的源代码⽆意是Java技术的最佳实践的范例。

Spring 入门案例

下载 Spring5 依赖

访问repo.spring.io , 右侧选择release-com-org-springframework-spring

![](1-Spring 简介/822d91f20e35d0d2e2970ba70c9bef83.png)

创建普通 Maven 工程

1
2
## 使用cmd 或 git bash
mvn archetype:generate -DgroupId=pers.fulsun -DartifactId=springstudy-project -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false -DarchetypeCatalog=http://maven.aliyun.com/nexus/content/groups/public/

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>pers.fulsun</groupId>
<artifactId>springstudy-project</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>springstudy-project</name>

<properties>
<spring.version>5.3.37</spring.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>

</project>

创建普通类和方法

1
2
3
4
5
6
7
package pers.fulsun.pojo;

public class User {
public void add(){
System.out.println("Hello World: User.add()方法");
}
}

Spring配置创建的对象

创建beans的配置文件spring-bean.xml

1
2
3
4
5
6
7
8
9
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">

<bean id="user01" class="pers.fulsun.pojo.User">
</bean>

</beans>

测试代码的编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package spring.test;

import org.springframework.context.support.FileSystemXmlApplicationContext;

public class HelloWorldTest {
public static void main(String[] args) throws InterruptedException {
// 1、加载自定义的Spring配置文件
// FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("C:\\workspace\\.xml");
FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext("classpath:spring-bean.xml");
// 2、获取配置的User对象
User user = (User) context.getBean("user01");
// 3、操作User对象
user.add();
context.close();
}
}