mirror of
https://gitee.com/many2many/java-web.git
synced 2025-01-11 14:40:55 +08:00
changed
This commit is contained in:
parent
7f461fc7de
commit
5590eeb075
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user