AOP通知类型

    科技2022-08-11  100

        前置通知:@Before,在连接点方法执行之前执行。     后置通知:@After,在连接点方法执行之后,无论如何都会执行。     环绕通知:@Around,在连接点方法执行之前和之后执行。连接点发生异常时,之后不执行。     异常通知:@AfterThrowing,在连接点方法发生异常之后执行。     返回通知:@AfterReturning,在连接点方法返回结果后执行。如果发生异常,则不会执行。

    1、pom.xml

    <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.0.6.RELEASE</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.2</version> </dependency> <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> </dependency> </dependencies>

    2、业务类

    public class UserService { public int addUser(String name) { // System.out.println(5/0); System.out.println("新增用户"); return 1; } }

    3、切面类

    import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; @Aspect class UserAspects { @Pointcut("execution(public int com.it.huaxin.aop.UserService.addUser(..))") public void pointCut(){}; @Before("pointCut()") public void userBefore() { System.out.println("@Before,前置通知"); } @After("pointCut()") public void userAfter () { System.out.println("@After,后置通知"); } @Around("pointCut()") public Object userAround (ProceedingJoinPoint proceedingJoinPoint) throws Throwable { System.out.println("@Around,环绕通知,执行方法之前"); Object proceed = proceedingJoinPoint.proceed(new Object[]{"张三"}); System.out.println("@Around,环绕通知,执行方法之后"); return proceed; } @AfterThrowing("pointCut()") public void userThrowing () { System.out.println("@AfterThrowing,异常通知,方法发生异常之后执行"); } @AfterReturning("pointCut()") public void userReturing() { System.out.println("@AfterReturning,返回通知 "); } }

    4、配置类

    import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; @Configuration @EnableAspectJAutoProxy public class AopConfig { @Bean public UserService userService() { return new UserService(); } @Bean public UserAspects userAspects() { return new UserAspects(); } }

    5、测试类

    import com.it.huaxin.aop.AopConfig; import com.it.huaxin.aop.UserService; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class AopTest { public static void main(String [] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AopConfig.class); UserService bean = context.getBean(UserService.class); bean.addUser("张三"); } }

    //结果:

    @Around,环绕通知,执行方法之前 @Before,前置通知 新增用户 @Around,环绕通知,执行方法之后 @After,后置通知 @AfterReturning,返回通知 

    // 发生异常,结果:

    @Around,环绕通知,执行方法之前 @Before,前置通知 @After,后置通知 @AfterThrowing,异常通知,方法发生异常之后执行 Exception in thread "main" java.lang.ArithmeticException: / by zero     at com.it.huaxin.aop.UserService.addUser(UserService.java:5)     at com.it.huaxin.aop.UserService$$FastClassBySpringCGLIB$$c2371e8f.invoke(<generated>)     at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)     at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:746)     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)     at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:52)     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)     at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:100)     at com.it.huaxin.aop.UserAspects.userAround(UserAspects.java:24)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     at java.lang.reflect.Method.invoke(Method.java:498)     at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)     at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)     at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)     at org.springframework.aop.aspectj.AspectJAfterAdvice.invoke(AspectJAfterAdvice.java:47)     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)     at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:52)     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)     at org.springframework.aop.aspectj.AspectJAfterThrowingAdvice.invoke(AspectJAfterThrowingAdvice.java:62)     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)     at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)     at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)     at com.it.huaxin.aop.UserService$$EnhancerBySpringCGLIB$$fcde3768.addUser(<generated>)     at com.it.huaxin.test.AopTest.main(AopTest.java:11)

    Processed: 0.032, SQL: 8