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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

实习笔记 —— AOP开发I

發布時間:2024/5/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实习笔记 —— AOP开发I 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

系列文章目錄

實習筆記 —— Spring基礎
實習筆記 —— IOC反轉控制(xml配置文件 + 注解)


文章目錄

  • 系列文章目錄
  • 一、什么是AOP?
    • 1.簡介
    • 2.與OOP的對比
    • 3.AOP的相關術語
  • 二、AOP代碼簡例
  • 三、今日總結


一、什么是AOP?

1.簡介

AOP 為 Aspect Oriented Programming 的縮寫,意思為面向切面編程,是通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。

AOP是OOP的延續,是軟件開發中的一個熱點,也是Spring框架中的一個重要內容,是函數式編程的一種衍生范型。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。

簡單來說,AOP就是通過運行期間生成動態代理的方式,實現代碼隔離,維護方便,功能增強效果。

2.與OOP的對比

AOP是面向切面編程,橫向
OOP是面向對象編程,縱向

AOP原理,以開發網絡購物平臺為例:

此為縱向開發的例子,包括5個模塊。
購物車的商品不寫數據庫,因為購物車的商品變更比較頻繁,引發數據庫抖動。

若在上述模塊都完成后又需增加兩項功能:顯示用戶等級、徽章等身份 + 在每次跳轉頁面時驗證用戶身份。按照傳統做法(沒有切面編程),我們得一項一項地添加到每個模塊中,對代碼進行整理和增刪,效率很低。
在切面編程中,將新添加的兩個功能單獨寫在一個模塊中,使用spring的注入方式將其注入到需要這些功能的模塊中,原有的模塊完全不需改變。既提高了開發效率,又維持了原有代碼的穩定。

3.AOP的相關術語

①Joinpoint:連接點,待增強或完善的那些已寫好的模塊/方法(我們主要針對方法)

②Pointcut:切入點,真正需要做的連接點(連接點是眾多候選人,切入點是得獎者,可能不止一個)

③Advice:通知,增強;甲方要求新增加的方法或需求(如上述顯示用戶身份需求)

④Target:目標,切入點(被增強的方法)所屬的類

⑤Weaving:織入,將Advice應用到Target的過程(將甲方新增的需求應用到某個切入點的過程,即頒獎儀式)

⑥Aspect:切面,多個Weaving過程配置(單個Weaving是點對點的,多個累計就形成了面),構成切面

二、AOP代碼簡例

創建了新的項目結構:

com.high.demo1包的內容:

①創建接口:

②接口的實現類:

③切面類:

④XML配置文件:
新的文件頭:

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"> </beans>

配置文件內容:

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 把ProductDaoImpl類交給spring管理 --><!-- 創建目標類 target --><bean name="productDao" class="com.high.demo1.ProductDaoImpl"></bean> <!-- 將切面類交給spring管理 --><bean name="myAspect" class="com.high.demo1.MyAspectXML"></bean> <!-- 通過AOP配置來完成對目標的代理 --><!-- MyAspectXML類中的checkPri作用于切入點pointcut1上 --><aop:config><!-- 聲明第一個切入點,id值全局唯一 --> <aop:pointcut id="pointcut1" expression="execution(* com.high.demo1.ProductDaoImpl.save(..))"/><aop:pointcut id="pointcut2" expression="execution(* com.high.demo1.ProductDaoImpl.delete(..))"/><!-- 引入切面類MyAspect --><aop:aspect ref="myAspect"><!-- 完成織入過程,切面類作用在誰身上(只寫方法名),以及切入點 --><!-- 通知的類型:1.前置通知 before --><aop:before method="checkPri" pointcut-ref="pointcut1"/><!-- 2.后置通知 after-returning --><aop:after-returning method="writeLog" pointcut-ref="pointcut2" returning="result"/></aop:aspect></aop:config> </beans>

⑤測試類:

