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

这篇具有很好参考价值的文章主要介绍了SpringBoot简单使用切面类(@aspect注解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


SpringBoot简单使用切面类(@aspect注解),SpringBoot,spring boot,java,后端

简介

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。


常用注解

SpringBoot简单使用切面类(@aspect注解),SpringBoot,spring boot,java,后端

@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简单使用切面类(@aspect注解),SpringBoot,spring boot,java,后端

  1. 代码解耦

    通过将横切关注点(如日志、事务等)与业务逻辑分离,使得代码更加模块化,便于维护和扩展。

  2. 减少重复代码

    AOP可以将通用的功能抽取到一个切面中,然后在需要的地方进行引用,避免了重复编写相同的代码。

  3. 提高代码的可重用性

    AOP可以将通用的功能封装成一个切面,然后在多个类或方法中进行引用,提高了代码的可重用性。

  4. 增强代码的灵活性

    AOP可以在运行时动态地改变程序的行为,增强了代码的灵活性。

  5. 易于测试

    AOP可以将测试代码与业务逻辑分离,使得测试更加简单和方便。


总结

在SpringBoot项目中,使用@Aspect可以帮助我们更好地组织和管理代码,提高代码的可读性和可维护性。

通过将横切关注点与业务逻辑分离,我们可以更专注于实现业务功能,同时避免重复编写相同的代码。

此外,AOP还可以提高代码的灵活性,使得我们在运行时可以动态地改变程序的行为。

总之,使用@Aspect是SpringBoot项目中的一个非常有用的特性,值得我们学习和掌握。


下载地址

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


写在最后

感谢您的支持和鼓励! 😊🙏

如果大家对相关文章感兴趣,可以关注公众号"架构殿堂",会持续更新AIGC,系统架构, 分布式, java, GO, python, 游戏相关 等系列文章,一系列干货随时送达!

SpringBoot简单使用切面类(@aspect注解),SpringBoot,spring boot,java,后端文章来源地址https://www.toymoban.com/news/detail-696065.html

到了这里,关于SpringBoot简单使用切面类(@aspect注解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Spring】javaBean、依赖注入、面向切面AOP、使用注解开发

    有一定规范的Java实体类,类内提供了一些公共方法以便外界对该对象的内部属性进行操作 所有属性都是private,所有的属性都可以通过get/set方法进行访问,同时还需要有一个无参构造(默认就有) 高内聚,低耦合是现代软件的开发的设计模式 之前编写的图书管理系统具有高

    2024年02月08日
    浏览(86)
  • 【Spring】使用aop切面编程时要给那些类加注解

    🎄欢迎来到@边境矢梦°的csdn博文🎄  🎄本文主要梳理 Spring 中使用aop切面编程时要给那些类加注解 🎄 🌈我是边境矢梦°,一个正在为秋招和算法竞赛做准备的学生🌈 🎆喜欢的朋友可以关注一下 🫰🫰🫰 ,下次更新不迷路🎆 Ps: 月亮越亮说明知识点越重要 (重要性或者

    2024年02月07日
    浏览(48)
  • 【SpringBoot】| Spring Boot 常见的底层注解剖析

    目录 一:Spring Boot 常见的底层注解 1. 容器功能 1.1 组件添加 方法一:使用@Configuration注解+@Bean注解 方法二:使用@Configuration注解+@Import注解  方法三:使用@Configuration注解+@Conditional注解  1.2 原生xml配置文件引入 @ImportResource注解 1.3 配置绑定 方法一:@Component注解 + @Configu

    2024年02月17日
    浏览(41)
  • 注解 + spring aop切面+ SpringEl

    2024年02月09日
    浏览(48)
  • SpringBoot 使用【AOP 切面+注解】实现在请求调用 Controller 方法前修改请求参数和在结果返回之前修改返回结果

    在项目中需要实现 在请求调用 Controller 方法前修改请求参数和在结果返回之前修改返回结果 。 我们可以使用 AOP 切面+注解的形式实现。这样我们就可以在不修改原始代码的情况下,通过切面类在方法调用前后插入额外的逻辑。 自定义注解 @PreProcess 自定义注解 @PreProcess 用于

    2024年03月20日
    浏览(45)
  • Java、Java EE、Spring和Spring Boot核心注解

    文章迁移至个人博客 此页面包含常用 Java 、 Java EE 、 Spring 、 Spring Boot 、 JPA 常用注解的一站式说明。 @Component注解 @Component 注解表明被注解的类是一个“spring bean/组件”。@Component注解告诉Spring容器自动创建Spring bean。 @Autowired注解 @Autowired 注解用于自动注入 bean。@Autowired 注

    2024年02月15日
    浏览(50)
  • Spring5系列学习文章分享---第三篇(AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式))

    开篇: 欢迎再次来到 Spring 5 学习系列!在这个博客中,我们将深入研究 Spring 框架的AOP概念+原理+动态代理+术语+Aspect+操作案例(注解与配置方式)。 概念 什么是AOP (1)面向切面编程(方面),利用 AOP 可以对业务逻辑的各个部分进行隔离,从而使得 业务逻辑各部分之间的

    2024年01月24日
    浏览(47)
  • JAVA:使用 Spring AOP 实现面向切面编程

    1、简述 在现代的软件开发中,面向切面编程(AOP)是一种重要的编程范式,它允许我们将横切关注点(如日志记录、性能监控、事务管理等)从应用程序的核心业务逻辑中分离出来,以提高代码的模块化和可维护性。Spring 框架提供了强大的 AOP 支持,使得我们可以轻松地实

    2024年04月13日
    浏览(45)
  • java spring boot 注解、接口和问题解决方法(持续更新)

    @RestController         是SpringMVC框架中的一个注解,它结合了@Controller和@ResponseBody两个注解的功能,用于标记一个类或者方法,表示该类或方法用于处理HTTP请求,并将响应的结果直接返回给客户端,而不需要进行视图渲染 @Controller         是Spring Framework中的注解,用于

    2024年02月06日
    浏览(54)
  • spring-自定义AOP面向切面注解--统一切面处理-登陆信息采集

    2023华为OD统一考试(A+B卷)题库清单-带答案(持续更新)or2023年华为OD真题机考题库大全-带答案(持续更新) 1. 先写一个登陆记录注解(//记录:XXX时间,XXX姓名,XX系统,登录成功) 2. 写一个切面对注解进行处理(业务逻辑处理,记录登陆的信息) 3.写一个登录的控制类,

    2024年02月13日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包