0


SpringBoot简单使用切面类(@aspect注解)

💡简介

Spring Boot中的AOP(Aspect Oriented Programming, 面向切面编程)可以让我们实现一些与业务逻辑无关的功能,如日志、事务、安全等。

💡特点

  1. 把这些跨切面关注点抽取出来,实现解耦。
  2. 使用切面承载这些功能的实现,而不污染业务逻辑。
  3. 在定义好的切入点Join Point,执行这些功能,比如方法调用前后。
  4. Spring AOP实现了动态代理,无需修改源码即可集成这些切面逻辑。
  5. 常用的切面功能有日志记录、性能统计、安全控制、事务管理等。
  6. 在Spring Boot中可以通过@Aspect、@Pointcut等注解声明切面。
  7. 通过@Before、@After、@Around定义Advice实现切面的功能。
  8. 使用方便,只需要添加注解配置,即可在应用中集成AOP。

💡常用注解

@Aspect - 标注该类是一个切面类

@Pointcut - 定义一个切入点,可以是一个规则表达式,也可以是一个注解等

@Before - 前置通知,在目标方法调用前执行

@After - 后置通知,在目标方法执行后调用

@AfterReturning - 返回通知,在目标方法正常返回后调用

@AfterThrowing - 异常通知,在目标方法抛出异常后调用

@Around - 环绕通知,围绕目标方法执行

@Order - 定义切面的优先级,值越小优先级越高

@EnableAspectJAutoProxy - 开启Spring对AspectJ切面的支持

💡实例

🌵版本依赖

JDK17

SpringBoot 3.1.0

🌵导入依赖

<modelVersion>4.0.0</modelVersion>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.1.0</version>
</parent>
<groupId>org.example</groupId>
<artifactId>springboot-aspect</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

🌵CalcAspect

@Aspect
@Component
@Slf4j
public class CalcAspect {

    @Pointcut("execution(* com.example.service.CalcService.*(..))")
    private void pointcut() {
    }

    @Before("pointcut()")
    public void before() {
        log.info("********** @Before 前置通知");
    }

    @After("pointcut()")
    public void after() {
        log.info("******** @After 后置通知");
    }

    @AfterReturning("pointcut()")
    public void afterReturning() {
        log.info("******* @AfterReturning 返回通知");
    }

    @AfterThrowing("pointcut()")
    public void afterThrowing() {
        log.info("******** @AfterThrowing 异常通知");
    }

    @Around("pointcut()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        Object result;
        log.info("******** 环绕通知之前");
        result = proceedingJoinPoint.proceed();
        log.info("******** 环绕通知之后");
        return result;
    }

}

🌵CalcServiceImpl

/**
 * 计算服务实现
 * 微信公众号:架构殿堂
 */
@Service
@Slf4j
public class CalcServiceImpl implements CalcService {

    @Override
    public int add(int a, int b) {
        log.info("=========== CalcService 调用开始");
        int result = a + b;
        log.info("=========== CalcService 调用结束");
        return result;
    }

}

🌵CalculatorController

@RequiredArgsConstructor
@RestController
@RequestMapping("/calc")
public class CalculatorController {

    private final CalcService calcService;

    @GetMapping("/add")
    public int add(@RequestParam("a") int a,
                      @RequestParam("b") int b) {
        return calcService.add(a, b);
    }

}

🌵测试结果

2T22:37:34.639+08:00  INFO 10480 --- [nio-8080-exec-1] com.example.aspect.CalcAspect            : ******** 环绕通知之前
2023-09-02T22:37:34.640+08:00  INFO 10480 --- [nio-8080-exec-1] com.example.aspect.CalcAspect            : ********** @Before 前置通知
2023-09-02T22:37:34.641+08:00  INFO 10480 --- [nio-8080-exec-1] c.example.service.impl.CalcServiceImpl   : =========== CalcService 调用开始
2023-09-02T22:37:34.641+08:00  INFO 10480 --- [nio-8080-exec-1] c.example.service.impl.CalcServiceImpl   : =========== CalcService 调用结束
2023-09-02T22:37:34.642+08:00  INFO 10480 --- [nio-8080-exec-1] com.example.aspect.CalcAspect            : ******* @AfterReturning 返回通知
2023-09-02T22:37:34.643+08:00  INFO 10480 --- [nio-8080-exec-1] com.example.aspect.CalcAspect            : ******** @After 后置通知
2023-09-02T22:37:34.644+08:00  INFO 10480 --- [nio-8080-exec-1] com.example.aspect.CalcAspect            : ******** 环绕通知之后

🎁如果需要完整源码请关注公众号"架构殿堂" ,回复 "SpringBoot+AOP"即可获得

🔔写在最后

如果大家对相关文章感兴趣,可以关注公众号"架构殿堂",会持续更新AIGC,java基础面试题, netty, spring boot, spring cloud等系列文章,一系列干货随时送达!

标签: spring boot java 后端

本文转载自: https://blog.csdn.net/jinxinxin1314/article/details/132644150
版权归原作者 fking86 所有, 如有侵权,请联系我们删除。

“SpringBoot简单使用切面类(@aspect注解)”的评论:

还没有评论