Spring Boot AOP

本文介绍如何在SpringBoot项目中使用面向切面编程(AOP)增强代码功能,通过一个简单示例展示了如何实现方法调用前后的操作,无需修改业务逻辑即可添加新的功能。

AOP

AOP(aspect oriented programming)面向切面(方面)编程,是对所有对象或者是一类对象编程,核心是在不增加代码的基础上, 还增加新功能。打个比方,你调用回家吃饭这个方法,在面向对象编程中,需要给对象添加回家(回城卷)这个方法;而用AOP,不需要添加方法,直接出现传送门送你回家。

引入AOP依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

AOP实例

《在Spring Boot应用中使用JSP开发网页》基础上,实现一个简单的AOP例子。首先在package com.neon.apple下,新建一个package aop。然后在新建的package下,新建一个TestAOP类,用来打印被拦截的方法名。

package com.neon.apple.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

@Aspect  
@Component 
public class TestAOP {

    @Pointcut("execution(* com.neon.apple.controller..*(..)) and @annotation(org.springframework.web.bind.annotation.RequestMapping)")
    public void testAOPPointcut(){} 

    @Around("testAOPPointcut()")
    public void doAround(JoinPoint joinPoint){
        MethodSignature signature = (MethodSignature) joinPoint.getSignature(); 
        java.lang.reflect.Method method = signature.getMethod(); //获取被拦截的方法  
        String methodName = method.getName(); //获取被拦截的方法名  
        System.out.println(methodName);
    }
}

运行

测试/webgl这个URL。
这里写图片描述

打开网页:
这里写图片描述

控制台打印信息:
这里写图片描述

代码解释

@Aspect注解将一个java类定义为切面类。切面(Aspect)指一个关注点的模块化。

连接点(Joinpoint)指在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。在Spring AOP中,一个连接点总是表示一个方法的执行。本例中是URL映射处理方法调用。

@Pointcut定义一个切入点,可以是一个规则表达式。例子中定义了拦截规则:拦截com.neon.apple.controller包下面的所有类中,有@RequestMapping注解的方法。定义了拦截规则:拦截com.neon.apple.controller包下面的所有类中,有@RequestMapping注解的方法。

通知(Advice)指根据需要在切入点不同位置的切入内容。在Spring Boot用注解表示不同类型的通知:
@Before在切入点开始处切入内容
@After在切入点结尾处切入内容
@AfterReturning在切入点return内容之后切入内容(可以用来对处理返回值做一些加工处理)
@Around在切入点前后切入内容,并自己控制何时执行切入点自身的内容
@AfterThrowing用来处理当切入内容部分抛出异常之后的处理逻辑

### Spring Boot AOP 使用教程及示例 #### 一、引入依赖 为了在 Spring Boot 中使用 AOP 功能,需要在项目的 `pom.xml` 文件中添加以下依赖项: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> ``` 这一步是为了确保项目能够支持面向切面编程的功能[^1]。 --- #### 二、创建基础 Spring Boot 应用程序 下面是一个简单的 Spring Boot 启动类示例,用于初始化应用程序上下文: ```java package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } } ``` 这是构建任何 Spring Boot 应用的基础部分[^2]。 --- #### 三、定义切面逻辑 AOP 的核心在于通过切面(Aspect)来处理横切关注点。可以通过 `@Aspect` 注解声明一个切面类,并将其注册为 Spring Bean。 ##### 示例:日志记录切面 假设我们需要在一个方法执行前后打印日志信息,可以按照如下方式编写切面逻辑: ```java package com.example.demo.aspect; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; @Aspect @Component public class LoggingAspect { // 定义切入点表达式 @Pointcut("execution(* com.example.demo.service.*.*(..))") public void serviceMethods() {} // 方法执行前的日志记录 @Before("serviceMethods()") public void logBefore() { System.out.println("Method is about to execute..."); } // 方法成功返回后的日志记录 @AfterReturning("serviceMethods()") public void logAfterReturning() { System.out.println("Method has been executed successfully."); } } ``` 上述代码展示了如何利用 `@Before` 和 `@AfterReturning` 注解分别拦截方法调用之前和之后的行为[^3]。 --- #### 四、测试服务层功能 为了让切面生效,可以在服务层定义一个简单的方法并触发其执行。例如: ```java package com.example.demo.service; import org.springframework.stereotype.Service; @Service public class GreetingService { public String greet(String name) { return "Hello, " + name; } } ``` 当调用 `GreetService.greet()` 方法时,上面定义的切面会自动介入,在方法执行前后打印日志消息。 --- #### 五、启动类中的注解启用 虽然默认情况下 Spring Boot 已经启用了 AOP 支持,但如果遇到某些特殊场景下未正常工作的情况,也可以显式地在启动类上加上 `@EnableAspectJAutoProxy` 注解以强制开启代理机制[^4]。 --- #### 六、常见问题解答 以下是关于 AOP 的几个重要知识点及其解释: 1. **什么是 AOP?** 面向切面编程是一种将业务逻辑与系统级服务分离的技术手段,旨在减少重复代码并增强模块化程度[^5]。 2. **如何实现织入(Weaving)?** 织入是指将切面集成到目标对象的过程,通常发生在编译期、加载期或者运行期间完成这一操作。 3. **ProceedingJoinPoint 是什么?** 这是 AspectJ 提供的一个接口类型参数,允许开发者手动控制连接点流程继续与否,常配合环绕通知 (`@Around`) 使用。 --- ### 总结 以上内容涵盖了从环境搭建到具体实践的一整套解决方案,帮助理解如何基于 Spring Boot 实现 AOP 技术的应用开发过程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值