詳解在Spring中如何使用AspectJ來(lái)實(shí)現(xiàn)AOP
AspectJ 是通過(guò)注解來(lái)描述切點(diǎn)與增強(qiáng)的。
1 開(kāi)發(fā)環(huán)境要求
因?yàn)橐褂米⒔?,所以?qǐng)確保使用的 Java5.0 及以上版本。
引入 AspectJ 相關(guān)類庫(kù):
<dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>${aspectj.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>${aspectj.version}</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjtools</artifactId> <version>${aspectj.version}</version> </dependency> <dependency> <groupId>aopalliance</groupId> <artifactId>aopalliance</artifactId> <version>${aopalliance.version}</version> </dependency>
2 編程方式
@Aspect//標(biāo)識(shí)切面
public class PreRentAspect { /** * 增強(qiáng)邏輯 */ @Before("execution(* rent(..))")//定義切點(diǎn)與增強(qiáng)類型 public void beforeRent() { System.out.println("開(kāi)始執(zhí)行租賃動(dòng)作"); } }
這個(gè)切面只是一個(gè)普通的 POJO,只不過(guò)加了 @Aspect 注解。
@Before("execution(* rent(..))")
中的 @Before
表示增強(qiáng)類型是前置增強(qiáng),它的內(nèi)容是 @AspectJ 切點(diǎn)表達(dá)式,這里表示的是在目標(biāo)類的 rent() 方法上織入增強(qiáng), rent() 可以包含任意入?yún)⒑腿我獾姆祷刂怠?/p>
帶 @Aspect
的類,通過(guò)注解與代碼,將切點(diǎn)、增強(qiáng)類型和增強(qiáng)的橫切邏輯整合到了一起,是不是很方便呀O(∩_∩)O哈哈~
單元測(cè)試:
AspectJProxyFactory factory = new AspectJProxyFactory(); //設(shè)置目標(biāo)類 factory.setTarget(new User()); //添加切面類 factory.addAspect(PreRentAspect.class); User proxy = factory.getProxy(); String userId = "001"; proxy.rent(userId); proxy.back(userId);
輸出結(jié)果:
--開(kāi)始執(zhí)行租賃動(dòng)作--
User:租賃【充電寶】
User:歸還【充電寶】
3 配置方式
<!-- 目標(biāo)類--> <bean id="user" class="net.deniro.spring4.aspectj.User"/> <!-- 切面類--> <bean class="net.deniro.spring4.aspectj.PreRentAspect"/> <!-- 自動(dòng)創(chuàng)建代理--> <bean class="org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator"/>
單元測(cè)試:
ApplicationContext context = new ClassPathXmlApplicationContext(spring.xml"); User user = (User) context.getBean("user"); String userId = "001"; user.rent(userId); user.back(userId);
輸出結(jié)果與編程方式完全相同。
也可以基于 Schema 的 aop 命名空間進(jìn)行配置:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!--aspectj 驅(qū)動(dòng)器 --> <aop:aspectj-autoproxy/> <!-- 目標(biāo)類--> <bean id="user" class="net.deniro.spring4.aspectj.User"/> <!-- 切面類--> <bean class="net.deniro.spring4.aspectj.PreRentAspect"/> </beans>
這樣的配置更加簡(jiǎn)潔。其實(shí)在 <aop:aspectj-atuoproxy/>
內(nèi)部已經(jīng)采用了自動(dòng)代理模式啦 O(∩_∩)O哈哈~
<aop:aspectj-atuoproxy/>
的 proxy-target-class
屬性,默認(rèn)為 false ,表示使用 JDK 動(dòng)態(tài)代理技術(shù)織入增強(qiáng);此值為 true 則表示使用 CGLib 動(dòng)態(tài)代理技術(shù)織入增強(qiáng) 。 如果目標(biāo)類沒(méi)有聲明接口,那么即使 proxy-target-class
設(shè)置為 false,也會(huì)自動(dòng)使用 CGLib 動(dòng)態(tài)代理織入增強(qiáng)的喲O(∩_∩)O哈哈~
基于 Java5.0+ 的項(xiàng)目,建議使用 AspectJ 來(lái)配置切點(diǎn)與增強(qiáng),因?yàn)檫@樣更簡(jiǎn)潔、也更直接。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決MyEclipse10.7部署報(bào)錯(cuò)拋空指針異常問(wèn)題的方法
這篇文章主要介紹了解決MyEclipse10.7部署報(bào)錯(cuò)拋空指針異常問(wèn)題的方法,需要的朋友可以參考下2015-12-12淺析Spring容器原始Bean是如何創(chuàng)建的
這篇文章主要是想和小伙伴們一起聊聊?Spring?容器創(chuàng)建?Bean?最最核心的?createBeanInstance?方法,文中的示例代碼講解詳細(xì),需要的可以參考一下2023-08-08java 反射調(diào)用Service導(dǎo)致Spring注入Dao失效的解決方案
這篇文章主要介紹了java 反射調(diào)用Service導(dǎo)致Spring注入Dao失效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Spring Boot 單元測(cè)試和集成測(cè)試實(shí)現(xiàn)詳解
這篇文章主要介紹了Spring Boot 單元測(cè)試和集成測(cè)試實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09java實(shí)現(xiàn)幸運(yùn)抽獎(jiǎng)系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)幸運(yùn)抽獎(jiǎng)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07RabbitMQ交換機(jī)使用場(chǎng)景和消息可靠性總結(jié)分析
這篇文章主要為大家介紹了RabbitMQ交換機(jī)使用場(chǎng)景和消息可靠性總結(jié)分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01每天練一練Java函數(shù)與算法Math函數(shù)總結(jié)與字符串轉(zhuǎn)換整數(shù)
這篇文章主要介紹了Java函數(shù)與算法Math函數(shù)總結(jié)與字符串轉(zhuǎn)換整數(shù),每天練一練,水平在不知不覺(jué)中提高,需要的朋友快過(guò)來(lái)看看吧2021-08-08Spring MVC過(guò)濾器-登錄過(guò)濾的代碼實(shí)現(xiàn)
本篇文章主要介紹了Spring MVC過(guò)濾器-登錄過(guò)濾,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧。2017-01-01一文教會(huì)你如何從0到1搭建一個(gè)SpringBoot項(xiàng)目
今天剛好學(xué)習(xí)到SpringBoot,就順便記錄一下吧,下面這篇文章主要給大家介紹了關(guān)于如何從0到1搭建一個(gè)SpringBoot項(xiàng)目的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01