下面是关于“Springboot项目快速实现Aop功能”的完整攻略,希望对你有帮助。
什么是AOP
AOP,全称为Aspect Oriented Programming,即面向切面编程。它是一种基于OOP的扩展,旨在通过预编译方式和运行期动态代理实现程序的透明化、模块化、松耦合等功能。通俗的理解就是,把一些常用功能提取出来,不用在每个业务场景都写一遍,比如日志记录、权限校验、性能统计等。
Springboot项目快速实现Aop功能
添加依赖
在pom.xml文件中添加如下依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
编写切面
编写一个切面类,并在其中编写需要执行的逻辑代码,例如打印日志等。
@Aspect
@Component
public class LogRecordAspect {
private static final Logger logger = LoggerFactory.getLogger(LogRecordAspect.class);
/**
* 定义切入点
*/
@Pointcut("execution(* com.example.demo.controller..*.*(..))")
public void logRecord() {
}
/**
* 在切入点执行前执行
*/
@Before("logRecord()")
public void doBefore(JoinPoint joinPoint) throws Throwable {
// 方法执行前打印日志
logger.info("=====方法开始执行=====");
// 获取方法参数
Object[] args = joinPoint.getArgs();
if (args != null) {
for (Object arg : args) {
logger.info("参数:" + arg.toString());
}
}
}
/**
* 在切入点执行后执行,无论是否发生异常
*/
@After("logRecord()")
public void doAfter(JoinPoint joinPoint) {
// 方法执行后打印日志
logger.info("=====方法执行结束=====");
}
/**
* 在切入点执行后,发生异常时执行
*/
@AfterThrowing(pointcut = "logRecord()", throwing = "ex")
public void doAfterThrowing(JoinPoint joinPoint, Exception ex) {
// 方法执行后抛出异常时打印日志
logger.info("=====方法执行异常=====");
logger.error("异常信息:" + ex.getMessage());
}
}
测试代码
为了演示该切面类的使用,我们编写一个简单的测试类。
@RestController
public class IndexController {
@RequestMapping("/")
public String index() {
return "Hello, world!";
}
@RequestMapping("/test")
public String test(String name) {
if (name == null || "".equals(name.trim())) {
throw new RuntimeException("参数name不能为空!");
}
return "Hello, " + name + "!";
}
}
测试结果
启动应用,访问 / 和 /test 接口,控制台输出如下所示。
2021-09-06 17:57:56.987 INFO 17013 --- [nio-8080-exec-1] c.e.d.aspect.LogRecordAspect : =====方法开始执行=====
2021-09-06 17:57:56.988 INFO 17013 --- [nio-8080-exec-1] c.e.d.aspect.LogRecordAspect : 参数:null
2021-09-06 17:57:57.029 ERROR 17013 --- [nio-8080-exec-1] c.e.d.aspect.LogRecordAspect : =====方法执行异常=====
2021-09-06 17:57:57.030 ERROR 17013 --- [nio-8080-exec-1] c.e.d.aspect.LogRecordAspect : 异常信息:参数name不能为空!
2021-09-06 17:57:57.030 INFO 17013 --- [nio-8080-exec-1] c.e.d.aspect.LogRecordAspect : =====方法执行结束=====
从日志中可以看出,在执行 / 接口时,没有产生异常,控制台只输出了方法开始执行和方法执行结束的日志;当执行 /test 接口时,产生了 RuntimeException 异常,控制台输出了方法开始执行、参数、方法执行异常和方法执行结束的日志。
以上就是快速实现Aop功能的完整攻略,希望对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Springboot项目快速实现Aop功能 - Python技术站