SpringBoot 注解实现AOP功能,日志记录,操作留痕等等

实现对指定接口进行拦截,横向插入自己的自定义逻辑内容

1. 创建一个自定义注解当做切面

可以按自己的需要创建多个参数使用,我这里为了举例子就写了一个。

package com.a.b.common.utils.operationrecord;

import java.lang.annotation.*;

@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Operation {
    String operationType() default "";
}

2. 创建切面,对拦截(添加了注解的接口)到的内容进行处理

可以通过方法获取请求参数、返回参数、和自定义注解的参数,这里我就不写这么多了,只写了一个获取自定义注解的参数。

package com.a.b.common.utils.operationrecord;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.annotation.Annotation;

/**
 * @program: h6dp-parent
 * @description:
 * @author:
 * @create: 2023-02-08 14:23
 **/
@Aspect
@Component
public class OperationAspect {

	//设置切点
    @Pointcut("@annotation(Operation)")
    public void operationCut() {
    }
    /**
     * 处理完请求后执行
     *
     * @param joinPoint 切点
     * @param jsonResult 接口返回值
     */
    @AfterReturning(pointcut = "operationCut()", returning = "jsonResult")
    public void doAfterReturning(JoinPoint joinPoint, Object jsonResult) {
        //获取自定义注解的值
        MethodSignature signature = (MethodSignature)joinPoint.getSignature();
        Operation operation = signature.getMethod().getDeclaredAnnotation(Operation.class);
        System.out.println("operationType " + operation.operationType());
        System.out.println("joinPoint " + jsonResult);
    }

    @Around(value = "operationCut()")
    public void doAround(ProceedingJoinPoint joinPoint) {
        System.out.println("joinPoint " + joinPoint);
    }

    /**
     * 拦截异常操作
     *
     * @param joinPoint 切点
     * @param e         异常
     */
    @AfterThrowing(pointcut = "operationCut()", throwing = "e")
    public void doAfterThrowing(JoinPoint joinPoint, Exception e) {

    }
}

3. 配置目标,在想要拦截的接口上添加注解

配置目标,在需要拦截的接口上写上刚才的自定义注解,整个流程就算完成了,之后运行项目看
配置拦截

4. 最终效果

最终结果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Spring Boot可以使用注解实现AOP(面向切面编程)。AOP是一种编程范式,它将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,以便更好地实现模块化和复用性。 在Spring Boot中,可以使用@Aspect注解来定义切面,使用@Pointcut注解来定义切点,使用@Before、@After、@Around等注解来定义通知。通过这些注解的组合,可以实现对方法的前置、后置、环绕等操作。 例如,下面的代码演示了如何使用注解实现AOP: ```java @Aspect @Component public class LogAspect { @Pointcut("execution(* com.example.demo.service.*.*(..))") public void pointcut() {} @Before("pointcut()") public void before(JoinPoint joinPoint) { System.out.println("before " + joinPoint.getSignature().getName()); } @After("pointcut()") public void after(JoinPoint joinPoint) { System.out.println("after " + joinPoint.getSignature().getName()); } @Around("pointcut()") public Object around(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("around before " + joinPoint.getSignature().getName()); Object result = joinPoint.proceed(); System.out.println("around after " + joinPoint.getSignature().getName()); return result; } } ``` 在上面的代码中,@Aspect注解表示这是一个切面类,@Component注解表示这是一个Spring组件。@Pointcut注解定义了切点,这里表示拦截com.example.demo.service包下的所有方法。@Before、@After、@Around注解分别表示前置通知、后置通知、环绕通知,它们的参数是切点表达式。 通过这种方式,我们可以很方便地实现AOP,将横切关注点从业务逻辑中分离出来,提高代码的可维护性和可重用性。 ### 回答2: Spring Boot是一种核心框架Spring的扩展,其自动化配置和默认设置能够降低Spring应用程序的开发难度和复杂性。AOP(面向切面编程)是Spring框架中非常重要的一个特性,它提供了一种方法用于跨越应用程序多个部分进行交叉剖面的分离关注点。Spring Boot使用注解实现AOP,使得切面编程的应用变得更加简单和易于维护。 Spring Boot使用AspectJ注解为Aspect提供了支持。Aspect指定义切面的类,通过使用@Aspect注释标记Aspect。在Aspect中,开发者可以通过使用其他注释来定义切点和通知,以及为方便切面声明添加其他接口方法。 切点是一个表达式,它指定要应用切面的位置,例如在方法前,方法后,异常抛出,或联接点(连接点)。在Spring Boot中,可以使用@Pointcut注释来定义切点表达式。可以将切点表达式定义为公共的或私有的类方法,以便重复使用。 通知是切面类中的方法,它定义了在切点执行时应该执行的行为。Spring Boot支持五种类型的通知注释: - @Before:在方法执行前执行切面代码。 - @AfterReturning:当方法正常返回值后执行切面代码。 - @AfterThrowing:在方法抛出异常后执行切面代码。 - @After:在方法执行后执行切面代码,无论方法执行结果如何。 - @Around:在方法执行前和执行后执行切面代码。 在编写完AOP切面以后,还需要将其纳入到Spring IoC容器中。使用@Component注释将切面类注册为Spring Bean组件,并在应用程序上下文中启用AspectJ自动代理。 总之,使用注释实现AOP是Spring Boot中非常重要和受欢迎的特征之一。将重复的代码分离到切面中,确保与业务逻辑分离的代码清晰,可读性和可维护性都得到了极大的提高。 ### 回答3: Spring Boot是一个快速开发的框架,使用起来非常简便,其中注解AOP也是Spring Boot框架中非常常用的一种方式,本文主要介绍Spring Boot如何使用注解实现AOP注解AOP是Spring框架提供的一种AOP编程的方式,它可以通过添加@Aspect注解来定义切面,通过添加@Before、@After、@Around等注解来定义具体的增强逻辑。Spring Boot在实现AOP时,需要借助于AspectJ框架,同时需要定义切面和切点。 首先,需要在应用程序中添加“spring-boot-starter-aop”依赖,然后定义一个被增强的Bean,并在其上添加需要增强的方法(也可以在类或者方法上添加@Aspect注解)。 然后,需要定义一个切面,并在切面上添加@Before、@After、@Around等注解来定义增强逻辑,通过AspectJ的注解方式,可以实现对方法的调用进行切面操作。 最后,需要通过在启动类中添加@EnableAspectJAutoProxy注解来启用AOP代理自动创建功能。 总而言之,Spring Boot中使用注解实现AOP非常简单,只需要添加依赖,定义切面,定义增强逻辑,最后在启动类中启用AOP代理自动创建功能即可。注解AOP可以使得编程更加简单和便捷,同时也能够提高代码的可读性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值