spring环绕通知什么时候执行
-
Spring的环绕通知是AOP(面向切面编程)中的一种通知类型,它可以在目标方法执行之前和之后织入增强逻辑。具体来说,环绕通知会将目标方法封装起来,通过在目标方法之前和之后执行额外的代码,来控制目标方法的执行。
环绕通知的执行时间是由切面的织入顺序决定的。在执行目标方法时,环绕通知会被织入到目标方法调用的前后。具体来说,它会在方法调用之前执行额外的代码,然后调用真正的目标方法,最后在方法调用之后再次执行额外的代码。这样就实现了在目标方法执行前后进行额外操作的功能。
在Spring中,环绕通知是通过使用AspectJ表达式来匹配目标方法并进行织入的。AspectJ表达式可以根据方法的访问修饰符、方法的返回类型、方法的参数等条件来进行匹配。只有当目标方法满足AspectJ表达式定义的条件时,才会执行相应的环绕通知。
总结起来,Spring的环绕通知在目标方法执行之前和之后执行额外的代码,用于控制目标方法的执行。它的执行时间由切面的织入顺序决定,并且可以通过使用AspectJ表达式来匹配目标方法。
1年前 -
Spring环绕通知是AOP(面向切面编程)中的一种通知类型,用于在目标方法之前和之后执行自定义的逻辑。它可以在目标方法执行前进行一些前置处理,也可以在目标方法执行后进行一些后置处理。具体地说,Spring环绕通知在目标方法执行之前、之后以及异常时都可以进行处理。
-
目标方法执行之前:在目标方法执行之前,环绕通知可以进行一些前置处理操作,比如参数校验、权限校验、日志记录等。可以通过调用ProceedingJoinPoint的proceed()方法来执行目标方法。
-
目标方法执行:在目标方法执行时,环绕通知可以拦截目标方法的调用,进行一些自定义的操作逻辑。这是环绕通知与其他通知类型的不同之处,它可以完全控制目标方法的执行过程。
-
目标方法执行之后:在目标方法执行完毕后,环绕通知可以进行一些后置处理操作,比如返回值的处理、结果的封装等。可以通过调用ProceedingJoinPoint的proceed()方法获取目标方法的返回值。
-
目标方法执行异常:如果目标方法抛出了异常,环绕通知也可以进行异常处理操作。可以通过捕获异常并进行相应的处理逻辑,比如记录日志、返回错误信息等。
-
执行顺序控制:通过在配置文件中指定通知的顺序,可以控制环绕通知的执行顺序。可以通过设置@Order注解或者实现Ordered接口来控制多个环绕通知的执行顺序。
总之,Spring环绕通知可以在目标方法之前、之后以及异常时执行自定义的逻辑,它可以对目标方法的执行过程进行完全的控制,是AOP中非常重要的一种通知类型。
1年前 -
-
Spring的环绕通知是AOP(面向切面编程)中的一种通知类型。它可以在目标方法执行前后进行拦截,并可以决定是否继续执行目标方法。那么,Spring的环绕通知在什么时候执行呢?下面我们从方法、操作流程等方面进行讲解。
一、Spring环绕通知的执行时机
Spring的环绕通知在目标方法执行前后进行拦截,在目标方法执行之前,环绕通知可以进行一些预处理操作,在目标方法执行之后,环绕通知可以进行一些后处理操作。因此,可以说环绕通知的执行时机是在目标方法执行前后。二、环绕通知的操作流程
下面是环绕通知的操作流程:- 在被切入的目标方法前,Around通知首先会被执行。
- Around通知可以决定是否继续执行目标方法,可以直接返回结果或抛出异常,也可以调用目标方法。
- 如果Around通知调用了目标方法,目标方法被执行。
- 如果Around通知正常返回,AfterReturning通知会被执行。
- 如果Around通知抛出异常,AfterThrowing通知会被执行。
- 无论目标方法是否抛出异常,都会执行After通知。
三、使用环绕通知的步骤
以下是使用环绕通知的步骤:- 创建一个被切入的类和一个目标方法。
- 在配置文件中配置切入点和通知类型。
- 创建一个切面类,并在类上添加@Aspect注解。
- 在切面类中,定义一个环绕通知的方法,并在方法上添加@Around注解。
- 在环绕通知方法中,实现自定义的逻辑处理。
四、示例代码
下面是一个示例代码,演示了如何使用环绕通知:// 目标类 public class UserService { public void addUser(String name) { System.out.println("添加用户:" + name); } } // 配置文件 applicationContext.xml <bean id="userService" class="com.example.UserService" /> // 切面类 @Aspect public class LogAspect { @Around("execution(* com.example.UserService.addUser(..))") public Object around(ProceedingJoinPoint joinPoint) throws Throwable { System.out.println("环绕通知 - 方法调用前"); Object result = joinPoint.proceed(); System.out.println("环绕通知 - 方法调用后"); return result; } } // 测试类 public class Main { public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = (UserService) ctx.getBean("userService"); userService.addUser("Tom"); } }在上面的示例代码中,UserService类是一个目标类,里面有一个addUser()方法。LogAspect类是切面类,其中的around()方法使用@Around注解定义了一个环绕通知。在环绕通知中,先输出"环绕通知 – 方法调用前",然后调用joinPoint.proceed()执行目标方法,最后输出"环绕通知 – 方法调用后"。
运行用例后,控制台输出的结果如下:
环绕通知 - 方法调用前 添加用户:Tom 环绕通知 - 方法调用后从输出结果可以看出,在调用addUser()方法之前和之后,环绕通知中的逻辑被执行了。
总结:Spring的环绕通知在目标方法执行前后进行拦截,并可以决定是否继续执行目标方法,适用于需要在方法执行前进行预处理或者在方法执行后进行后处理的场景。通过配置文件和注解,我们可以方便地使用环绕通知进行方法拦截和处理。
1年前