8 个Spring AOP 全部注解:真实业务使用案例说明(必须收藏)

8 个Spring AOP 全部注解:真实业务使用案例说明(必须收藏)

Spring AOP(面向切面编程)是Spring框架的一个重要组成部分,它允许开发者以声明式的方式实现横切关注点,如日志记录、事务管理、安全性控制等。通过使用Spring AOP注解,我们可以将这些横切逻辑与业务逻辑分离,从而保持代码的清晰和可维护性。AOP注解提供了一种强大的机制,使得开发者能够在不修改主业务逻辑代码的前提下,为应用程序添加丰富的横切功能,增强了代码的模块化和重用性。这些注解包括@Aspect、@Pointcut、@Before、@After、@AfterReturning、@AfterThrowing、@Around和@EnableAspectJAutoProxy等,它们共同构成了Spring AOP的核心,使得开发者能够轻松地实现复杂的企业级特性。

肖哥弹架构 跟大家“弹弹” 代码设计技巧,需要代码关注

欢迎 点赞,关注,评论。

关注公号Solomon肖哥弹架构获取更多精彩内容

历史热点文章

28个验证注解,通过业务案例让你精通Java数据校验(收藏篇)Java 8函数式编程全攻略:43种函数式业务代码实战案例解析(收藏版)69 个Spring mvc 全部注解:真实业务使用案例说明(必须收藏)24 个Spring bean 全部注解:真实业务使用案例说明(必须收藏)MySQL索引完全手册:真实业务图文讲解17种索引运用技巧(必须收藏)一个项目代码讲清楚DO/PO/BO/AO/E/DTO/DAO/ POJO/VO

1、AOP代理注解

1. @Aspect

1.1 注解作用介绍

@Aspect 注解用于标识一个类作为切面类,允许在其中定义切点和通知。

1.2 注解属性介绍

无特定属性。

1.3 注解业务案例

@Aspect

@Component

public class SecurityAspect {

// 切点和通知定义

}

2. @Pointcut

2.1 注解作用介绍

@Pointcut 注解用于定义一个切点,可以与@Before、@AfterReturning、@AfterThrowing等注解结合使用。

2.2 注解属性介绍

value: 指定切点表达式。

2.3 注解业务案例

@Pointcut("execution(* com.example.service.*.*(..))")

public void pointcutServiceMethods() {

// 切点表达式定义,匹配com.example.service包下的所有方法。

}

3. @Before

3.1 注解作用介绍

@Before 注解用于定义前置通知,它会在目标方法执行之前执行。

3.2 注解属性介绍

value 或 pointcut: 指定切点表达式。 3.3 注解业务案例

@Before("pointcutServiceMethods()")

public void logBeforeServiceMethod(JoinPoint joinPoint) {

// 日志记录逻辑,例如记录方法名和参数

String methodName = joinPoint.getSignature().getName();

Object[] args = joinPoint.getArgs();

System.out.println("Entering: " + methodName + " with arguments " + Arrays.toString(args));

}

4. @After

4.1 注解作用介绍

@After 注解用于定义后置通知,它会在目标方法执行之后执行。

4.2 注解属性介绍

value 或 pointcut: 指定切点表达式。

4.3 注解业务案例

@After("pointcutServiceMethods()")

public void logAfterServiceMethod(JoinPoint joinPoint) {

// 日志记录逻辑,例如记录方法执行完成

String methodName = joinPoint.getSignature().getName();

System.out.println("Exiting: " + methodName);

}

5. @AfterReturning

5.1 注解作用介绍

@AfterReturning 注解用于定义返回后通知,它会在目标方法成功执行并返回结果之后执行。

5.2 注解属性介绍

value 或 pointcut: 指定切点表达式。returning: 指定从目标方法返回的参数名称。 5.3 注解业务案例

@AfterReturning(pointcut = "pointcutServiceMethods()", returning = "result")

public void logAfterReturningServiceMethod(Object result) {

// 处理方法返回结果

System.out.println("Service method returned: " + result);

}

6. @AfterThrowing

6.1 注解作用介绍

@AfterThrowing 注解用于定义异常抛出通知,它会在目标方法抛出异常之后执行。

6.2 注解属性介绍

value 或 pointcut: 指定切点表达式。throwing: 指定异常参数名称。

6.3 注解业务案例

@AfterThrowing(pointcut = "pointcutServiceMethods()", throwing = "exception")

public void logAfterThrowingServiceMethod(Exception exception) {

// 异常处理逻辑

System.err.println("Service method threw exception: " + exception.getMessage());

}

7. @Around

7.1 注解作用介绍

@Around 注解用于定义环绕通知,它包围目标方法的执行,允许在方法执行前后和方法抛出异常时执行自定义逻辑。 7.2 注解属性介绍

