首页 > 其他分享 >Springboot整合AOP和注解,实现丰富的切面功能

Springboot整合AOP和注解,实现丰富的切面功能

时间:2023-02-08 10:56:29浏览次数:52  
标签:pkslow java springboot TestController 切面 AOP ControllerAspect com Springboot

简介

我们在文章《Spring AOP与AspectJ的对比及应用》介绍了AOP的使用,这篇文章讲解一下AOP与注解的整合,通过注解来使用AOP,会非常方便。为了简便,我们还是来实现一个计时的功能。

整合过程

首先创建一个注解:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PkslowLogTime {
}

然后在一个Service中使用注解:

@Service
@Slf4j
public class TestService {
    @PkslowLogTime
    public void fetchData() {
        log.info("fetchData");
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

这个Service的方法会在Controller中调用:

@GetMapping("/hello")
public String hello() {
  log.info("------hello() start---");
  test();
  staticTest();
  testService.fetchData();
  log.info("------hello() end---");
  return "Hello, pkslow.";
}

接着是关键一步,我们要实现切面,来找到注解并实现对应功能:

@Aspect
@Component
@Slf4j
public class PkslowLogTimeAspect {
    @Around("@annotation(com.pkslow.springboot.aop.PkslowLogTime) && execution(* *(..))")
    public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {
        log.info("------PkslowLogTime doAround start------");
        MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();

        // Get intercepted method details
        String className = methodSignature.getDeclaringType().getSimpleName();
        String methodName = methodSignature.getName();

        // Measure method execution time
        StopWatch stopWatch = new StopWatch(className + "->" + methodName);
        stopWatch.start(methodName);
        Object result = joinPoint.proceed();
        stopWatch.stop();
        // Log method execution time
        log.info(stopWatch.prettyPrint());
        log.info("------PkslowLogTime doAround end------");
        return result;
    }
}

@Around("@annotation(com.pkslow.springboot.aop.PkslowLogTime) && execution(* *(..))")这个表达式很关键,如果不对,将无法正确识别;还有可能出现多次调用的情况。多次调用的情况可以参考:Stackoverflow

这里使用了Spring的StopWatch来计时。

测试

通过maven build包:

$ mvn clean package

日志可以看到有对应的织入信息:

[INFO] Join point 'method-execution(java.lang.String com.pkslow.springboot.controller.TestController.hello())' in Type 'com.pkslow.springboot.controller.TestController' (TestController.java:22) advised by around advice from 'com.pkslow.springboot.aop.ControllerAspect' (ControllerAspect.class(from ControllerAspect.java))
[INFO] Join point 'method-execution(java.lang.String com.pkslow.springboot.controller.TestController.hello())' in Type 'com.pkslow.springboot.controller.TestController' (TestController.java:22) advised by before advice from 'com.pkslow.springboot.aop.ControllerAspect' (ControllerAspect.class(from ControllerAspect.java))
[INFO] Join point 'method-execution(void com.pkslow.springboot.controller.TestController.test())' in Type 'com.pkslow.springboot.controller.TestController' (TestController.java:31) advised by around advice from 'com.pkslow.springboot.aop.ControllerAspect' (ControllerAspect.class(from ControllerAspect.java))
[INFO] Join point 'method-execution(void com.pkslow.springboot.controller.TestController.test())' in Type 'com.pkslow.springboot.controller.TestController' (TestController.java:31) advised by before advice from 'com.pkslow.springboot.aop.ControllerAspect' (ControllerAspect.class(from ControllerAspect.java))
[INFO] Join point 'method-execution(void com.pkslow.springboot.controller.TestController.staticTest())' in Type 'com.pkslow.springboot.controller.TestController' (TestController.java:37) advised by around advice from 'com.pkslow.springboot.aop.ControllerAspect' (ControllerAspect.class(from ControllerAspect.java))
[INFO] Join point 'method-execution(void com.pkslow.springboot.controller.TestController.staticTest())' in Type 'com.pkslow.springboot.controller.TestController' (TestController.java:37) advised by before advice from 'com.pkslow.springboot.aop.ControllerAspect' (ControllerAspect.class(from ControllerAspect.java))
[INFO] Join point 'method-execution(void com.pkslow.springboot.service.TestService.fetchData())' in Type 'com.pkslow.springboot.service.TestService' (TestService.java:12) advised by around advice from 'com.pkslow.springboot.aop.PkslowLogTimeAspect' (PkslowLogTimeAspect.class(from PkslowLogTimeAspect.java))

启动应用后访问接口,日志如下:

总结

通过注解可以实现很多功能,也非常方便。而且注解还可以添加参数,组合使用更完美了。

代码请看GitHub: https://github.com/LarryDpk/pkslow-samples

标签:pkslow,java,springboot,TestController,切面,AOP,ControllerAspect,com,Springboot
From: https://www.cnblogs.com/larrydpk/p/17100953.html

相关文章

  • SpringBoot动态生成接口
    原文链接:https://blog.csdn.net/lmchhh/article/details/128634606文章目录SpringBoot动态生成接口一,简单例子二,各种请求方法以及条件2.1无参GET方法2.2带1参的......
  • SpringBoot实现电子文件签字+合同系统
    本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校......
  • springboot3 security 从始至终--02 PasswordEncoder
    接下来几个章节,将逐个介绍身份验证流程中主要接口接口描述UserDetails代表SpringSecurity所看到的用户GrantedAuthority定义应用程序目的范围内允许用户执......
  • @EnableDiscoveryClient和@EnableEurekaClient springboot3.x
    @EnableDiscoveryClient和@EnableEurekaClient将一个微服务注册到EurekaServer(或其他服务发现组件,例如Zookeeper、Consul等)的步骤1、添加客户端依赖 2、写注解注意......
  • SpringBoot集成mybatis
    SpringBoot创建项目首先创建好项目,详情见:https://www.cnblogs.com/expiator/p/15844275.htmlSpringBoot引入mybatis依赖<dependency><groupId>org......
  • Springboot2前言day0
    一》Springboot是整合spring技术栈的一站式框架,简化Spring技术栈的快速开发脚手架二》Springboot优点【创建独立spring应用,内嵌web服务器,自动starter依赖简化构建配置,自......
  • springboot运维
    先讲一下这个springboot项目在别的环境启动时(Windows的cmd),一些临时属性的设置,使用--server.xx=....,    然后还有开发环境中的一个参数,args,这是一个可以设置一些属......
  • 002_springboot项目中 pom.xml 配置的作用
    parent:用以定义一系列的常用坐标版本;定义一系列的常用坐标组合;比如在pom.xml文件中引入一个javax.servlet,<version>那里是可以不写的,也就是不写版本,而决定采用哪个版本......
  • 001_从零搭建 springboot
    ①打开IDEA,点击左上角文件→新建→项目  ②点击SpringInitializr(注意右侧区域第一行项目SDK,这里要正确选择,个人推荐1.8)  ③GAV:这决定着此项目的工程坐标......
  • springboot开发日记(5)
    @Conditional注解当满足@Conditional中的条件时,才进行组件注入@Conditional有许多派生注解,例如:@ConditionalOnBean:当容器中存在指定的bean组件的时候才进行组件注入@C......