Spring框架AOP--环绕通知,异常通知

607 阅读3分钟

Spring AOP的环绕通知是一种强大的通知类型,它可以在目标方法调用前后执行自定义的行为,并且保留了调度被代理对象原有方法的功能。环绕通知可以实现前置通知和后置通知的功能,因此非常灵活和强大。然而,由于它的强大性,它的可控制性相对较弱,所以如果不需要大量改变业务逻辑,并不需要使用它。简单来说,环绕通知就是将前置通知、后置通知、正常返回通知和异常返回通知合并到一起的通知类型。

以下是一个实例:

1.首先定义一个接口 image.png

这个SomeService接口中定义了一个名为around的方法,接受一个字符串参数name和一个整数参数age,返回一个字符串。

2.实现接口

image.png

注意:这个类使用 @Service("s") 注解,这意味着这个类将被Spring框架作为一个服务组件进行管理,其bean的名字为 "s"。

3.定义一个切面类,然后使用Spring AOP的@Aspect注解进行标注

image.png

在这个例子中,Myaround方法会在匹配execution(* com.lexed.service..*(..))切入点表达式的方法调用前后执行。这个切入点表达式表示的是com.lexed.service包及其子包下的所有方法。

这个Myaround方法接受一个ProceedingJoinPoint类型的参数pjp,通过调用pjp.proceed()方法,可以执行被代理对象的目标方法。在pjp.proceed()方法调用前后,你可以添加自定义的行为。

4.编译一个Spring配置文件

image.png

使用<context:component-scan>元素来告诉Spring去扫描com.lexed.service包下的类,这样Spring会自动检测并注册带有@Component@Service@Repository等注解的类作为beans。

使用<aop:aspectj-autoproxy>元素来启用AspectJ的自动代理功能。这样,Spring会自动检测并应用定义在bean中的切面。

5.编译一个测试类

image.png

image.png

异常通知和环绕通知思路大体都是差不多的,不过是注解有些差异,以下是异常环绕的注解实例

image.png

以下是它们的总结:

环绕通知:

  • 环绕通知能够在目标方法调用前后执行自定义的行为,具有非常强大的功能。
  • 通过使用@Around注解和ProceedingJoinPoint参数,可以实现对目标方法的拦截和调用,以及在目标方法执行前后的自定义行为。
  • 环绕通知需要谨慎处理返回值,以确保目标方法的返回值能够正确地传递给调用者。

异常通知:

  • 异常通知能够在目标方法抛出指定类型的异常时执行自定义的行为。
  • 通过使用@AfterThrowing注解和throwing参数,可以定义异常后的通知方法,并接收目标方法抛出的异常作为参数。
  • 异常通知可以用于处理异常、记录日志等场景,以提高程序的健壮性和可维护性