《Spring实战》笔记
第一部分 Spring的核心
Spring所有的功能都依赖于它的两个核心特性——依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)。
Spring最根本的使命是简化Java开发。
为了降低Java开发的复杂性,Spring采取了以下4种关键策略:
- 基于POJO的轻量级和最小侵入性编程;
- 通过依赖注入和面向接口实现松耦合;
- 基于切面和惯例进行声明式编程;
- 通过切面和模板减少样板式编程。
通过DI,对象的依赖关系将由框架负责,对象无需自行创建或管理它们的依赖关系,这就是DI所带来的最大收益——松耦合。如果一个对象只通过接口(而不是具体实现或初始化过程)来表明依赖关系,那么这种依赖就能够在对象本身毫不知情的情况下,用不同的具体实现进行替换。
DI能够让相互协作的组件保持松散耦合,而面向切面编程(AOP)允许你把遍布应用各处的功能分离出来形成可重用的组件。
创建对象之间协作关系的行为称作装配(wiring),这也是依赖注入(DI)的本质。
在Spring中装配bean最常见的有3种方式:在XML中进行显式配置、在Java中进行显式配置、隐式的bean发现机制和自动装配。
Spring框架的核心是Spring容器。容器负责管理应用中组件的生命周期,它会创建这些组件并保证它们的依赖能够得到满足。
面向切面的Spring
在软件开发中,散布于应用中多处的功能被称为横切关注点。通常来讲,这些横切关注点从概念上是与应用的业务逻辑相分离的(但是往往会直接嵌入到应用的业务逻辑之中)。把这些横切关注点与业务逻辑相分离正是面向切面编程所要解决的问题。
DI有助于应用对象之间的解耦,而AOP可以实现横切关注点与它们所影响的对象之间的解耦。
切面是通知和切点的结合。通知和切点共同定义了切面的全部内容——它是什么,在何时和何处完成其功能。
引入:引入允许我们向现有的类添加新的方法或属性,而无需修改这些类。
织入:织入是把切面应用到目标对象并创建新的代理对象的过程。
在运行期,AOP容器会为目标对象动态的创建一个代理对象。Spring AOP就是以这种方式织入切面的。
Spring AOP构建在动态代理基础之上,因此,Spring对AOP的支持局限于方法拦截。
下面是一个定义好的切面:
@Aspect
public class Audience {
// 切点+通知
@Before("execution(** concert.Performance.perform(..))")
public void silenceCellPhone() {
System.out.println("Silnecing cell phones");
}
@After("execution(** concert.Performance.perform(..))")
public void applause() {
System.out.println("CLAP CLAP CLAP!!!");
}
}
Web中的Spring
DispatcherServlet是Spring MVC的核心。在这里请求会第一次接触到框架,它要负责将请求路由到其他的组件之中。
将控制器中请求处理的逻辑和视图中的渲染实现解耦是Spring MVC的一个重要特性。控制器只通过逻辑视图名来了解视图,而将逻辑视图名映射为具体的视图则是视图解析器的任务了。
Spring 集成
借助Spring Boot简化Spring开发
Spring Boot的四个主要特性:
- Spring Boot Starter:它将常用的依赖分组进行了整合,将其合并到一个依赖中,这样就可以一次性添加到项目的Maven或Gradle构建中;
- 自动配置:Spring Boot的自动配置特性利用了Spring 4对条件化配置的支持,合理地推测应用所需的bean并自动配置它们;
- 命令行接口:Spring Boot的CLI(Commond-Line Interface)发挥了Groovy语言的优势,并结合自动配置进一步简化了Spring应用的开发;
- Actuator:它为Spring Boot应用添加了一定的管理特性