Springboot如何使用Aspectj實現AOP面向切面編程
要在 Springboot中聲明 AspectJ 切面
需在 IOC 容器中將切面聲明為 Bean 實例 即加入@Component 註解;當在 Spring IOC 容器中初始化 AspectJ 切面之後, Spring IOC 容器就會為那些與 AspectJ 切面相匹配的 Bean 創建代理.
在 AspectJ 註解中, 切面隻是一個帶有 @Aspect 註解的 Java 類.
引入jar包
網上都是說springboot使用Aspectj做面向切面編程的時候,隻需要引入下面jar包依賴即可
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
但是我去編寫的時候,單單引入 spring-boot-starter-aop 的jar依賴的時候,像@Component、@Aspect等這些註解都不能使用,後來發現缺少aspectjweaver 這麼個jar包,最後引入瞭下面的jar才解決問題
<dependency> <groupId>aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.5.3</version> </dependency>
網上也有說要在application.properties中添加
spring.aop.auto=true這個配置,才能開啟Aspectj註解的掃面,但是我去查詢瞭springboot全局配置文件,裡面默認配置為true(spring.aop.auto=true # Add @EnableAspectJAutoProxy),所以我沒有去做添加,功能沒有問題,切面能正常實現。
最後補充一點小知識
AspectJ 支持 5 種類型的通知註解
1)@Before
: 前置通知:在方法執行之前執行的通知
2)@After
: 後置通知, 在方法執行之後執行 , 即方法返回結果或者拋出異常的時候, 下面的後置通知記錄瞭方法的終止.
3)@AfterRunning
: 返回通知, 在方法返回結果之後執行
ps:無論方法是正常返回還是拋出異常, 後置通知都會執行. 如果隻想在方法返回的時候記錄日志, 應使用返回通知代替後置通知.
4)@AfterThrowing
: 異常通知, 在方法拋出異常之後
5) @Around
: 環繞通知, 圍繞著方法執行(即方法前後都有執行)
環繞通知是所有通知類型中功能最為強大的, 能夠全面地控制連接點. 甚至可以控制是否執行連接點.
下面是我寫的一些通知的實例
大傢可以參考一下
/* 標識這個方法是個前置通知, 切點表達式表示執行任意類的任意方法. 第一個 * 代表匹配任意修飾符及任意返回值, 第二個 * 代表任意類的對象, 第三個 * 代表任意方法, 參數列表中的 .. 匹配任意數量的參數 */ //@Before: 前置通知 @Before("execution (* com.lc.project..controller..*.*(..))") public void beforeMethod(JoinPoint joinPoint){ String methodName = joinPoint.getSignature().toString(); Object result= Arrays.asList(joinPoint.getArgs()); System.out.println("The method name:"+methodName+"--value:"+result); } //@After: 後置通知 @After("execution (* *.*(..))") public void afterMethod(JoinPoint joinPoint){ String methodName = joinPoint.getSignature().getName(); System.out.println("The method name:"+methodName+ " ends"); } //@AfterRunning: 返回通知 @AfterReturning(value="execution (* *.*(..))",returning="result") public void afterReturningMethod(JoinPoint joinPoint,Object result){ String methodName = joinPoint.getSignature().getName(); System.out.println("The method name:"+methodName+ " ends and result="+result); } //@AfterThrowing: 異常通知 @AfterThrowing(value="execution (* *.*(..))",throwing="e") public void afterReturningMethod(JoinPoint joinPoint,Exception e){ String methodName = joinPoint.getSignature().getName(); System.out.println("The method name:"+methodName+ " ends and result="+e); }
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 使用Spring開啟註解AOP的支持放置的位置
- Spring使用AspectJ的註解式實現AOP面向切面編程
- SpringBoot整合Web之AOP配置詳解
- SpringAOP切入點規范及獲取方法參數的實現
- SpringBoot開發教程之AOP日志處理