Springboot如何使用Aspectj實(shí)現(xiàn)AOP面向切面編程
要在 Springboot中聲明 AspectJ 切面
需在 IOC 容器中將切面聲明為 Bean 實(shí)例 即加入@Component 注解;當(dāng)在 Spring IOC 容器中初始化 AspectJ 切面之后, Spring IOC 容器就會(huì)為那些與 AspectJ 切面相匹配的 Bean 創(chuàng)建代理.
在 AspectJ 注解中, 切面只是一個(gè)帶有 @Aspect 注解的 Java 類.
引入jar包
網(wǎng)上都是說springboot使用Aspectj做面向切面編程的時(shí)候,只需要引入下面jar包依賴即可
<dependency> ?? ?<groupId>org.springframework.boot</groupId> ?? ?<artifactId>spring-boot-starter-aop</artifactId> </dependency>
但是我去編寫的時(shí)候,單單引入 spring-boot-starter-aop 的jar依賴的時(shí)候,像@Component、@Aspect等這些註解都不能使用,後來發(fā)現(xiàn)缺少aspectjweaver 這么個(gè)jar包,最后引入了下面的jar才解決問題
? ? <dependency> ?? ?<groupId>aspectj</groupId> ?? ?<artifactId>aspectjweaver</artifactId> ?? ?<version>1.5.3</version> ? ? </dependency>?
網(wǎng)上也有說要在application.properties中添加
spring.aop.auto=true這個(gè)配置,才能開啟Aspectj注解的掃面,但是我去查詢了springboot全局配置文件,里面默認(rèn)配置為true(spring.aop.auto=true # Add @EnableAspectJAutoProxy),所以我沒有去做添加,功能沒有問題,切面能正常實(shí)現(xiàn)。
最后補(bǔ)充一點(diǎn)小知識(shí)
AspectJ 支持 5 種類型的通知注解
1)@Before
: 前置通知:在方法執(zhí)行之前執(zhí)行的通知
2)@After
: 后置通知, 在方法執(zhí)行之后執(zhí)行 , 即方法返回結(jié)果或者拋出異常的時(shí)候, 下面的后置通知記錄了方法的終止.
3)@AfterRunning
: 返回通知, 在方法返回結(jié)果之后執(zhí)行
ps:無論方法是正常返回還是拋出異常, 后置通知都會(huì)執(zhí)行. 如果只想在方法返回的時(shí)候記錄日志, 應(yīng)使用返回通知代替后置通知.
4)@AfterThrowing
: 異常通知, 在方法拋出異常之后
5) @Around
: 環(huán)繞通知, 圍繞著方法執(zhí)行(即方法前后都有執(zhí)行)
環(huán)繞通知是所有通知類型中功能最為強(qiáng)大的, 能夠全面地控制連接點(diǎn). 甚至可以控制是否執(zhí)行連接點(diǎn).
下面是我寫的一些通知的實(shí)例
大家可以參考一下
? ? ? ? /* ?? ? ? ?標(biāo)識(shí)這個(gè)方法是個(gè)前置通知, ?切點(diǎn)表達(dá)式表示執(zhí)行任意類的任意方法. ?? ? ? ?第一個(gè) * 代表匹配任意修飾符及任意返回值,? ?? ? ? ?第二個(gè) * 代表任意類的對(duì)象, ?? ? ? ?第三個(gè) * 代表任意方法, ?? ? ? ?參數(shù)列表中的 .. ?匹配任意數(shù)量的參數(shù) ?? ? */ ? ? ? //@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); ? ? }??
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Cloud Alibaba Nacos Config加載配置詳解流
這篇文章主要介紹了Spring Cloud Alibaba Nacos Config配置中心實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-07-07使用Feign配置請(qǐng)求頭以及支持Https協(xié)議
這篇文章主要介紹了使用Feign配置請(qǐng)求頭以及支持Https協(xié)議,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03java 中sleep() 和 wait() 的對(duì)比
這篇文章主要介紹了java 中sleep() 和 wait() 的對(duì)比的相關(guān)資料,需要的朋友可以參考下2017-04-04深入淺析springboot中static和templates區(qū)別
這篇文章主要介紹了springboot中static和templates區(qū)別,本文通過圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-02-02Springboot實(shí)現(xiàn)阿里云通信短信服務(wù)有關(guān)短信驗(yàn)證碼的發(fā)送功能
短信驗(yàn)證碼是通過發(fā)送驗(yàn)證碼到手機(jī)的一種有效的驗(yàn)證碼系統(tǒng)。主要用于驗(yàn)證用戶手機(jī)的合法性及敏感操作的身份驗(yàn)證。下面通過本文大家分享Springboot實(shí)現(xiàn)阿里云通信短信服務(wù)有關(guān)短信驗(yàn)證碼的發(fā)送功能,一起看看吧2017-08-08