package com.high.demo1;import javax.annotation.Resource;import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;// AOP入門 // 書寫類注解,類層級,所以寫在類外面 // 整合JUnit4 @RunWith(SpringJUnit4ClassRunner.class) // 加載XML配置文件(嚴格按照格式書寫,不要添加任何空格等字符) @ContextConfiguration("classpath:applicationContext.xml")public class SpringDemo {// 1.未使用注解整合JUnit // @Test // public void demo() { // ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); // ProductDaoImpl product = (ProductDaoImpl)applicationContext.getBean("productDao"); // // product.save(); // product.update(); // product.delete(); // product.find(); // }// 2.整合后// 想用哪個類就注入哪個類,交給spring管理// 對私有屬性的引入@Resource(name = "productDao")private ProductDao productDao;@Testpublic void demo2() {productDao.save();productDao.update();productDao.delete();productDao.find();} }

測試結果:

三、今日總結

1.切入點 + Advice 是今天內容的重點。
2.修改的內容都在文件/spring03/src/com/high/demo1/MyAspectXML.java + /spring03/src/applicationContext.xml 中。測試類、接口、接口的實現類都無需改變。
3.總結一下AOP編程的流程:
①創建接口,接口中有若干待方法。
②創建接口的實現類,此時實現類中實現的是基本功能,若甲方提出新的需求,就輪到AOP編程出場了。
③編寫XML配置文件,將接口的實現類交給spring管理。

<bean name="productDao" class="com.high.demo1.ProductDaoImpl"></bean>

(完成這步后可在測試類中加載配置文件并獲取實現類對象,執行實現類中實現的接口的方法以判斷到此為止的初步書寫是否正確)

@Test public void demo() {ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");ProductDaoImpl product = (ProductDaoImpl)applicationContext.getBean("productDao");product.save();product.update();product.delete();product.find(); }

④若此時甲方新的需求到來了,則需要編寫切面類,存放甲方要增加的方法,舉兩例:

public class MyAspectXML {// 前置通知public void checkPri(JoinPoint jointJoinpoint) {System.out.println("save方法的前置通知:進行身份驗證........" + jointJoinpoint);}// 后置通知public void writeLog(Object result) {System.out.println("delete方法的后置通知:Be recorded....." + result);} }

要實現在save方法執行前增加新的輸出語句,并在delete方法執行后增加新的輸出語句。

編寫好切面類,需編寫XML配置文件,將切面類交給spring管理:

<bean name="myAspect" class="com.high.demo1.MyAspectXML"></bean>

后續操作:聲明切入點,將通知(Advice)應用到切面類(Target),即進行織入過程:

<!-- 通過AOP配置來完成對目標的代理 --> <!-- MyAspectXML類中的checkPri作用于切入點pointcut1上 --> <aop:config><!-- 聲明第一個切入點,id值全局唯一 --> <aop:pointcut id="pointcut1" expression="execution(* com.high.demo1.ProductDaoImpl.save(..))"/><aop:pointcut id="pointcut2" expression="execution(* com.high.demo1.ProductDaoImpl.delete(..))"/><!-- 引入切面類MyAspect --><aop:aspect ref="myAspect"><!-- 完成織入過程,切面類作用在誰身上(只寫方法名),以及切入點 --><!-- 通知的類型:1.前置通知 before --><aop:before method="checkPri" pointcut-ref="pointcut1"/><!-- 2.后置通知 after-returning --><aop:after-returning method="writeLog" pointcut-ref="pointcut2" returning="result"/></aop:aspect> </aop:config>

⑤之后只需編寫測試類,獲取接口實現類的對象后調用其中的方法,看看我們是否將在原有方法基礎上實現了新需求:

// 2.整合后 // 想用哪個類就注入哪個類,交給spring管理// 對私有屬性的引入 @Resource(name = "productDao") private ProductDao productDao;@Test public void demo2() {productDao.save();productDao.update();productDao.delete();productDao.find(); }

總結

以上是生活随笔為你收集整理的实习笔记 —— AOP开发I的全部內容,希望文章能夠幫你解決所遇到的問題。

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