- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- SpringAOP 構造注入的實(shí)現步驟
讓我們先想象一個(gè)場(chǎng)景,你正在編寫(xiě)一個(gè)項目,在開(kāi)發(fā)過(guò)程中的多個(gè)模塊都有某段重復的代碼,于是你選擇將其抽象成一個(gè)方法,然后在需要的地方調用這個(gè)方法,當需要修改這段代碼時(shí)只需要修改這個(gè)方法就行。有一天,你的Boss給了新的需求,需要再抽象出一個(gè)方法,然后再在各個(gè)需要這個(gè)方法的模塊調用這個(gè)方法,這可能就讓你頭疼了,需要修改大量的代碼,于是會(huì )想,能不能不修改源代碼為系統業(yè)務(wù)添加某種功能呢?幸運的是,AOP可以很好的解決這個(gè)問(wèn)題。
AOP:保證開(kāi)發(fā)者不修改源代碼的前提下,去為系統中的業(yè)務(wù)組件添加某種通用功能,本質(zhì)是由AOP框架修改業(yè)務(wù)組件的多個(gè)方法的源代碼,我們將其分為兩類(lèi):
AOP 框架在編譯階段對程序源代碼進(jìn)行修改,生成了靜態(tài)的 AOP 代理類(lèi)(生成的*.class文件已經(jīng)被改掉了,需要使用特定的編譯器),比如 AspectJ。
AOP 框架在運行階段對動(dòng)態(tài)生成代理對象(在內存中以 JDK 動(dòng)態(tài)代理,或 CGlib 動(dòng)態(tài)地生成 AOP 代理類(lèi)),如 SpringAOP。
<dependencies> <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.3.5</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.3.5</version> </dependency> <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.6</version> </dependency> <!-- https://mvnrepository.com/artifact/aopalliance/aopalliance --> <dependency> <groupId>aopalliance</groupId> <artifactId>aopalliance</artifactId> <version>1.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies>
增強類(lèi)接口:
public interface VisitService { //用于實(shí)現前置通知,后置通知,異常通知,最終通知 void visit(String str) throws Exception; //用于實(shí)現環(huán)繞通知 void around(); }
增強類(lèi):
public class VisitServiceImpl implements VisitService { //前置,后置,最終,異常通知的增強類(lèi) public void visit(String str) throws Exception{ System.out.println(str); if(!str.equalsIgnoreCase("agree")){ throw new Exception("非法訪(fǎng)問(wèn)"); } } //環(huán)繞通知的增強類(lèi) public void around() { System.out.println("環(huán)繞通知"); } }
@Component("VisitAspect") @Aspect //標注當前myAspect是一個(gè)切面類(lèi) public class VisitAspect_anno { // 定義切入點(diǎn)表達式 // 使用一個(gè)返回值為 void 、方法體為空的方法來(lái)命名切入點(diǎn) @Pointcut("execution(* Spring_AOP.service.impl.VisitServiceImpl.visit(..))") private void v1() { } //前置通知 @Before("v1()") public void visitBefore(JoinPoint joinPoint) { System.out.println("口令:"); } @After("v1()") //最終通知,無(wú)論是否報錯,都執行 public void visitAfter(JoinPoint joinPoint) { System.out.println("輸入完成"); } @AfterReturning("v1()") //后置通知報錯不執行 public void visitSuccess(JoinPoint joinPoint) { System.out.println("請求成功,歡迎"); } @AfterThrowing(value = "v1()",throwing = "ex") //異常通知,報錯后執行 public void visitThrow(JoinPoint joinPoint, Throwable ex) { System.out.println("請求失敗,拒絕"); } @Around("execution(* Spring_AOP.service.impl.VisitServiceImpl.around())") //環(huán)繞通知,如果報錯只執行前一句 public Object visitAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { System.out.println("-------環(huán)繞-------"); Object obj = proceedingJoinPoint.proceed(); System.out.println("------------------"); return obj; } }
<!-- 基于注解的聲明式 AspectJ --> <context:component-scan base-package="Spring_AOP" /> <!-- 啟動(dòng)基于注解的聲明式 AspectJ 支持一 --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
public class visitTest { @Test public void VisitTest(){ ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext_AOP.xml"); VisitService visitService = app.getBean(VisitService.class); try { visitService.visit("agree"); } catch (Exception e) { e.printStackTrace(); } try { visitService.visit("ok"); } catch (Exception e) { e.printStackTrace(); } visitService.around(); } }
口令:
agree
請求成功,歡迎
輸入完成
口令:
ok
請求失敗,拒絕
輸入完成
-------環(huán)繞-------
環(huán)繞通知
-------環(huán)繞-------
使用構造注入可以更方便的實(shí)現AOP模式,但是同樣與設置注入相比各有千秋。
以上就是以注解實(shí)現SpringAOP框架構造注入的實(shí)現,如有錯誤,麻煩指出,感謝耐心到現在的朋友ᕕ( ᐛ )ᕗ
到此這篇關(guān)于SpringAOP_構造注入的實(shí)現步驟的文章就介紹到這了,更多相關(guān)SpringAOP_構造注入內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站