value 或 pointcut: 指定切点表达式。 7.3 注解业务案例

@Around("pointcutServiceMethods()")

public Object aroundServiceMethod(ProceedingJoinPoint joinPoint) throws Throwable {

// 方法执行前后的逻辑

long startTime = System.currentTimeMillis();

Object result = joinPoint.proceed(); // 继续执行目标方法

long endTime = System.currentTimeMillis();

System.out.println("Execution time: " + (endTime - startTime) + " ms");

return result;

}

8. @EnableAspectJAutoProxy

8.1 注解作用介绍

@EnableAspectJAutoProxy 注解用于开启对AspectJ代理的支持,通常在配置类上使用。 8.2 注解属性介绍

无特定属性。 8.3 注解业务案例

@Configuration

@EnableAspectJAutoProxy

public class AspectConfiguration {

// 其他Spring配置

}

2、AOP代理注解综合案例

电子商务平台的订单服务,其中包含订单创建、订单支付和订单状态查询的方法。我们需要记录每个订单操作的日志、监控操作的执行时间,并处理可能发生的异常。

2.1 实体类:Order

public class Order {

private Long id;

private String status;

// 其他订单属性和方法

}

2.2 服务接口:OrderService

public interface OrderService {

void createOrder(Order order);

void processPayment(Long orderId);

Order getOrderStatus(Long orderId);

}

2.3 服务实现:OrderServiceImpl

@Service

public class OrderServiceImpl implements OrderService {

@Override

public void createOrder(Order order) {

// 创建订单的业务逻辑

}

@Override

public void processPayment(Long orderId) {

// 处理订单支付的业务逻辑

}

@Override

public Order getOrderStatus(Long orderId) {

// 获取订单状态的业务逻辑

return new Order(); // 返回新订单状态

}

}

2.4 切面类:OrderAspect

@Aspect

@Component

public class OrderAspect {

@Pointcut("execution(* com.example.ecommerce.service.OrderService.*(..))")

public void orderServiceMethods() {}

@Before("orderServiceMethods()")

public void logBeforeOrderServiceMethod(JoinPoint joinPoint) {

// 日志记录逻辑,记录方法入口

String methodName = joinPoint.getSignature().getName();

System.out.println("Before method: " + methodName);

}

@AfterReturning(pointcut = "orderServiceMethods()", returning = "result")

public void logAfterReturningOrderServiceMethod(Object result) {

// 处理方法返回结果

System.out.println("After method returned: " + result);

}

@AfterThrowing(pointcut = "orderServiceMethods()", throwing = "error")

public void logAfterThrowingOrderServiceMethod(Exception error) {

// 异常处理逻辑

System.err.println("Exception in order service: " + error.getMessage());

}

@Around("orderServiceMethods()")

public Object aroundOrderServiceMethod(ProceedingJoinPoint joinPoint) throws Throwable {

// 方法执行前后的逻辑

long startTime = System.currentTimeMillis();

Object result = joinPoint.proceed(); // 继续执行目标方法

long endTime = System.currentTimeMillis();

System.out.println("Execution time: " + (endTime - startTime) + " ms");

return result;

}

}

2.5 配置类:AspectConfiguration

@Configuration

@EnableAspectJAutoProxy

public class AspectConfiguration {

// 其他Spring配置

}

本案例中,我们定义了一个Order实体类、一个OrderService接口及其实现OrderServiceImpl。OrderAspect切面类使用@Aspect注解标识,其中定义了多个通知方法,使用@Pointcut定义了切点表达式,这些通知方法将应用于OrderService中的所有方法。我们还使用@Before、@AfterReturning、@AfterThrowing和@Around注解来定义前置通知、返回后通知、异常抛出通知和环绕通知。最后,AspectConfiguration配置类用于开启AspectJ自动代理。

相关推荐

校笺的意思
365娱乐场投注

校笺的意思

📅 09-03 👁️ 6228
罗纳尔多被加冕为世界杯决赛进球最多的足球运动员
天天365彩票软件官方下载3D

罗纳尔多被加冕为世界杯决赛进球最多的足球运动员

📅 07-30 👁️ 9112
马丁靴配什么裙子
天天365彩票软件官方下载3D

马丁靴配什么裙子

📅 07-26 👁️ 5135
世界杯何以火爆全球?
365bet在线官网

世界杯何以火爆全球?

📅 07-30 👁️ 5433
葡萄柚可以放多久 | 飲食指南
365娱乐场投注

葡萄柚可以放多久 | 飲食指南

📅 09-16 👁️ 6777
DNF斗兽场印章快速获得攻略 速刷斗兽场印章
365娱乐场投注

DNF斗兽场印章快速获得攻略 速刷斗兽场印章

📅 07-03 👁️ 1563