日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

Spring AOP(三)--XML方式实现

發布時間:2023/12/10 asp.net 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring AOP(三)--XML方式实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文介紹通過XML方式實現Spring AOP,在上一篇中已經介紹了通過注解+java配置的方式,這篇文章主要是看XML中怎么配置,直接上代碼了:

一、創建一個連接點

1??定義接口

注意??:可以定義接口,也可以不定義,定義接口時使用jdk動態代理,不定義接口時使用cglib動態代理;

1 //定義一個接口 2 public interface CoderProjectService { 3 public void getProjectInfo(CoderProject coderProject); 4 }

2??接口實現類

1 //創建一個類來處理業務邏輯,作為要織入切面中的被代理對象 2 public class CoderProjectServiceImpl implements CoderProjectService { 3 4 @Override 5 public void getProjectInfo(CoderProject coderProject) { 6 System.out.println("項目名稱:" + coderProject.getProjectName() + "--項目版本號:" + coderProject.getProjectVersion() 7 + "--項目描述:" + coderProject.getProjectDesc()); 8 } 9 10 }

因為我要配置引入功能,所以順便定義要引入的接口及實現類

3??創建引入接口

1 /* 2 * 定義一個新接口,用來做一些驗證 3 */ 4 public interface CheckExist { 5 public boolean checkIsEmpty(CoderProject project); 6 }

4??引入接口實現類

1 /* 2 * 定義一個類,增加一些驗證邏輯,對被代理對象邏輯進行增強或完善 3 */ 4 public class CheckExistImp implements CheckExist { 5 6 @Override 7 public boolean checkIsEmpty(CoderProject project) { 8 return project != null; 9 } 10 11 }

二、創建一個切面

1 /* 2 * 定義一個切面,沒有任何注解,需要在XML中進行配置 3 */ 4 public class XmlAspect { 5 6 // 引入增強類 7 public CheckExistImp checkExistImp; 8 9 public void before(CoderProject pro) { 10 System.out.println("項目名稱: " + pro.getProjectName() + "before..."); 11 } 12 13 public void around(ProceedingJoinPoint pjp) { 14 System.out.println("around before..."); 15 try { 16 pjp.proceed(); 17 } catch (Throwable e) { 18 e.printStackTrace(); 19 } 20 System.out.println("around after..."); 21 } 22 23 public void after() { 24 System.out.println("after..."); 25 } 26 27 public void afterThrowing() { 28 System.out.println("afterThrowing..."); 29 } 30 31 public void afterReturning() { 32 System.out.println("afterReturning..."); 33 } 34 }

這個切面就是一個簡單的類,不過提供了四種通知的方法,并且前置通知含有參數,同時也將引入類作為屬性添加進來,之前的所有注解都會在XML文件中配置。

三、配置spring-aop-xml.xml配置文件

1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans 5 http://www.springframework.org/schema/beans/spring-beans.xsd 6 http://www.springframework.org/schema/aop 7 http://www.springframework.org/schema/aop/spring-aop.xsd"> 8 <!--定義切面bean --> 9 <bean id="xmlAspect" class="com.hyc.aop.xml.XmlAspect"></bean> 10 <!-- 定義被代理對象bean --> 11 <bean id="coderProjectService" class="com.hyc.aop.xml.CoderProjectServiceImpl"></bean> 12 <!-- 定義切面的配置:注解 --> 13 <aop:config> 14 <aop:aspect ref="xmlAspect"> 15 <!--定義一個切點 --> 16 <aop:pointcut id="getProjectInfo" expression="execution(* com.hyc.aop.xml.CoderProjectServiceImpl.getProjectInfo(..))" /> 17 <!-- 定義四類通知--> 18 <aop:before method="before" pointcut="execution(* com.hyc.aop.xml.CoderProjectServiceImpl.getProjectInfo(..)) and args(pro))"/> 19 <aop:after method="after" pointcut-ref="getProjectInfo"/> 20 <aop:after-returning method="afterReturning" pointcut-ref="getProjectInfo"/> 21 <aop:after-throwing method="afterThrowing" pointcut-ref="getProjectInfo"/> 22 <!-- 定義環繞通知 --> 23 <aop:around method="around" pointcut-ref="getProjectInfo"/> 24 <!--定義增強類 --> 25 <aop:declare-parents types-matching="com.hyc.aop.xml.CoderProjectServiceImpl+" implement-interface="com.hyc.aop.xml.CheckExist" default-impl="com.hyc.aop.xml.CheckExistImp"/> 26 </aop:aspect> 27 </aop:config> 28 29 <!-- 定義一個project bean,用來傳給接入點方法 --> 30 <bean id="project" class="com.hyc.pojo.CoderProject"> 31 <property name="id" value="1" /> 32 <property name="projectName" value="云管理平臺" /> 33 <property name="projectVersion" value="V1.0" /> 34 <property name="projectDesc" value="云存儲管理平臺" /> 35 </bean> 36 </beans>

注意??:在使用aop配置之前,要先引入相關的命名空間,如上面代碼中的紅色加粗部分。

其他的配置及含義都在注釋中有接受,不再贅述;

四、創建測試方法

1 @Test 2 public void testAopByXml() { 3 // 動態生成切面 4 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath*:spring-aop-xml.xml"); 5 // 獲取被代理對象 6 CoderProjectService coderProjectService = (CoderProjectService) context.getBean("coderProjectService"); 7 // 獲取項目類(參數) 8 CoderProject project = (CoderProject) context.getBean("project"); 9 // 獲取增強類(將被代理對象強制轉化成增強類) 10 CheckExist cd = (CheckExist) coderProjectService; 11 if (cd.checkIsEmpty(project)) { 12 coderProjectService.getProjectInfo(project); 13 } else { 14 System.out.println("被代理對象不能為空"); 15 } 16 }

測試結果如下:

1 項目名稱: 云管理平臺before... 2 around before... 3 項目名稱:云管理平臺--項目版本號:V1.0--項目描述:云存儲管理平臺 4 around after... 5 afterReturning... 6 after...

可以看到按照Sprinf AOP規定的流程執行了方法,但是就如在上一篇文章中提到的,使用XML方式時,around的before方法會在before方法之后執行。

其實從實現過程就能看出來,注解方式比XML要簡單,因為XML要配置很多東西,而且容易出錯,所以一般來說以注解為主,XML為輔。

轉載于:https://www.cnblogs.com/hellowhy/p/9721258.html

總結

以上是生活随笔為你收集整理的Spring AOP(三)--XML方式实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。