熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

用Spring AOP實現松散耦合

2022-06-13   來源: Java開源技術 
    引言
   
    AOP(Aspected Oriented Programming)是一種新興的編程技術它可以解決OOP和過程化方法不能夠很好解決的橫切(crosscut)問題事務安全日志等橫切關注當未來系統變得越來越復雜橫切關注點就成為一個打問題的時候AOP就可以很輕松的解決橫切關注點這個問題使得AOP編程成為Spring 是基於JEE的輕量級開源開發框架其中Spring AOP組件實現了面向方面編程
   
    AOP 概述
   
    面向方面編程 (AOP) 提供從另一個角度來考慮程序結構以完善面向對象編程(OOP) 面向對象將應用程序分解成各個層次的對象而AOP將程序分解成各個方面或者說關注點 這使得可以模塊化諸如事務管理等這些橫切多個對象的關注點
   
    AOP 基本概念
   
    方面(Aspect) 一個關注點的模塊化這個關注點實現可能另外橫切多個對象事務管理是JEE應用中一個很好的橫切關注點例子方面用Spring的 Advisor或攔截器實現
   
    連接點(Joinpoint) 程序執行過程中明確的點如方法的調 用或特定的異常被拋出
   
    通知(Advice) 在特定的連接點AOP框架執行的動作各種類 型的通知包括aroundbeforethrows通知通知類型將在下面討論許多AOP框架 包括Spring都是以攔截器做通知模型維護一個圍繞連接點的攔截器鏈
   
    切入點(Pointcut) 指定一個通知將被引發的一系列連接點 的集合AOP框架必須允許開發者指定切入點例如使用正則表達式
   
    引入(Introduction) 添加方法或字段到被通知的類 Spring允許引入新的接口到任何被通知的對象例如你可以使用一個引入使任何對象實現 IsModified接口來簡化緩存
   
    目標對象(Target Object) 包含連接點的對象也被稱作 被通知或被代理對象
   
    AOP代理(AOP Proxy) AOP框架創建的對象包含通知 在Spring中AOP代理可以是JDK動態代理或者CGLIB代理
   
    織入(Weaving) 組裝方面來創建一個被通知對象這可以在編譯時 完成(例如使用AspectJ編譯器)也可以在運行時完成Spring和其他純Java AOP框架一樣 在運行時完成織入
   
    Spring AOP 介紹
   
    Spring的一個關鍵組件就是AOP框架 Spring IoC容器(BeanFactory 和ApplicationContext)並不依賴於AOP 這意味著如果你不需要使用AOP可以不用AOP完善了Spring IoC使之成為一個有效的中間件解決方案
   
    Spring AOP 是Spring 框架的重要組成部分它實現了AOP聯盟約定的接口Spring AOP 是由純Java開發完成的Spring AOP 只實現了方法級別的連接點在JEE應用中AOP攔截到方法級的操作已經足夠OOP倡導的是基於setter/getter 的方法訪問而非直接訪問域而Spring 有足夠理由僅僅提供方法級的連接點為了使控制反轉(IoC)很方便的使用到非常健壯靈活的企業服務則需要Spring AOP 的實現Spring AOP 在運行時才創建Advice 對象Spring AOP的優點如下
   
    允許開發者使用聲明式企業服務比如事務服務安全性服務
   
    開發者可以開發滿足業務需求的自定義方面
   
    開發Spring AOP Advice 很方便可以借助代理類快速搭建Spring AOP 應用
   
    使用Spring AOP松散耦合
   
    創建通知
   
    為實現AOP開發者需要開發AOP 通知(Advice)AOP 通知(Advice) 包含了方面(Aspect)的邏輯當創建一個Advice 對象的時候你就編寫了實現橫切(crosscutting)功能 Spring 的連接點是用方法攔截器實現的這就意味著你編寫的Spring AOP 通知將在方法調用的不同點組入進程序中由於在調用一個方法時有幾個不同的時間點Spring 可以在不同的時間點組入進程序Spring AOP中提供了四種通知的接口 MethodBeforeAdvice 用於在目標方法調用前觸發AfterReturningAdvice 用於在目標方法調用後觸發 ThrowsAdvice 用於在目標方法拋出異常時觸發MethodInterceptor 用於實現 Around 通知(Advice)在目方法執行的前後觸發
   
    如果要實現相應功能則需要實現上述對應的接口例如實現Before 通知(Advice)需要實現方法 void before(Method method Object[] args Object target) 實現 After 通知(Advice) 需要實現方法 void afterReturning (Method method Object[] args Object target)
   
    在Spring 中定義切入點
   
    在不能明確調用方法的時候通知就很不實用切入點則可以決定特定的類特定的方法是否匹配特定標准如果某匹配則通知將應用到此方法上Spring 切入點允許用很靈活的方式將通知組織進我們的類中Spring 中的切入點框架的核心是Pointcut接口此接口允許我們定義組入通知中的類和方法許多方面是通過一系列的通知和切入點組合來定義
   
    在Spring中一個advisor就是一個方面的完整的模塊化表示Spring提供了PointcutAdvisor接口把通知和切入點組合成一個對象Spring中很多內建的切入點都有對應的PointcutAdvisor這使得你可以很方便在一個地方管理切入點和通知Spring中的切入點分為兩類靜態和動態因為靜態切入點的性能要優於動態切入點所以優先考慮使用Spring 為我們提供創建靜態切入點很實用的類StaticMethodMatherPointcut在這個類中我們只需要關心setMappedName和setMappedNams方法你可以使用具體的類名也可以使用通配符設置mappedName屬性為set* 則匹配所有的set方法Spring還提供了另通過正則表達式來創建靜態切入點的實用類RegexpMethodPointcut通過使用Perl樣式的正則表達式來定義你感興趣的方法當切入點需要運行時參數值來執行通知時這時就需要使用動態切入點Spring提供了一個內建的動態切入點ControlFlowPointcut此切入點匹配基於當前線程的調用堆棧我們可以在只有在當前線程執行的執行時找到特定的類和特定的方法才返回true使用動態切入點有很大的性能損耗大多數的切入點可以靜態確定我們很少有機會創建動態切入點為了增加可切入點的可重用性Spring 提供了切入點上的集合操作交集和合並
   
    用ProxyFactoryBean創建AOP代理
   
    ProxyFactoryBean和其他Spring的 FactoryBean實現一樣引入一個間接的層次如果你定義一個名字為myfactory的ProxyFactoryBean 引用myfactory的對象所看到的不是ProxyFactoryBean 實例本身而是由實現ProxyFactoryBean的類的 getObject()方法所創建的對象這個方法將創建一個包裝了目標對象 的AOP代理使用ProxyFactoryBean或者其他IoC可知的類來創建AOP代理的最重要的優點之一是IoC可以管理通知和切入點這是一個非常的強大的功能能夠實現其他AOP框架很難實現的特定的方法例如一個通知本身可以引用應用對象(除了目標對象 它在任何AOP框架中都可以引用應用對象)這完全得益於依賴注入所提供的可插入性通常我們不需要ProxyFactoryBean的全部功能因為我們常常只對一個方面感興趣 例如事務管理當我們僅僅對一個特定的方面感興趣時我們可以使用許多便利的工廠來創建AOP代理TransactionProxyFactoryBean
   
    自動代理
   
    在應用較小時只有很少類需要被通知的時ProxyFactoryBean 可以很好的工作當有許多類需要通知的時顯示的創建每個代理就顯得很繁瑣幸運的是Spring提供了是使用自動通過容器來創建代理這時就只需要配置一個Bean來做繁瑣的工作Spring提供了兩個類實現自動代理BeanNameAutoProxyCreator和DefaultAdvisorAutoProxyCreator
   
    BeanNameAutoProxyCreator為匹配名字的Bean產生代理它可以使用在將一個或者多個方面應用在命名相似的Bean中自動代理框架假設代理將要暴露出什麼接口如果目標Bean沒有實現任何接口這時就會動態產生一個子類而更強大的自動代理是DefaultAdvisorAutoProxyCreator你所需要做的是在BeanFactory中包含它的配置這個類的奇妙之處在於他使用實現了BeanPostProcessor接口在Bean定義被加載倒Spring容器中後DefaultAdvisorAutoProxyCreator將搜索上下文中的Advisor最後它將Advisor應用到匹配Advisor切入點的Bean中這個代理只對Advisor起作用它需要通過Advisor來得到需要通知的Bean元數據自動代理(MetaData AutoProxy)元數據自動代理配置依賴於源代碼屬性而不是外部XML配置文件這可以非常方便的使源代碼和AOP元數據組織在同一個地方元數據自動代理最常用的地方是用來聲明事務Spring提供了很強的框架來通過AOP框架來聲明事務這提供了在EJB使用聲明式事務的相同功能
   
    結論
   
    AOP 是面向對象編程的有力補充通過方面就可以聚合在應用中行為形成可重用模塊
   
    通過程序可以實現怎樣和在什麼地方來調用這些行為這可以減少代碼重復並使你更加關注業務邏輯Spring 提供了AOP框架來實現調用方法時加入方面在AOP框架中可以很方便的使用預定義的靜態切入點來定義被調用的類和方法我們需要通過Spring提供的代理類來產生代理對象可以使用ProxyFactoryBean也可以使用自動代理Spring AOP 的編程方式模塊化了橫向關注點的實現提供了一個更好更快的軟件開發方式在軟件結構日益擴大結構日益復雜的今天Spring AOP 將會發揮越來越重要的作用
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28396.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.