日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Spring中基于xml的AOP的詳細步驟

瀏覽:205日期:2023-09-01 14:46:15

1、Aop 全程是Aspect Oriented Programming 即面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的同一維護的一種技術。Aop是oop的延續,是軟件開發中的 一個熱點,也是Spring框架中一個重要的內容。是函數式編程的一個衍生范例,利用Aop可以對業務邏輯各個部分進行分割,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用行,提高了開發效率。簡單的說就是把我們程序中的重復代碼抽取出來,在需要執行的時候,使用動態代理的技術,在不修改源碼的基礎上已有的方法進行增強,(使用動態代理的方式實現)

相關術語

JoinPoint:鏈接點 那些被攔截到的點,在spring中,這些點指的是方法,因為spring只支持方法類型的連接點

Pointcut:切入點 是指我們要對哪些JoinPont進行攔截的定義

Advice:通知/增強 攔截到Joinpoint之后所要做的事情就是通知

通知類型:前置通知、后置通知、異常通知、最終通知、環繞通知

Introduction:引介 是一種特殊的通知,在不修改類代碼的前提下,Introduction可以在運行期為類動態的添加一些方法或field

Target:目標對象,代理的目標對象

Weaving織入 是指把增強應用到目標對象來創建新的代理對象的過程,spring采用動態代理織入,而AspectJ采用編譯期織入和類裝載期織入

Proxy:代理,一類類被Aop織入增強后,就產生一個結果代理類

Aspect:切面 是切入點和通知(引介)的結合

在 spring 中,框架會根據目標類是否實現了接口來決定采用哪種動態代理的方式。

基于XMl的AOP步驟

1、創建Maven項目引入spring坐標

<?xml version='1.0' encoding='UTF-8'?><project xmlns='http://maven.apache.org/POM/4.0.0' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd'> <modelVersion>4.0.0</modelVersion> <groupId>com.mingqi</groupId> <artifactId>SpringIOC</artifactId> <packaging>pom</packaging> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.8.7</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies></project>

2、創建業務層接口:

package com.mingqi.services;public interface IAccountService { /** * 模擬登陸賬戶 */ void saveAccount(); /** * 模擬更新賬戶 * @param id */ void updateAccount(int id); /** * 模擬刪除賬戶 * @return */ int deleteAccount();}

3.創建業務層實現類

package com.mingqi.services.impl;import com.mingqi.services.IAccountService;public class AccountServicesImpl implements IAccountService { public void saveAccount() { System.out.println('執行了保存'); } public void updateAccount(int id) { System.out.println('執行了更新'+id); } public int deleteAccount() { System.out.println('執行了刪除'); return 0; }}

4、創建工具類

