aop execution 方法切点_Spring Boot使用AOP的正确姿势

点击上方蓝色字体,选择“标星公众号”

优质文章,第一时间送达

66套java从入门到精通实战课程分享

  作者 |  James_Shangguan

来源 |  cnblogs.com/sgh1023/p/13363679.html

一、为什么需要面向切面编程?

面向对象编程(OOP)的好处是显而易见的,缺点也同样明显。当需要为多个不具有继承关系的对象添加一个公共的方法的时候,例如日志记录、性能监控等,如果采用面向对象编程的方法,需要在每个对象里面都添加相同的方法,这样就产生了较大的重复工作量和大量的重复代码,不利于维护。面向切面编程(AOP)是面向对象编程的补充,简单来说就是统一处理某一“切面”的问题的编程思想。如果使用AOP的方式进行日志的记录和处理,所有的日志代码都集中于一处,不需要再每个方法里面都去添加,极大减少了重复代码。

二、Spring AOP术语

e125c3d225b4e34c803df67b29fb74f6.png

通知(Advice)包含了需要用于多个应用对象的横切行为,完全听不懂,没关系,通俗一点说就是定义了“什么时候”和“做什么”。

连接点(Join Point)是程序执行过程中能够应用通知的所有点。

切点(Poincut)是定义了在“什么地方”进行切入,哪些连接点会得到通知。显然,切点一定是连接点。

切面(Aspect)是通知和切点的结合。通知和切点共同定义了切面的全部内容——是什么,何时,何地完成功能。

引入(Introduction)允许我们向现有的类中添加新方法或者属性。

织入(Weaving)是把切面应用到目标对象并创建新的代理对象的过程,分为编译期织入、类加载期织入和运行期织入。

三、Spring Boot AOP实战

3.1 引入依赖

Spring Boot使用AOP需要添加spring-boot-starter-aop依赖,如下:

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-aopartifactId>
dependency>

不需要再添加aspectjweaver的依赖了,因为spring-boot-starter-aop包含了aspectjweaver,并且版本是较新的版本,如果在添加老版本(如1.5.4)启动会报错。a9a4065c36f6df05898ab7c5ff0052c5.png

3.2 编写用于拦截的bean

直接定义一个controller,代码如下:

@RestController
public class AopController {

    @RequestMapping("/hello")
    public String sayHello(){
        System.out.println("hello");
        return "hello";
    }
}

3.3 定义切面

Spring采用@AspectJ注解对POJO进行标注,该注解表明该类不仅仅是一个POJO,还是一个切面。切面是切点和通知的结合,那么定义一个切面就需要编写切点和通知。在代码中,只需要添加@Aspect注解即可。

3.3.1 定义切点

切点是通过@Pointcut注解和切点表达式定义的。

@Pointcut注解可以在一个切面内定义可重用的切点。

由于Spring切面粒度最小是达到方法级别,而execution表达式可以用于明确指定方法返回类型,类名,方法名和参数名等与方法相关的部件,并且实际中,大部分需要使用AOP的业务场景也只需要达到方法级别即可,因而execution表达式的使用是最为广泛的。如图是execution表达式的语法:

execution表示在方法执行的时候触发。以“”开头,表明方法返回值类型为任意类型。然后是全限定的类名和方法名,“”可以表示任意类和任意方法。对于方法参数列表,可以使用“..”表示参数为任意类型。如果需要多个表达式,可以使用“&&”、“||”和“!”完成与、或、非的操作。

85dc6c322b138e2e8301753da9f27cd9.png

3.3.2 定义通知

通知有五种类型,分别是:

前置通知(@Before):在目标方法调用之前调用通知

后置通知(@After):在目标方法完成之后调用通知

环绕通知(@Around):在被通知的方法调用之前和调用之后执行自定义的方法

返回通知(@AfterReturning):在目标方法成功执行之后调用通知

异常通知(@AfterThrowing):在目标方法抛出异常之后调用通知

