This commit is contained in:
many2many 2024-10-27 11:12:55 +08:00
parent 7f461fc7de
commit 5590eeb075

View File

@ -758,36 +758,80 @@ Java 内置的 `List` 和 `Map` 类型都支持泛型,可以用来存储任意
### 5.5 Spring AOP(了解)
#### 5.5.1 AOP的基本概念
- **定义**: AOP是一种编程范式用于将横切关注点从业务逻辑中分离出来。
- **概念**:
面向切面编程Aspect-Oriented Programming, AOP是一种编程范式旨在通过将**横切关注点(cross-cutting concerns)**从核心业务逻辑中解耦出来实现对系统行为的统一、模块化的管理。横切关注点是指那些贯穿于整个系统、与业务逻辑紧密相关但又相对独立的功能需求如日志记录、事务管理、权限检查、性能监控等。在传统的面向对象编程OOP模型中这些需求往往以分散、重复的方式嵌入各个业务模块中导致代码复杂度上升、模块间耦合度增大影响系统的可读性、可维护性和可扩展性。
> 注:横切关注点指的是与多个模块相关的关注点. 横切关注点原则是软件设计中的一个重要原则,它指的是将那些与多个模块相关的关注点(如日志记录、错误处理、安全性等)从模块中分离出来,放到一个独立的模块中,以避免这些关注点影响到其他模块的核心功能。
- **用途**:
- **日志记录**: 在方法执行前后记录日志。
- **事务管理**: 管理方法的事务边界。
- **安全控制**: 控制方法的访问权限。
- **术语**
- **切点 (Pointcut)**: 定义了哪些连接点将被执行通知。
- **连接点 (Joinpoint)**: 程序执行的某个特定点,如方法调用
- **通知 (Advice)**: 在连接点处执行的动作,如前置通知、后置通知等
- **切面 (Aspect)**: 包含切点和通知的组合
- **切点 (Pointcut)**: 切点是用来匹配连接点的谓语表达式AOP根据切点匹配到在哪些连接点上执行Advice
- **连接点 (Joinpoint)**: 切面与逻辑代码的连接点在SpringBoot中的连接点是方法的执行。切点与连接点的关系就像正则表达式与符合正则表达式的值的关系二者是两个不同维度的东西
- **通知 (Advice)**: 在特定连接点join point处由切面aspect执行的操作。不同的通知类型包括“环绕”around、“前置”before和“后置”after通知。许多AOP框架包括Spring都将通知建模为拦截器并在连接点周围维持一个拦截器链
- **切面 (Aspect)**: 一个跨越多个类的关注点的模块化。事务管理是J2EE应用中一个很好的横切关注点的例子。在Spring AOP中切面是使用普通的类基于模式的方法或使用@Aspect注解的普通类@AspectJ风格来实现的
#### 5.5.2 使用AspectJ进行切面编程
- **定义**: AspectJ是一种常用的AOP框架提供了强大的切面编程能力。
- **示例**:
```java
@Aspect
@Component
@Component // 将此切面注册为Spring容器中的组件
@Aspect // 标记此类为一个切面
public class LoggingAspect {
@Before("execution(* com.example.service.*.*(..))")
/**
* 前置通知Before Advice
* 在所有com.lk.demo包下的类的方法调用之前执行。
*
* @param joinPoint 连接点对象,提供了访问方法调用上下文的方法。
*/
@Before("execution(* com.lk.demo.*.*(..))") // 切点定义
public void logBefore(JoinPoint joinPoint) {
// 连接点:在方法调用之前
System.out.println("Executing: " + joinPoint.getSignature());
}
/**
* 环绕通知Around Advice
* 在所有com.lk.demo.MyService类的方法调用前后执行。
*
* @param joinPoint 连接点对象,提供了访问方法调用上下文的方法。
* @return 方法的返回结果。
* @throws Throwable 如果方法抛出了异常。
*/
@Around("execution(* com.lk.demo.MyService.*(..))") // 切点定义
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
// 连接点:在方法调用之前
System.out.println("Before method call...");
try {
// Proceed to the actual method invocation
// 执行连接点上的方法
Object result = joinPoint.proceed();
// 连接点:在方法调用之后
System.out.println("After method call...");
return result;
} catch (Exception e) {
// 连接点:在方法抛出异常时
System.out.println("Exception thrown: " + e.getMessage());
throw e;
}
}
}
```
### 5.6 Spring事务管理(了解)
#### 5.6.1 事务管理的基本概念
- **定义**: 事务是一组操作的集合,要么全部成功,要么全部失败。
- **ACID属性**:
在计算机科学中特别是在数据库管理和分布式计算领域事务Transaction是一种基本的操作单位它确保了一系列操作要么全部成功要么全部失败。事务的概念是数据库管理系统DBMS中用来保证数据完整性和一致性的重要机制之一。
事务具有以下几个核心特点通常称为ACID属性
- **原子性 (Atomicity)**: 事务中的所有操作要么全部完成,要么一个也不完成。
- **一致性 (Consistency)**: 事务的执行不会破坏数据的一致性。
- **隔离性 (Isolation)**: 事务之间是隔离的,不会相互影响。
@ -808,7 +852,7 @@ Java 内置的 `List` 和 `Map` 类型都支持泛型,可以用来存储任意
```
#### 5.6.3 使用@Transactional进行声明式事务管理
- **定义**: 使用`@Transactional`注解来声明式地管理事务。
- **定义**: 使用@Transactional注解来声明式地管理事务,简化了事务控制代码
- **示例**:
```java
@Service
@ -828,7 +872,7 @@ Java 内置的 `List` 和 `Map` 类型都支持泛型,可以用来存储任意
```
#### 5.6.4 使用编程式事务管理
- **定义**: 通过编程的方式显式地管理事务。
- **定义**: 通过编程的方式显式地管理事务,适用于需要更细粒度控制事务的情况
- **示例**:
```java
@Service