写点什么

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

作者:肖哥弹架构
  • 2024-08-19
    河北
  • 本文字数:3526 字

    阅读完需:约 12 分钟

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

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


肖哥弹架构 跟大家“弹弹” 框架注解使用,需要代码关注

欢迎 点赞,关注,评论。

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

历史热点文章

1、AOP 代理注解

1. @Aspect

1.1 注解作用介绍


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


1.2 注解属性介绍


  • 无特定属性。


1.3 注解业务案例


@Aspect@Componentpublic 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@EnableAspectJAutoProxypublic 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

@Servicepublic 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@Componentpublic 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@EnableAspectJAutoProxypublic class AspectConfiguration {    // 其他Spring配置}
复制代码


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

用户头像

智慧属心窍之锁 2019-05-27 加入

擅长于通信协议、微服务架构、框架设计、消息队列、服务治理、PAAS、SAAS、ACE\ACP、大模型

评论

发布
暂无评论
8 个Spring AOP 全部注解:真实业务使用案例说明(必须收藏)_Java_肖哥弹架构_InfoQ写作社区