我的理解是 把系統性的程式設計工作封裝起來 =》我給這個取個名字叫 「aspect」,然後通過aop技術把它切進我們的業務邏輯** =》 「業務「
「aspect」 和 「業務」 相互獨立,既可以讓「業務」 用到了 「aspect」 又讓2者互相獨立不耦合,多個「業務」也能復用 同乙份「aspect」
我們經常會在業務**上使用transaction事物,比如使用transactionscope:
下面的測試**用到了我在維護的乙個開源orm框架
示例業務**:
上面的** 就是 插入乙個學校到db 然後拿到主鍵 賦值給 person 再insert到db。 在同乙個事物裡面 要麼school 和person 同時插入db 要麼都失敗。
實際業務**肯定比這個要複雜的多了,比如多個方法在乙個事物裡面等我這裡就舉最簡單的例子。
那麼如果每段業務邏輯都這麼寫的話 會造成重複性**很多,下面我們就嘗試用aop面向對切的思想去優化
示例**:
如上圖: 我在需要用到事物的方法上面打了乙個enabletransactionscope標籤 這樣遇到業務方法需要用事物包裹的話 都可以打上這個標籤
假如要實現這樣的話 得實現以下幾點:
我需要**類,因為只有**類才能給業務**做些手腳(織入我們想要的邏輯包裹)
我需要乙個di容器,因為將例項的生成交給di容器了會很方面的生成**類
我希望只是打打標籤就能實現以上這些,這樣視覺化最好,也方便
這2個庫都是autofac旗下現成的開源產品,有了這2個庫 就滿足我上面提到的需求1和需求2
第3點看來得親自動手了
噹噹噹噹~~
autofac.annotation元件誕生
這個元件是我維護的乙個開源的autofac擴充套件庫,用來實現打打標籤 就能實現一些複雜的配置!
先簡單來個示例**:
更多示例請查閱:
新建乙個class如下繼承pointcutattribute 並實現方法: 注意:由於是非同步環境 必須使用 new transactionscope(transactionscopeasyncflowoption.enabled)
只需要在在需要事物包裹的方法上打上這個標籤 [enabletransactionscope] 如下圖:
點我檢視以上**
使用autofac.annotation元件可以很方便的讓我們在業務**中使用aop切面,可以自定義實現切入的位置(前置,後置,還是arround等)
參考上面**,
織入型別
實現規則
說明前置織入
繼承aspectbeforeattribute
在進入業務**之前先執行【前置織入邏輯-》業務**】
後置織入
繼承aspectafterattribute
在業務**執行之後執行(即使有異常)【業務**-》後置織入邏輯】
環繞織入
繼承aspectaroundattribute
在業務**之前和之前都執行【前置織入邏輯-》業務**-》後置織入邏輯】
pointcut織入
繼承pointcutattribute
掌控業務**的執行權,這種最靈活【本文的transactionscope功能就得用到它】
AOP面向切面
spring框架 開門見山,此篇部落格將主要來講講這個spring框架的aop aop aspect oriented programming 即面向切面程式設計的技術 aop基於ioc基礎,是對oop的有益補充。首先,我們需要知道以下幾個概念 1.joinpoint連線點 指被攔截的點,在spri...
aop切面程式設計PHP PHP AOP面向切面程式設計
aop aspect oriented programming 面向切面程式設計 字面解析 這裡的切面 aspect 通常是指類的乙個例項方法,也就是說其實我們只要在類的乙個例項方法執行前或後面掛載前置或後置方法,有點像鉤子,其實目的都是一樣的,都是為了切分和擴充套件相應方法的功能,而不需要在原始方...
aop 面向切面程式設計
起源 研究人員就對物件導向思想的侷限性進行了分析。他們研究出了一種新的程式設計思想,借助這一思想或許可以通過減少 重複模組從而幫助開發人員提高工作效率。隨著研究的逐漸深入,aop也逐漸發展成一套完整的程式設計思想,各種應用aop的技術也應運而生。aop思想 定義乙個切面,在切面的縱向定義處理方法,處...