例如,当 Service 方法被调用时,Service 对象会触发 `ServiceEvent` 事件。 ```java public void process(String input) { // 触发事件 System.out.println("处理输入:" + input); // 这里可能会再次触发事件,如调用其他 Service } ``` 通过监听这些事件,开发者可以无需在业务代码中检查,就能在不同模块之间传递数据和状态信息。 AOP 原理详解 AOP 是 Spring 处理横切逻辑(如日志、事务、权限验证等)的核心。它通过切入点(Pointcut)将目标方法分割,将横切逻辑抽取到切面(Aspect)中执行。 切面中的通知类型 Spring AOP 提供了多种通知类型: 前置通知(@Before):在方法执行前执行。 后置通知(@After):在方法执行后执行。 异常通知(@AfterThrowing):在方法执行失败时执行。 around 通知(@Around):最灵活的通知类型,允许开发者自定义逻辑。 例如,在切面中定义一个前置通知: ```java @Component public class LogAspect { @Around("execution( com.example.service..(..))") public Object cutAround(ProceedingJoinPoint joinPoint) throws Throwable { // 记录运行参数 return joinPoint.proceed(); } } ``` 这样,所有符合注解的方法调用都会自动触发记录,无需在业务代码中编写日志。 事务管理与异常情况处理 Spring 提供了丰富的事务管理功能,支持事务传播行为、隔离级别以及异常处理机制。 事务传播行为(Propagation Behavior) Spring 支持三种主要的事务传播行为: 1. REQUIRED(默认):当前事务不存在时创建新事务;当前事务存在时抛出异常。 2. REQUIRES_NEW:总是创建新事务,将当前事务挂起。 3. NESTED:只在当前事务存在时创建子事务。 例如,在配置文件中定义一个 `@Transactional` 的 `UserService` Bean: ```xml
例如,当 Service 方法被调用时,Service 对象会触发 `ServiceEvent` 事件。 ```java public void process(String input) { // 触发事件 System.out.println("处理输入:" + input); // 这里可能会再次触发事件,如调用其他 Service } ``` 通过监听这些事件,开发者可以无需在业务代码中检查,就能在不同模块之间传递数据和状态信息。 AOP 原理详解 AOP 是 Spring 处理横切逻辑(如日志、事务、权限验证等)的核心。它通过切入点(Pointcut)将目标方法分割,将横切逻辑抽取到切面(Aspect)中执行。 切面中的通知类型 Spring AOP 提供了多种通知类型: 前置通知(@Before):在方法执行前执行。 后置通知(@After):在方法执行后执行。 异常通知(@AfterThrowing):在方法执行失败时执行。 around 通知(@Around):最灵活的通知类型,允许开发者自定义逻辑。 例如,在切面中定义一个前置通知: ```java @Component public class LogAspect { @Around("execution( com.example.service..(..))") public Object cutAround(ProceedingJoinPoint joinPoint) throws Throwable { // 记录运行参数 return joinPoint.proceed(); } } ``` 这样,所有符合注解的方法调用都会自动触发记录,无需在业务代码中编写日志。 事务管理与异常情况处理 Spring 提供了丰富的事务管理功能,支持事务传播行为、隔离级别以及异常处理机制。 事务传播行为(Propagation Behavior) Spring 支持三种主要的事务传播行为: 1. REQUIRED(默认):当前事务不存在时创建新事务;当前事务存在时抛出异常。 2. REQUIRES_NEW:总是创建新事务,将当前事务挂起。 3. NESTED:只在当前事务存在时创建子事务。 例如,在配置文件中定义一个 `@Transactional` 的 `UserService` Bean: ```xml