目录
1. Spring 的特性
Spring 基于 J2EE 技术实现了一套轻量级的 Java Web Service 系统框架,其提供的功能贯穿了项目开发的表现层、业务层和持久化层,有很多优秀的特性,包括轻量、面向容器、面向切面、控制反转(IoC)、框架灵活。
1.1 轻量
从 JAR 包的大小上来说,Spring 是一个轻量级的框架,其核心 JAR 包 spring-web-5.2.0.RELEASE.jar 和 spring-core-5.2.0.RELEASE.jar 的大小均在1.4MB左右;从系统的资源使用上来说,Spring 也是一个轻量级的框架,运行期间只需要少量的操作系统资源(内存和 CPU )便能稳定运行。
1.2 面向容器
Spring 实现了对象的配置化和对象的生命周期管理,因此,可以理解它是面向容器的。
Spring 容器的任务
a. 通过 Spring 的 xml 文件或注解方式,应用程序可以配置每个 Bean 对象被创建和销毁的时间,以及 Bean 对象被创建的先后顺序和依赖关系。
b. Spring 中的实例对象可以是全局唯一的单例模式(Spring的默认模式),也可以是在每次需要时都重新生成一个新的实例,具体以哪种方式创建 Bean 对象由 Bean 的生命周期来决定,通过 prototype
1.3 面向切面
面向切面技术通过分离系统逻辑和业务逻辑来提高系统的内聚性。在具体的使用过程中,业务层只需要关注并实现和业务相关的代码逻辑,而不需要关注系统功能和业务功能的复杂关系。
1.4 控制反转
IoC 有两个方面:依赖注入 和 控制权的转移
依赖注入
本来是在对象内部通过 new 来创建依赖对象,现在通过 Spring 容器来创建和管理依赖对象
控制权的转移
好处
a.降低耦合度 —— 由容器负责创建和管理依赖对象
b.提高可测试性 —— 容易替换依赖对象
c.支持 AOP 编程 —— AOP 的功能基于 IoC 实现
1.5 框架灵活
应用程序可以根据需求引用相应的模块,用于实现不同的功能
2. Spring 的核心 JAR 包
Spring 基于模块化实现,每个模块都对应不同的 JAR 包。要全面了解 Spring ,首先要从 JAR 包开始,但是 Spring 的 JAR 包很多,所以这里只提及 Spring 的核心 JAR 包,并做简要介绍。
序号 | 包名称 | 包说明 |
1 | Spring Core | Spring 的核心工具包 |
2 | Spring Beans | Spring IoC 的实现,通过 XML 配置文件或注解的方式实现对 Spring Bean 的管理 |
3 | Spring Context | Spring 上下文环境,用于对 Bean 的管理和维护等 |
4 | Spring Test | Spring 对 JUnit 等测试框架的支持 |
5 | Spring Web | 基于 Spring 构建 Web 应用开发所需的核心类,包括自动载入 WebApplicationContext、Struts 与 JSF 集成、文件上传、Filter类和其他辅助工具类 |
6 | Spring Web MVC | 包含 Spring MVC 框架相关的所有类。当然,如果你的应用使用了独立的 MVC 框架,则不需要使用这个 JAR 包里的任何类 |
7 | Spring Context Support | Spring Context 的扩展支持,用于支持 MVC 方面的功能 |
8 | Spring JDBC | Spring 针对 JDBC 的封装 |
9 | Spring ORM | Spring 整合第三方 ORM 的实现,例如 MyBatis 、JDO 及 Spring 的 JPA |
10 | Spring OXM | Spring 对 Object/XML 映射的支持,可以让 Spring 在 Java 与 XML 之间方便的切换 |
11 | Spring Aspects | Spring 对 AspectJ 框架的整合和支持 |
12 | Spring Expression Language | Spring 的表达式语言 |
13 | Spring Framework Bom | 处理不同的项目 依赖 不同版本的 Spring 引起的版本冲突 |
14 | Spring Instument | Spring 针对服务器的代理接口 |
15 | Spring Instument Tomcat | Spring 对 Tomcat 的集成 |
16 | Spring JMS | Spring 为简化 JMS API 的使用而做的封装 |
17 | Spring Messaging | Spring 集成 Messaging API 和 消息协议 |
18 | Spring TX | Spring 为 JDBC、JDO、JPA 等提供的一致的声明式事务管理和编程式事务管理 |
19 | Spring WebMVC Portlet | 基于 Portlet 环境的 Spring MVC 的增强 |
3. Spring 的注解
Spring 的注解将应用程序中 Bean 的定义和 Bean 之间复杂的依赖关系的配置从 XML 配置中解放出来,应用程序只需要在某些服务或者功能时使用注解依赖注入即可,Bean 的具体定义和依赖关系由 Spring 的自动装配完成。这让 Spring 的使用更简单方便。
常用注解如下表所示(是我自己比较熟悉的)
类别 | 注解 | 说明 |
Bean 声明 | @Component | 定义基础层的通用组件,没有明确的角色 |
@Service | 定义业务逻辑层的服务组件 | |
@Repository | 在数据访问层定义数据资源服务 | |
@Controller | 在展现层使用,用于定义控制器 | |
Bean 注入 | @Autowired | (Spring提供)服务依赖注入,一般用于注入 @Controller、@Service 定义的组件 |
@Resource | (Java提供的)服务依赖注入,一般用于注入 @Repository 定义的组件 | |
配置类注解 | @Configuration | 声明该类为配置类 |
@Bean | 注解在方法上,声明该类的返回值是一个 Bean 实例(这个对象将被注册为 Spring 上下文的一个 Bean) | |
Spring MVC 注解 | @Controller | 声明该类为Spring MVC 中的控制器 |
@RequestMapping | 用于声明和映射 Web 请求的地址和参数,包括访问路径和参数 | |
@ResponseBody | 支持将返回值放在 Response Body 体中返回,通常用于返回 JSON 数据到前端 | |
@RequestBody | 允许 request 的参数 放在 Request Body 中 | |
@PathVariable | 用于接受基于路径的参数 | |
@RestController | 组合注解,相当于 @ResponseBody 和 @Controller 的组合 | |
@ExcepetionHandler | 用于全局控制器的异常处理 | |
AOP 注解 | @EnableAspectJAutoProxy | 开启 Spring 对 AspectJ 代理的支持 |
@Aspect | 声明一个切面 | |
@PointCut | 声明一个切点 | |
@Before | 在方法执行之前执行 | |
@After | 在方法执行之后执行 | |
@Around | 在方法执行之前和之后都执行 |
4. Spring IoC 的原理
IoC ,既“控制反转”,是一种设计思想,将对象的创建和对象之间的依赖关系的维护交给容器来负责,以实现对象和对象之间解耦合的目的。
4.1 Spring IoC 简介
Spring 通过一个配置文件描述 Bean 和 Bean 之间的依赖关系,利用 Java 的反射功能实例化 Bean 并建立 Bean 之间的依赖关系。
4.2 Spring Bean 的装配流程
Spring 会在启动时,从 XML 配置文件或注解中获取 应用程序提供的 Bean 配置信息,并在 Spring Bean 容器中生成一份对应的 Bean 配置注册表;然后根据这张注册表实例化 Bean ,装配好 Bean 之间的依赖关系,从而为上层业务提供基础的运行环境。其中 Bean 缓存池是采用 HashMap 实现。Spring Bean 的装配流程如下图所示。
4.3 Spring Bean 的作用域
Spring 为 Bean 定义了 5 种作用域,分别为 Singleton (单例)、Prototype (原型)、Request (请求级别)、Session(会话级别)、Global Session(全局会话)
a. Singleton
Singleton是单例模式,是 Spring 中的默认作用域。当实例类型为单例模式时,在 Spring IoC 容器中只会存在一个共享的 Bean 实例,无论有多少个 Bean 指向它,都会始终指向一个 Bean 对象。该模式在多线程下是不安全的。
b. Prototype
Prototype 是原型模式,每次通过 Spring 容器回去 Prototype 定义的 Bean 时,容器都会创建一个新的 Bean 实例,每个 Bean 实例都有自己的属性和状态,而 Singleton 只有一个对象。
c. Request
Request 指在一次 HTTP 请求中容器会返回该 Bean 的同一个实例,对不同的 HTTP 请求则会创建新的 Bean 实例,在当前 HTTP 请求结束后,该 Bean 实例也会相应的被销毁。
d. Session
Session 是指在一次 HTTP Session 中,容器会返回该 Bean 的同一个实例,对不同的 Session 请求则会创建新的 Bean 实例。
e. Global Session
Global Session 指在一个全局的 HTTP Session 中容器会返回该 Bean 的同一个实例,且仅在使用 Portlet Context 时有效。