SpringAOP配置要點
阿新 • • 發佈:2020-09-21
一、基於配置檔案
1、關於aop配置檔案相關
<!--配置aop--> <aop:config> <!--配置切入點表示式--> <aop:pointcut id="aspect_method" expression="execution(* service.Impl.AccountServiceImpl.save())"></aop:pointcut> <!--配置aop切面--> <aop:aspectid="logAdvice" ref="log"> <!--配置通知型別,並建立通知方法和切入點方法的關聯--> <!--配置前置通知 在切入點方法執行之前執行--> <aop:before method="beforeAdvice" pointcut-ref="aspect_method"></aop:before> <!--配置後置通知 在切入點方法執行之後且不發生異常執行--> <aop:after-returningmethod="afterReturnAdvice" pointcut-ref="aspect_method"></aop:after-returning> <!--配置異常通知 在切入點方法發生異常時執行,此時不會執行異常通知--> <aop:after-throwing method="afterThrowsAdvice" pointcut-ref="aspect_method"></aop:after-throwing> <!--配置最終通知 不管切入點方法是否發生異常都會執行--> <aop:after method="afterAdvice" pointcut-ref="aspect_method"></aop:after> <!--配置環繞通知--> <aop:around method="aroundLog" pointcut-ref="aspect_method"></aop:around> </aop:aspect> </aop:config>
2、切面類模板範例
package utils; import org.aspectj.lang.ProceedingJoinPoint; /** * @Classname Logger * @Description TODO * @Date 2020/9/21 15:23 * @Created by Administrator */ public class Logger { public void beforeAdvice() { System.out.println("前置通知記錄日誌..."); } public void afterReturnAdvice() { System.out.println("後置通知記錄日誌..."); } public void afterThrowsAdvice() { System.out.println("異常通知記錄日誌..."); } public void afterAdvice() { System.out.println("最終通知記錄日誌..."); } public Object aroundLog(ProceedingJoinPoint pjp){ Object rtValue=null; try { Object[] args = pjp.getArgs(); System.out.println("前置通知記錄日誌..."); rtValue = pjp.proceed(args); System.out.println("後置通知記錄日誌..."); return rtValue; } catch (Throwable throwable) { System.out.println("異常通知記錄日誌..."); throwable.printStackTrace(); }finally { System.out.println("最終通知記錄日誌..."); } return rtValue; } }
3、切入點表示式寫法
切入點表示式的寫法:
1、標準寫法
許可權修飾符 返回值型別 包名.包名.包名..包名.類名.方法名(引數)
eg:public void service.Impl.AccountServiceImpl.save()
2、省略許可權修飾符
返回值型別 包名.包名.包名..包名.類名.方法名(引數)
eg:void service.Impl.AccountServiceImpl.save()
3、返回值可使用萬用字元代替,表示任意型別
* 包名.包名.包名..包名.類名.方法名(引數)
eg:* service.Impl.AccountServiceImpl.save()
4、包名可使用萬用字元表示任意包名
1)* *.*.*.*.類名.方法名(引數)
2)* *..*.類名.方法名(引數)
5、引數列表
基本型別直接寫名稱 int
引用型別寫包名.類名形式 java.lang.String
使用萬用字元*表示有引數
使用..表示有無引數均可
6、全通配
* *..*.*.*(..)
二、基於註解配置
1、配置類
package sun.config; import org.aspectj.lang.annotation.Aspect; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; /** * @Classname SpringConfig * @Description TODO * @Date 2020/9/21 16:55 * @Created by Administrator */ @Configuration @EnableAspectJAutoProxy @ComponentScan(basePackages = "sun") public class SpringConfig { }
2、切面類註解範例
package sun.utils; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; /** * @Classname Logger * @Description TODO * @Date 2020/9/21 15:23 * @Created by Administrator */ @Component("log") @Aspect public class Logger { @Pointcut("execution(* sun.service.Impl.AccountServiceImpl.save())") private void aspect_method() { } // @Before("aspect_method()") public void beforeAdvice() { System.out.println("前置通知記錄日誌..."); } // @AfterReturning("aspect_method()") public void afterReturnAdvice() { System.out.println("後置通知記錄日誌..."); } // @AfterThrowing("aspect_method()") public void afterThrowsAdvice() { System.out.println("異常通知記錄日誌..."); } // @After("aspect_method()") public void afterAdvice() { System.out.println("最終通知記錄日誌..."); } @Around("aspect_method()") public Object aroundLog(ProceedingJoinPoint pjp) { Object rtValue = null; try { Object[] args = pjp.getArgs(); System.out.println("前置通知記錄日誌..."); rtValue = pjp.proceed(args); System.out.println("後置通知記錄日誌..."); return rtValue; } catch (Throwable throwable) { System.out.println("異常通知記錄日誌..."); throwable.printStackTrace(); } finally { System.out.println("最終通知記錄日誌..."); } return rtValue; } }