欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
Spring框架與AOP思想的研究與應用
 

Spring框架與AOP思想的研究與應用

摘要 本文對Spring框架中所包含的AOP思想以及事務(wù)管理進(jìn)行了分析,并通過(guò)對一個(gè)業(yè)務(wù)對象實(shí)現加鎖/解鎖的操作,說(shuō)明了動(dòng)態(tài)代理模式的可行性與有效性。

  關(guān)鍵詞 AOP;橫切關(guān)注點(diǎn);控制反轉;動(dòng)態(tài)代理

  引言

  ASPect Oriented Programming(AOP)是近年來(lái)計算機技術(shù)中比較熱門(mén)的話(huà)題之一。其發(fā)展歷史從學(xué)術(shù)領(lǐng)域和研發(fā)機構的運用開(kāi)始,目前流行的Spring應用程序框架將AOP思想融入了整個(gè)框架的設計開(kāi)發(fā)與應用當中。使用Spring框架固然給我們的編程帶來(lái)了好處與便利,但是同時(shí)存在著(zhù)一個(gè)問(wèn)題,對于初學(xué)者來(lái)說(shuō),所謂的“控制反轉”,不是一個(gè)能夠望文生義的好名稱(chēng),“依賴(lài)注入”也是一樣,也正是因為這樣,不少初學(xué)者很難在短時(shí)間內理解和掌握這些名字和他們的用法,而要使用AOP的功能也需要理解AOP,也比較難?;谝陨显?,我們就會(huì )想到,能否簡(jiǎn)單地將Spring框架中運用到的優(yōu)秀的理念,巧妙的運用到我們需要使用的地方,而又繞過(guò)不容易上手的Spring框架,做到一舉兩得呢?本文就將圍繞著(zhù)上述提出的問(wèn)題給出作者的看法和觀(guān)點(diǎn)。

  AOP思想與面向方面的編程

  AOP實(shí)際是GoF四人組設計模式的一種擴展,設計模式所追求的是降低代碼之間的耦合度,增加程序的靈活性和可重用性,AOP實(shí)際上就是設計模式所追求的目標的一種實(shí)現。所謂的分離關(guān)注就是將某一通用的需求功能從不相關(guān)的類(lèi)之中分離出來(lái);同時(shí),能夠使得很多類(lèi)共享一個(gè)行為,一旦行為發(fā)生變化,不必修改很多類(lèi),只要修改這個(gè)行為就可以。AOP就是這種實(shí)現分散關(guān)注的編程方法,它將“關(guān)注”封裝在“方面”中。

  面向對象的編程(OOP)方法是在面向過(guò)程的編程方法基礎上進(jìn)行的改進(jìn),而面向方面編程(AOP)方法又是在面向對象編程(OOP)方法的基礎上進(jìn)行改進(jìn)而來(lái)的一種創(chuàng )新的軟件開(kāi)發(fā)方法。AOP和OOP雖然在字面上十分相似,但是卻是面向不同領(lǐng)域的兩種設計思想。OOP(面向對象編程)針對問(wèn)題領(lǐng)域中以及業(yè)務(wù)處理過(guò)程中存在的實(shí)體及其屬性和操作進(jìn)行抽象和封裝,面向對象的核心概念是縱向結構的,其目的是獲得更加清晰高效的邏輯單元劃分;而AOP則是針對業(yè)務(wù)處理過(guò)程中的切面進(jìn)行提取,例如,某一個(gè)操作在各個(gè)模塊中都有涉及,這個(gè)操作就可以看成“橫切”存在于系統當中。在許多情況下,這些操作都是與業(yè)務(wù)邏輯相關(guān)性不強或者不屬于邏輯操作的必須部分,而面向對象的方法很難對這種情況做出處理。AOP則將這些操作與業(yè)務(wù)邏輯分離,使程序員在編寫(xiě)程序時(shí)可以專(zhuān)注于業(yè)務(wù)邏輯的處理,而利用AOP將貫穿于各個(gè)模塊間的橫切關(guān)注點(diǎn)自動(dòng)耦合進(jìn)來(lái)。AOP所面對的是處理過(guò)程中的某個(gè)步驟或階段,對不同的階段領(lǐng)域加以隔離,已獲得邏輯過(guò)程中各部分之間低耦合性的隔離效果,其與面向方面編程在目標上有著(zhù)本質(zhì)的差異。AOP的核心思想就是將應用程序中的業(yè)務(wù)邏輯處理部分同對其提供支持的通用服務(wù),即所謂的“橫切關(guān)注點(diǎn)”進(jìn)行分離,這些“橫切關(guān)注點(diǎn)”貫穿了程序中的多個(gè)縱向模塊的需求。

  使用AOP機制進(jìn)行開(kāi)發(fā),首先要對方面進(jìn)行了解,將需求分解成一般關(guān)注點(diǎn)和橫切關(guān)注點(diǎn),即將核心模塊級的關(guān)注點(diǎn)和系統級的橫切關(guān)注點(diǎn)分離;然后各自獨立的實(shí)現這些關(guān)注點(diǎn);最后用工具將業(yè)務(wù)邏輯代碼和橫切關(guān)注點(diǎn)代碼編織到一起,形成最終的程序。通過(guò)面向方面的編程可以減少編碼時(shí)間和重復。

  目前已經(jīng)形成的Spring框架

  1、Spring框架的特點(diǎn)

  Spring框架目前如此流行,一方面的原因在于Spring提供了一套全面并且十分成熟的輕型應用程序基本框架,并且對復雜的應用開(kāi)發(fā)提供了有力的支持。除此之外,從實(shí)際應用開(kāi)發(fā)角度來(lái)看,Spring最大的優(yōu)勢在于它是從實(shí)際項目開(kāi)發(fā)經(jīng)驗中抽取的,其提供了豐富的類(lèi)庫,可大大節省編碼量,它是一種高效的、可高度重用的應用框架。Spring框架中目前最吸引人也是該應用框架最具特色的地方就是名為控制反轉(IOC=Inverse Of Control)或者依賴(lài)注入(DI=Dependence Injection)的設計思想,這是一種相當優(yōu)秀的設計思想,即“好萊塢”原則:不用你主動(dòng)來(lái)找我,我會(huì )通知你。但是,僅僅憑借著(zhù)這樣一個(gè)單純的設計模式并不能使得Spring如此成功,Spring最成功的地方,還是目前使用最為廣泛的AOP應用,也就是Spring中基于A(yíng)OP實(shí)現的業(yè)務(wù)管理機制,也正是由于這一點(diǎn),使得Spring AOP成為應用框架中極其閃光的一個(gè)亮點(diǎn)。

  2、AOP思想在Spring框架中的體現

  文章前面已經(jīng)講述了AOP的概念以及什么叫做所謂的“橫切”關(guān)注點(diǎn),事務(wù)管理就是J2EE應用中一個(gè)橫切多個(gè)對象的橫切關(guān)注點(diǎn)的例子。

  2.1 事務(wù)管理

  對于J2EE應用程序而言,事務(wù)的處理一般有兩種模式:依賴(lài)特定事務(wù)資源的事務(wù)處理與依賴(lài)容器的參數化事務(wù)管理。在這里我們略去對第一種處理方式的說(shuō)明,直接對第二種方式,即依賴(lài)容器的參數化事務(wù)管理來(lái)闡述筆者的觀(guān)點(diǎn)。

  Spring事務(wù)管理究竟能帶給我們什么?

  了解Spring的人們都知道,對于傳統的基于事務(wù)資源的事務(wù)處理而言,Spring并不會(huì )產(chǎn)生什么影響,我們照樣可以成功編寫(xiě)并且運行這樣的代碼。

  對于依賴(lài)容器的參數化事務(wù)管理而言,Spring則可以用來(lái)幫助實(shí)現對事務(wù)的管理而無(wú)須使用EJB。Spring本身也是一個(gè)容器,只是相對EJB容器所要付出的代價(jià)而言,Spring屬于輕量級容器,它能夠替代EJB,通過(guò)使用AOP來(lái)提供聲明式事務(wù)管理,即可通過(guò)Spring實(shí)現基于容器的事務(wù)管理(從本質(zhì)上來(lái)講,Spring的事務(wù)管理是基于動(dòng)態(tài)AOP)。Spring與EJB最大的區別在于:第一,Spring可以為任意的Java Class實(shí)現事務(wù)管理而無(wú)須轉換成標準的EJB;第二,Spring事務(wù)管理并不依賴(lài)特定的事務(wù)資源從而使得系統的應用與部署更佳靈活。

  2.2動(dòng)態(tài)代理機制的實(shí)現

  Spring框架中所提供的AOP支持,是基于動(dòng)態(tài)AOP機制實(shí)現的,即通過(guò)動(dòng)態(tài)Proxy模式,在目標對象的方法調用前后插入相應的處理代碼。AOP代理可以是基于JDK動(dòng)態(tài)代理,也可以是基于CGLIB代理。Spring默認使用的是基于Java Dynamic Proxy模式實(shí)現,這樣任何的接口都能被代理?;赟pirng框架的應用程序開(kāi)發(fā),程序員會(huì )有一種自然的傾向性來(lái)實(shí)現面向接口編程而不是類(lèi),業(yè)務(wù)對象通常也是實(shí)現一個(gè)或者多個(gè)接口,這也是一種良好的編程習慣。Spring也可以基于CGLIB實(shí)現AOP代理,這樣所代理的是類(lèi)而不是接口。如果一個(gè)業(yè)務(wù)對象沒(méi)有實(shí)現某一個(gè)接口,那么CGLIB將被使用。

  我們先來(lái)分析一下Spring事務(wù)管理機制的實(shí)現原理。由于Spring內置AOP默認使用動(dòng)態(tài)代理模式實(shí)現,我們就先來(lái)分析一下動(dòng)態(tài)代理模式的實(shí)現方法。動(dòng)態(tài)代理模式的核心就在于代碼中不出現與具體應用層相關(guān)聯(lián)的接口或者類(lèi)引用,如上所說(shuō),這個(gè)代理類(lèi)適用于任何接口的實(shí)現。下面我們來(lái)看一個(gè)例子。 public class TxHandler implements InvocationHandler {

private Object originalObject;
public Object bind(Object obj) {
 this.originalObject = obj;
 return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
}

public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
 Object result = null;
 if (!method.getName().startsWith("save")) {
  UserTransaction tx = null;
  try {
   tx = (UserTransaction) (new InitialContext().lookup("java/tx"));
   result = method.invoke(originalObject, args);
   tx.commit();
  } catch (Exception ex) {
   if (null != tx) {
    try {
     tx.rollback();
    } catch (Exception e) {
   }
  }
 }
} else {
 result = method.invoke(originalObject, args);
}
return result;
}
}


  下面我們來(lái)分析一下上述代碼的關(guān)鍵所在。

  首先來(lái)看一下這段代碼:

