1.1 什么是spring

任何 实际 的 应用 程序 都是 由 很多 组件 组成 的,

Spring 的 核心 是 提供 了 一个 容器( container), 通常 称为 Spring 应用 上下文( Spring application context), 它们 会 创建 和 管理 应用 组件。 这些 组件 也可以 称为 bean, 会在 Spring 应用 上下 文中 装配 在一起, 从而 形成 一个 完整 的 应用 程序。将 bean 装配 在一起 的 行为 是 通过 一种 基于 依赖 注入( dependency injection, DI) 的 模式 实现 的。

在历史上, 指导 Spring 应用 上下文 将 bean 装配 在一起 的 方式 是 使用 一个 或 多个 XML 文件,但是, 在最 近的 Spring 版本 中, 基于 Java 的 配置 更为 常见。 

最近, 随着 Spring Boot 的 引入, 自动 配置 的 能力 已经 远远 超出 了 组件 扫描 和 自动 装配。 Spring Boot 是 Spring 框架 的 扩展, 提供 了 很多 增强 生产 效率 的 方法。 最为 大家 所 熟知 的 增强 方法 就是 自动 配置。

 

为了降低Java开发的复杂性,Spring采取了以下4种关键策略:

  • 基于POJO的轻量级和最小侵入性编程;
  • 通过依赖注入和面向接口实现松耦合;
  • 基于切面和惯例进行声明式编程;
  • 通过切面和模板减少样板式代码。

依赖注入

任何一个有意义的应用一般都需要多个组件,这些组件之间必定需要进行相互协作才能完成特定的业务,从而导致组件之间的紧耦合,牵一发而动全身

依赖注入最大的好处–松耦合。如果一个对象只通过接口(而不是具体实现或初始化的过程)来表明依赖关系,那么这种依赖就能够在对象本身毫不知情的情况下,用不同的具体实现进行替换。

应用切面

通常情况下,系统由许多不同组件组成,其中的每一个组件分别负责一块特定功能。除了实现自身核心的功能之外,这些组件还经常承担着额外的职责,诸如日志、事务管理和安全等,此类的系统服务经常融入到有自身核心业务逻辑的组件中去,这些系统服务通常被称为横切关注点,因为它们总是跨越系统的多个组件。

AOP

AOP是Spring应用系统开发切面的基础,与依赖注入一样,可以帮助应用对象解耦。借助于AOP,可以将遍布于应用的关注点(如事务和安全等)从所应用的对象中解耦出来。

 

1. 2   初始化 Spring 应用

 一个 典型的 Maven 或 Gradle 项目 结构, 其中 应 用的 源 码 放到 了“ src/ main/ java” 中, 测试 代码 放到 了“ src/ test/ java” 中, 而非 Java 的 资源 放到 了“ src/ main/ resources”。 在这 个 项目 结构 中, 我们 需要 注意 以下 几点。

  • mvnw 和 mvnw. cmd: 这是 Maven 包装 器( wrapper) 脚本。 借助 这些 脚本, 即便 你的 机器 上 没有 安装 Maven, 也可以 构建 项目。
  • pom. xml: 这是 Maven 构建 规范, 随后 我们 将会 深入 介绍 该 文件。
  • TacoCloudApplication. java: 这是 Spring Boot 主 类, 它 会 启动 该 项目。 随后, 我们 会 详细 介绍 这个 类。
  • application. properties: 这个 文件 起初 是 空的, 但是 它为 我们 提供 了 指定 配置 属性 的 地方。 在 本章 中, 我们 会 稍微 修改 一下 这个 文件, 但是 我会 将 配置 属性 的 详细 阐述 放到 第 5 章。
  • static: 在 这个 文件夹 下, 你 可以 存放 任意 为 浏览器 提供 服务 的 静态 内容( 图片、 样式 表、 JavaScript 等), 该 文件夹 初始 为 空。
  • templates: 这个 文件夹 中 存放 用来 渲染 内容 到 浏览器 的 模板 文件。 这个 文件夹 初始 是 空的, 不过 我们 很快 就会 往里 面 添加 Thymeleaf 模板。

 

@SpringBootApplication 是一 个 组合 注解, 它 组合 了 3 个 其他 的 注解。

  • @SpringBootConfiguration: 将 该类 声明 为 配置 类。 尽管 这个 类目 前 还没有 太多 的 配置, 但是 后续 我们 可以 按 需 添加 基于 Java 的 Spring 框架 配置。 这个 注解 实际上 是@ Configuration 注解 的 特殊 形式。
  • @EnableAutoConfiguration: 启用 Spring Boot 的 自动 配置。 我们 随后 会 介绍 自动 配置 的 更多 功能。 就 现在 来说, 我们 只需 要 知道 这个 注解 会 告诉告诉 Spring Boot 自动 配置 它 认为 我们 会 用到 的 组件。
  • @ComponentScan: 启用 组件 扫描。 这样 我们 能够 通过 像@ Component、@ Controller、@ Service 这样 的 注解 声明 其他 类, Spring 会 自动 发现 它们 并将 它们 注册 为 Spring 应用 上下文 中的 组件。

1. 3   编写 Spring 应用

Spring 自带 了 一个 强大 的 Web 框架, 名为 Spring MVC。 Spring MVC 的 核心 是 控制器( controller) 的 理念。 控制器 是 处理 请求 并以 某种 方式 进行 信息 响应 的 类。 在 面向 浏览器 的 应用 中, 控制器 会 填充 可选 的 数据 模型 并将 请求 传递 给 一个 视图, 以便 于 生成 返回 给 浏览器 的 HTML。

 

@ Controller 的 主要 目的 是 让 组件 扫描 将 这个 类 识别 为 一个 组件。 因为 HomeController 带有@ Controller, 所以 Spring 的 组件扫描 功能 会 自动 发现 它, 并 创建 一个 HomeController 实例 作为 Spring 应用 上下文 中的 bean。 实际上, 有 一些 其他 的 注解 与@ Controller 有着 类似 的 目的( 包括@ Component、@ Service 和@ Repository)。 你 可 以为 HomeController 添加 上述 的 任意 其他 注解, 其 作用 是 完全 相同 的。

1. 3. 5   了解 Spring Boot DevTools

顾名思义, DevTools 为 Spring 开发 人员 提供 了 一些 便利 的 开发 期 工具, 其中 包括:

  • 代码 变更 后 应用 会 自动 重 启;
  • 当 面向 浏览器 的 资源( 如 模板、 JavaScript、 样式 表) 等 发生 变化 时, 会 自动 刷新 浏览器;
  • 自动 禁用 模板 缓存;
  • 如果 使用 H2 数据库 的 话, 内置 了 H2 控制台。

 

1. 5   小结

  • Spring 旨在 简化 开发 人员 所 面临 的 挑战, 比如 创建 Web 应用 程序、 处理 数据库、 保护 应用 程序 以及 实现 微服 务。
  • Spring Boot 构建 在 Spring 之上, 通过 简化 依赖 管理、 自动 配置 和 运行时 洞察, 使 Spring 更加 易用。
  • Spring 应用 程序 可以 使用 Spring Initializr 进行 初始化。
  • Spring Initializr 是 基于 Web 的 应用, 并且 为 大多数 Java 开发 环境 提供 了 原生 支持。
  • 在 Spring 应用 上下 文中, 组件( 通常 称为 bean) 既可以 使用 Java 或 XML 显 式 声明, 也可以 通过 组件 扫描 发现, 还可以 使用 Spring Boot 自动 配置功能 实现 自动化 配置。