代码中定义了三种类型的通知,使用@Before注解标识前置通知,打印“beforeAdvice...”,使用@After注解标识后置通知,打印“AfterAdvice...”,使用@Around注解标识环绕通知,在方法执行前和执行之后分别打印“before”和“after”。这样一个切面就定义好了,代码如下:

@Aspect
@Component
public class AopAdvice {

    @Pointcut("execution (* com.shangguan.aop.controller.*.*(..))")
    public void test() {

    }

    @Before("test()")
    public void beforeAdvice() {
        System.out.println("beforeAdvice...");
    }

    @After("test()")
    public void afterAdvice() {
        System.out.println("afterAdvice...");
    }

    @Around("test()")
    public void aroundAdvice(ProceedingJoinPoint proceedingJoinPoint) {
        System.out.println("before");
        try {
            proceedingJoinPoint.proceed();
        } catch (Throwable t) {
            t.printStackTrace();
        }
        System.out.println("after");
    }

}

3.4 启动测试

完成之后的代码结构如图所示:

a53be08a8e186dc0f89b2fd9cab80fd7.png

运行AopApplication,在浏览器访问http://localhost:8080/hello,不出意外,控制台输出如图所示:

dc1f660ca667f174ffe6aa7ae3b295ff.png

合抱之木,生于毫末,学习技术也是一个循序渐进的过程。由于博主能力有限,文中可能存在描述不当之处,欢迎指正、补充!如果文章对您有用,那么请轻轻点个”推荐“,以资鼓励!

877b2400f2d63902aa159806b0c668d6.gif

f3f708ef80c36b5e0d646ade2427e76b.gif

  • 新款SpringBoot在线教育平台开源了

  • 50份优秀Java求职者简历

  • SpringCloud前后端分离实战项目视频教程分享

  • 2020年全网最全BAT笔试面试题打包分享

感谢点赞支持下哈 07851bd1ea24f2bedc1a517b90d32aab.gif

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot AOP(面向切面编程)是一种技术,可以在应用程序执行期间拦截和修改方法调用。使用AOP,您可以在不修改原始代码的情况下添加功能,例如日志记录、性能监控、安全性等。 以下是使用Spring Boot AOP的步骤: 1. 添加依赖项:在pom.xml文件中添加Spring AOP依赖项。 ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> ``` 2. 创建切面类:创建一个类,并使用@Aspect注释标记它。在切面类中,您可以定义一个或多个切点和通知方法切点表示在应用程序中要拦截的方法,通知是在切点处执行的代码。 ``` @Aspect @Component public class LoggingAspect { @Before("execution(* com.example.demo.service.*.*(..))") public void logBefore(JoinPoint joinPoint) { System.out.println("Before method execution: " + joinPoint.getSignature().getName()); } @After("execution(* com.example.demo.service.*.*(..))") public void logAfter(JoinPoint joinPoint) { System.out.println("After method execution: " + joinPoint.getSignature().getName()); } } ``` 上面的示例中,我们创建了一个LoggingAspect类,并使用@Component注释将其标记为Spring组件。我们还定义了两个通知方法:logBefore()和logAfter()。这些方法在执行拦截的方法之前和之后执行。 3. 配置AOP:在Spring Boot应用程序的配置文件中,添加以下内容: ``` spring.aop.auto=true ``` 此配置将自动启用Spring AOP。 4. 测试AOP:创建一个简单的Spring Boot服务,并在其中调用要拦截的方法。 ``` @RestController @RequestMapping("/api") public class DemoController { @Autowired private DemoService demoService; @GetMapping("/hello") public String sayHello() { return demoService.sayHello(); } } ``` 在上面的示例中,我们创建了一个DemoController类,并使用@RestController和@RequestMapping注释将其标记为Spring MVC控制器。我们还注入了一个DemoService类,并在sayHello()方法中调用它的方法。 在这里,如果我们想要在调用sayHello()方法之前和之后记录日志,我们可以使用LoggingAspect类中定义的通知方法。在执行应用程序时,您应该看到类似以下内容的输出: ``` Before method execution: sayHello After method execution: sayHello ``` 这表明我们已成功使用Spring Boot AOP拦截和修改方法调用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值