一、AOP环绕通知是什么
AOP(Aspect Oriented Programming)面向切面编程是一种程序开发方法,它通过预编译方式和运行期间动态代理的方式实现了对程序各个部分的统一维护。AOP可以解决一些问题,如常规开发中重复代码,耦合性高等问题。
AOP环绕通知是AOP中最为重要的概念之一。它是Spring框架提供的一种通知类型,能够在目标方法执行前后做一些额外的操作。
二、AOP环绕通知的概念
在Spring AOP中,环绕通知是最为重要的一种通知类型。AOP环绕通知可以用于拦截目标方法的调用,并在目标方法执行前后、出现异常时进行统一加工处理。AOP环绕通知是对目标方法进行包裹,我们可以在方法调用前和调用后进行一些特定的操作。
三、AOP环绕通知怎么触发
当目标方法被拦截时,AOP环绕通知便会被触发,并接管目标方法的调用。它可以在任何一个切面中被使用,并且可以在目标方法执行前后进行各种操作。
在Spring AOP中,使用@Around注解定义环绕通知。在目标方法上方应用切面时,这个注解会拦截目标方法的调用。
@Around("execution(* com.example.demo.service.*.*(..))") public Object around(ProceedingJoinPoint jp) throws Throwable { // ... Object result = jp.proceed(); // ... return result; }
四、AOP环绕通知传参数
环绕通知可以获取目标方法的参数,并在执行目标方法时传递参数。在ProceedingJoinPoint中有一个getArgs()方法,可以获取目标方法的所有参数。还可以通过设置setArgs()方法来修改传递给目标方法的参数。
@Around("execution(* com.example.demo.service.*.*(..)) && args(name)") public Object around(ProceedingJoinPoint jp, String name) throws Throwable { // ... Object result = jp.proceed(new Object[] { "newName" }); // ... return result; }
五、AOP环绕通知返回值
环绕通知可以拦截目标方法的返回值,并在返回前或者返回后对返回值进行修改。在ProceedingJoinPoint中有一个proceed()方法,可以获取目标方法的返回值。还可以通过在方法内部设置result变量来修改返回值。
@Around("execution(* com.example.demo.service.*.*(..))") public Object around(ProceedingJoinPoint jp) throws Throwable { // ... Object result = jp.proceed(); if (result != null) { result = result.toString().toUpperCase(); } // ... return result; }
六、AOP环绕通知把目标方法内容没有了
环绕通知是最为强大的通知类型,可以完全接管目标方法的执行,甚至可以将目标方法的执行体替换掉,从而产生某些特别的效果。但是环绕通知滥用会带来一些问题,例如无法处理异步、多线程等操作。
当使用环绕通知时,请确保在环绕通知中调用ProceedingJoinPoint.proceed()方法,以确保目标方法能够正常执行。如果没有执行这个方法,目标方法将不会被调用,也就是说,目标方法中的所有代码都不会执行。
七、AOP前置通知
前置通知是AOP中最简单的通知类型之一,它仅在目标方法执行前被执行。如果您需要在目标方法执行前加入某些代码,比如进行权限检查或者记录请求日志等,则可以使用前置通知。
@Before("execution(* com.example.demo.service.*.*(..))") public void before() { // ... }
八、Spring环绕通知
Spring AOP提供了环绕通知和前置通知两种类型的切面,可以用于拦截和修改方法的执行。Spring的环绕通知与AspectJ非常相似,但是实现机制不同。Spring环绕通知使用基于代理的AOP实现机制,而AspectJ使用基于字节的AOP实现机制。
九、AOP环绕通知可以代替其他的吗
虽然AOP环绕通知很强大,但也并非能够对其它通知类型进行替代。不同的通知类型都有各自的使用场景,需要根据具体的业务场景进行选择。
例如,前置通知的主要作用是在目标方法执行之前进行增强操作,通常用作权限控制、参数校验等简单操作。而环绕通知则更适用于更为复杂的操作,例如记录日志、异常处理等。