package com.mingqi.utils;import org.aspectj.lang.ProceedingJoinPoint;/** * 用戶記錄日志的工具類,里面提供公共的代碼 */public class Logger { /** * 用于打印日志:計劃讓其在切入點方法執行前執行(切入點方法就是業務層方法) */ public void beforePrintLog(){ System.out.println('Logger類中的pringLog方法開始記錄日志了。。。'); } public void afterReturningPrintLog() { System.out.println('后置通知Logger類中的beforePrintLog方法開始記錄日志了。。。'); } /** * 異常通知 */ public void afterThrowingPrintLog() { System.out.println('異常通知Logger類中的afterThrowingPrintLog方法開始記錄日志了。。。'); } /** * 最終通知 */ public void afterPrintLog() { System.out.println('最終通知Logger類中的afterPrintLog方法開始記錄日志了。。。'); } /** * 環繞通知 * 問題 當我們配置了環繞通知以后,切入點方法沒有執行,而通知方法執行了 * 分析: 通過對比動態代理中的環繞通知代碼,發現動態代理中的環繞通知有明確的切入點方法調用,而我們的代碼中沒有 * 解決: Spring 框架為我們提供了一個接口:ProceedingJoinPoint。該接口有一個方法proceed(),此方法就相當于明確調用切入點的方法 * 該接口可以作為環繞通知的參數方法,在程序執行時,spring框架會為我們提供該接口的實現類供我們使用 * spring中的環繞通知 * 他是spring框架為我們提供的一種可以在代碼中手動控制增強方法何時會執行的方式 * @param pjp * @return */ public Object aroundPringLog(ProceedingJoinPoint pjp){ Object rtValue = null; try{ Object[] args = pjp.getArgs();//得到方法執行所需的參數 System.out.println('Logger類中的aroundPringLog方法開始記錄日志了。。。前置'); rtValue = pjp.proceed(args);//明確調用業務層方法(切入點方法) System.out.println('Logger類中的aroundPringLog方法開始記錄日志了。。。后置'); return rtValue; }catch (Throwable t){ System.out.println('Logger類中的aroundPringLog方法開始記錄日志了。。。異常'); throw new RuntimeException(t); }finally { System.out.println('Logger類中的aroundPringLog方法開始記錄日志了。。。最終'); } }}

5、創建bean配置文件

<?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.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd'> <!-- 配置spring的IOC,把service對象配置進來--> <bean class='com.mingqi.services.impl.AccountServicesImpl'></bean> <!-- spring 中基于xml的Aop配置步驟 1、把通知Bean也交給spring來管理 2、使用aop:config標簽表名開始aop的配置 3、使用aop:aspect標簽表明配置切面 id屬性:是給切面提供一個唯一標識 ref屬性:是指定通知類的id 4、在aop:aspect標簽的內部使用對應的標簽來配置通知的類型 我們現在的示例是讓printlog方法在切入點方法執行之前執行,所以是前置通知 aop:before:標識前置通知 method屬性: 用于指定Logger類中的方法哪個是前置通知 pointcut屬性: 用于指定切入點表達式,該表達式的含義指的是對業務層中的哪些方法增強 切入點表達式的寫法: 關鍵字:execution(表達式) 表達式: 訪問修飾符 返回值 包名.包名.包名....類名.方法名(參數列表) 標準的寫法: public void com.mingqi.service.impl.AccountServiceImpl.saveAccount() 訪問修飾符可以省略:void com.mingqi.service.impl.AccountServiceImpl.saveAccount() 返回值可以使用通配符,標識任意返回值:* com.mingqi.service.impl.AccountServiceImpl.saveAccount() 包名可以使用通配符,表示任意包,但是有幾級包就需要寫幾個* *.*.*.*.*.AccountServiceImpl.saveAccount() 包名可以使用..代表當前包及其子包:* *.AccountServiceImpl.saveAccount() 類名和方法名都可以使用*來實現統配 * *..*.*(); 參數列表: 可以直接寫數據類型: 基本類型直接寫名稱:int 引用類型寫包名.類名的方式: java.lang.String 可以使用通配符來標識任意類型,單必須有參數 可以使用..標識有無參數均可,有參數可以是任意類型 全通配寫法: * *..*.*(..) 實際開發中 切入點表達式的通常寫法: 切到業務層實現類的所有方法,* com.mingqi.service.impl.*.*(..); --> <!-- 配置Logger類--> <bean class='com.mingqi.utils.Logger'></bean> <!--使用aop:config標簽表名開始aop的配置--> <aop:config> <aop:pointcut expression='execution(* com.mingqi.services.impl.*.*(..))'></aop:pointcut> <!--使用aop:aspect標簽表明配置切面--> <aop:aspect ref='logger'> <!-- 配置前置通知:在切入點方法執行之前執行 <aop:before method='beforePrintLog' pointcut-ref='pt1'></aop:before>--> <!-- 配置后置通知:在切入點方法正常執行之后值。它和異常通知永遠只能執行一個 <aop:after-returning method='afterReturningPrintLog' pointcut-ref='pt1'></aop:after-returning>--> <!-- 配置異常通知:在切入點方法執行產生異常之后執行。它和后置通知永遠只能執行一個 <aop:after-throwing method='afterThrowingPrintLog' pointcut-ref='pt1'></aop:after-throwing>--> <!-- 配置最終通知:無論切入點方法是否正常執行它都會在其后面執行 <aop:after method='afterPrintLog' pointcut-ref='pt1'></aop:after>--> <!-- 配置環繞通知 詳細的注釋請看Logger類中--> <aop:around method='aroundPringLog' pointcut-ref='pt1'></aop:around> </aop:aspect> </aop:config> </beans>

6、創建測試類

package com.mingqi.test;import com.mingqi.services.IAccountService;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class SpringIoc { @Test public void TestAccount() { ApplicationContext ac= new ClassPathXmlApplicationContext('beam.xml'); IAccountService accountService=(IAccountService) ac.getBean('accountSevice'); accountService.saveAccount(); accountService.updateAccount(22); accountService.deleteAccount(); }}

總結

到此這篇關于Spring中基于xml的AOP的詳細步驟的文章就介紹到這了,更多相關Spring基于xml的AOP內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美国产91| 老司机精品视频网| 手机在线电影一区| 精品视频黄色| 美女尤物国产一区| 国产一区二区三区视频在线| 久久精品毛片| 久久精品午夜| 精品视频久久| 毛片在线网站| 99精品国产一区二区三区| 精品国产中文字幕第一页| 老司机免费视频一区二区| 国模大尺度视频一区二区| 91视频一区| 天堂资源在线亚洲| 亚洲欧美日韩国产一区| 在线精品一区二区| 欧美在线看片| 久久精品二区亚洲w码 | 蜜臀av一区二区在线免费观看| 日韩高清一区| 国产不卡av一区二区| 国产日韩视频| 国产精品久久久免费| 亚洲免费毛片| 免费欧美日韩| 国产精品日本一区二区三区在线| 中文字幕成在线观看| 日本在线一区二区三区| 91成人超碰| 丝袜美腿一区二区三区| 免费日韩精品中文字幕视频在线| 色综合视频一区二区三区日韩 | 亚洲精品网址| 麻豆视频在线观看免费网站黄 | 日本久久二区| 999久久久精品国产| 免费在线成人网| 国产精品毛片视频| 极品日韩av| 日韩一区二区三区四区五区| 亚洲精品一级二级| 日本欧美国产| 国产精品中文| 福利一区和二区| 在线国产精品一区| 在线综合视频| 久久中文字幕av一区二区不卡| 国产精品伊人| 久久精品青草| 国产欧美日韩亚洲一区二区三区| 少妇久久久久| 国产精品99在线观看| 精品久久中文| 欧美激情视频一区二区三区免费| 婷婷亚洲五月色综合| 国产乱子精品一区二区在线观看 | 国产一区二区三区四区五区传媒| 黑丝一区二区三区| 青青久久av| 日韩精品久久久久久久软件91| 国产精品日韩精品在线播放| 国产精品蜜月aⅴ在线| 视频一区视频二区中文| 亚洲精品第一| 国产一二在线播放| 日韩伦理在线一区| 五月激情久久| 国产色99精品9i| 亚洲一区导航| 欧美日韩91| 九九综合在线| 国产综合亚洲精品一区二| 在线看片福利| 99热精品在线观看| 美女在线视频一区| 999视频精品| 亚洲福利专区| 五月精品视频| 欧洲毛片在线视频免费观看| 亚洲天堂日韩在线| 99精品国产一区二区三区| 国产+成+人+亚洲欧洲在线| 色在线中文字幕| 少妇精品久久久一区二区| 免费在线观看一区二区三区| 在线亚洲观看| 91一区二区三区四区| 国产精品久久久久久久久久齐齐| 日韩精品a在线观看91| 日韩国产欧美一区二区三区| 日韩理论视频| аⅴ资源天堂资源库在线| 亚洲精品免费观看| 高潮一区二区| 天堂俺去俺来也www久久婷婷| 国产一区二区三区亚洲| 亚洲一区日韩| 精品捆绑调教一区二区三区| 国产亚洲欧美日韩精品一区二区三区| 99久久精品网站| 91一区二区| 国产欧美一区二区精品久久久| 亚洲一区区二区| 手机精品视频在线观看| 成人久久一区| 婷婷激情一区| 国产在线一区不卡| 日韩伦理一区| 精品不卡一区| 久久精品卡一| 精品日产乱码久久久久久仙踪林| 91精品二区| 日韩不卡手机在线v区| 伊人久久大香线蕉av不卡| 精品捆绑调教一区二区三区 | 国产精品99精品一区二区三区∴ | 欧美一级精品| 特黄毛片在线观看| 国产欧美日韩精品一区二区三区| 亚洲黄色中文字幕| 精品国产中文字幕第一页| 美女av在线免费看| 久久毛片亚洲| 欧美肉体xxxx裸体137大胆| 国产a亚洲精品| 999久久久精品国产| 日韩在线观看中文字幕| 国产一区二区精品久| 国产精品普通话对白| 国产精品地址| 91成人精品| 国产成人精品一区二区三区视频| 青青草伊人久久| 欧洲激情综合| 黄色在线一区| 国产亚洲一区| 激情综合网址| 国产精品一区二区美女视频免费看| 国产aa精品| 蜜臀91精品一区二区三区| 久久影院一区二区三区| 亚洲综合不卡| 超级白嫩亚洲国产第一| 亚洲久久一区| 鲁鲁在线中文| 日韩三级精品| 中文字幕高清在线播放| 亚洲精品无吗| 国产主播一区| 精品国产亚洲日本| 天堂精品久久久久| 夜久久久久久| 99热精品久久| 国产999精品在线观看| 青草国产精品| 久久不卡日韩美女| 亚洲精品福利| 免费视频一区二区| 激情久久久久久久| 日韩毛片视频| 成人日韩av| 免费不卡在线视频| 日韩亚洲一区在线| 你懂的国产精品| 在线精品亚洲欧美日韩国产| 私拍精品福利视频在线一区| 国产日产一区| 九九久久国产| 欧美va天堂| 亚洲日本欧美| 精品久久久中文字幕| 视频一区中文| 久久激情av| 亚洲成av在线| 日韩综合小视频| 成人台湾亚洲精品一区二区| 日韩天堂在线| 日本在线不卡视频一二三区| 欧美国产先锋| 精品欧美激情在线观看| 日本不卡高清视频| 日韩在线精品| 亚洲小说春色综合另类电影| 美女视频黄久久| 午夜日韩福利| 欧美aa国产视频| 国产欧美日韩在线一区二区| 激情黄产视频在线免费观看| 亚洲一区二区成人| 欧美激情福利| 国产精品女主播一区二区三区| 日韩av黄色在线| 久久精品影视| 国产日韩一区| 老司机精品久久| 高清av不卡| 国产精品亚洲一区二区在线观看| 亚洲高清激情|