return Proxy.newProxyInstance(
 obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);


  java.lang.reflect.Proxy.newProxyInstance方法根據傳入的接口類(lèi)型(obj.getClass.getInterfaces())動(dòng)態(tài)構造一個(gè)代理類(lèi)實(shí)例返回,這也說(shuō)明了為什么動(dòng)態(tài)代理實(shí)現要求其所代理的對象一定要實(shí)現一個(gè)接口。這個(gè)代理類(lèi)實(shí)例在內存中是動(dòng)態(tài)構造的,它實(shí)現了傳入的接口列表中所包含的所有接口。

  再來(lái)分析以下代碼:

public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
 ……
 result = method.invoke(originalObject, args);
 ……
 return result;
}


  InvocationHandler.invoke方法將在被代理類(lèi)的方法被調用之前觸發(fā)。通過(guò)這個(gè)方法,我們可以在被代理類(lèi)方法調用的前后進(jìn)行一些處理,如代碼中所示,InvocationHandler.invoke方法的參數中傳遞了當前被調用的方法(Method),以及被調用方法的參數。同時(shí),可以通過(guò)method.invoke方法調用被代理類(lèi)的原始方法實(shí)現。這樣就可以在被代理類(lèi)的方法調用前后寫(xiě)入任何想要進(jìn)行的操作。

  Spring的事務(wù)管理機制實(shí)現的原理,就是通過(guò)這樣一個(gè)動(dòng)態(tài)代理對所有需要事務(wù)管理的Bean進(jìn)行加載,并根據配置在invoke方法中對當前調用的方法名進(jìn)行判定,并在method.invoke方法前后為其加上合適的事務(wù)管理代碼,這樣就實(shí)現了Spring式的事務(wù)管理。Spring中的AOP實(shí)現更為復雜和靈活,不過(guò)基本原理是一致的。

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
Spring框架中的AOP思想動(dòng)態(tài)代理模式
Spring AOP嵌套順序 - Spring - Java - ITeye論壇
【第一章】 Spring概述 ——跟我學(xué)Spring3
為什么需要Spring
去阿里面試,被一道 Spring 面試題難倒了
Java教程學(xué)習入門(mén)視頻源碼課件:為什么企業(yè)看重Spring框架?
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久