浅析Spring基于注解的AOP
什么是AOP
AOP(Aspect Oriented Programming),面向切面编程,通过预编译方式和运行时动态代理实现在不修改原有业务代码的情况下,对系统功能进行增强。
在AOP中,切面是指一类横跨多个对象的特定行为,比如事务管理、日志管理等。切面可以包含前置、后置、环绕、异常通知等多个通知,对目标对象的方法进行增强。AOP不仅可以增强业务代码的复用性和灵活性,还可以对系统进行解耦,提高系统稳定性和可维护性。
Spring AOP注解
Spring框架提供了对AOP的支持,其中,基于注解的AOP使得AOP的实现更加简单易懂。
常用的Spring AOP注解有:
- @Aspect:定义一个切面,当然切面也是一个类;
- @Pointcut:定义切点,用于定义一组切入点,通常是一个方法;
- @Before:定义前置通知,目标方法之前执行;
- @AfterReturning:定义返回后通知,在目标方法返回结果之后执行;
- @AfterThrowing:定义异常通知,在目标方法抛出异常之后执行;
- @Around:定义环绕通知,包裹目标方法,在方法执行前后加入增强处理。
示例一:记录日志
作用:在方法执行之前和执行之后,分别记录日志。
在方法上加入注解@LogAnnotation
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LogAnnotation {
String value() default "";
}
定义切面:在方法执行前和执行后记录日志
@Aspect
@Component
public class LogAspect {
@Before(value = "@annotation(com.example.demo.LogAnnotation)")
public void beforeMethod(JoinPoint joinPoint) {
String methodName = joinPoint.getSignature().getName();
Object[] args = joinPoint.getArgs();
System.out.println("调用方法" + methodName + ",参数列表:" + Arrays.asList(args));
}
@AfterReturning(value = "@annotation(com.example.demo.LogAnnotation)",returning = "result")
public void afterMethod(JoinPoint joinPoint,Object result) {
String methodName = joinPoint.getSignature().getName();
System.out.println("调用方法" + methodName + ",返回值:" + result);
}
}
测试类:
@RestController
public class TestController {
@RequestMapping("/test")
@LogAnnotation("test方法")
public String test() {
return "Hello, World";
}
}
当我们请求/test接口时,控制台输出:
调用方法test,参数列表:[]
调用方法test,返回值:Hello, World
示例二:异常处理
作用:当目标方法发生异常时,记录异常信息。
在方法上加入@ExceptionLog注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ExceptionLog {
String value() default "";
}
定义切面:当方法抛出异常时,记录异常信息
@Aspect
@Component
public class ExceptionAspect {
@AfterThrowing(value = "@annotation(com.example.demo.ExceptionLog)", throwing = "e")
public void afterThrowing(JoinPoint joinPoint, Throwable e) {
String methodName = joinPoint.getSignature().getName();
System.out.println("调用方法" + methodName + ",异常信息:" + e.getMessage());
}
}
测试类:
@RestController
public class TestController {
@RequestMapping("/test")
@LogAnnotation("test方法")
@ExceptionLog("test方法")
public String test() {
int a = 1 / 0; // 抛出异常
return "Hello, World";
}
}
当我们请求/test接口时,控制台输出:
调用方法test,参数列表:[]
调用方法test,异常信息:/ by zero
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析Spring基于注解的AOP - Python技术站