javascript
Spring-AOP概述
- 概述
- AOP是什么
- AOP專業(yè)術語
- 連接點Joinpoint
- 切點Pointcut
- 增強Advice
- 目標對象Target
- 引介Introduction
- 織入Weaving
- 代理Proxy
- 切面Aspect
- AOP的實現(xiàn)者
- AspectJ
- AspectWerkz
- JBoss AOP
- Spring AOP
概述
Spring AOP是AOP技術在Spring中的具體實現(xiàn),它是Spring框架的另外一個重要基石。
Spring構(gòu)建于IOC之上,和IOC渾然天成,統(tǒng)一于Spring容器之中。
AOP是什么
AOP的出現(xiàn)并不是要取代面向?qū)ο缶幊蘋OP(Object-oriented programming),而是作為OOP的有益補充。
AOP是有特定的應用場合的,它只適合那些具有橫切邏輯的應用場合,比如性能監(jiān)測、訪問控制、事務管理以及日志記錄等。
AOP(Aspect-oriented programming)面向切面編程。
按照軟件重構(gòu)思想的理念,如果多個類中出現(xiàn)了相同的代碼,則應該考慮定義一個父類,將這些相同的代碼提取到父類中。 比如 Dog、Cat、Pig都有run()和eat()方法,通過引入一個包含這兩個方法的抽象的Animal父類,Dog、Cat、Pig就可以通過繼承Animal復用run()和eat()方法方法。
代碼已托管到Github—> https://github.com/yangshangwei/SpringMaster
通過引入父類消除多個類中重復代碼的方式在大多數(shù)情況下是可行的,但有的時候并非可以解決,比如:
ForumService.java
package com.xgj.aop.introduce;public class ForumService {private TransactionManager transManager;private PerformanceMonitor pmonitor;private TopicDao topicDao;private ForumDao forumDao;public void removeTopic(int topicId) {// 性能監(jiān)視開始pmonitor.start();// 事務開始transManager.beginTransaction();// (1)業(yè)務代碼topicDao.removeTopic(topicId);// 事務結(jié)束transManager.endTransaction();// 性能監(jiān)視結(jié)束pmonitor.end();}public void CreateForum(Forum forum) {pmonitor.start();transManager.beginTransaction();// (2)業(yè)務代碼forumDao.create(forum);transManager.endTransaction();pmonitor.end();} }我們發(fā)現(xiàn)(1)(2)兩處真正的業(yè)務代碼被 性能監(jiān)視代碼 和 事務方法的所包圍。 業(yè)務代碼淹沒在重復化非業(yè)務性的代碼之中。 性能監(jiān)視和事務管理這些非業(yè)務性代碼葛藤纏樹般包圍業(yè)務代碼。
如果將ForumService業(yè)務類看做一段圓木, 將removeTopic()和createForum()方法分別看成圓木的一截,會發(fā)現(xiàn)性能監(jiān)視和事務管理的代碼就像一個年輪,而業(yè)務代碼就是圓木的樹心,這也是橫切代碼概念的由來。
橫切邏輯示意圖:
我們無法通過抽象父類的方式消除如上重復性橫切代碼,因為這些橫切邏輯依附在業(yè)務類方法的流程中,它們不能轉(zhuǎn)移到其他地方去。
AOP獨辟蹊徑,通過橫向抽取機制為這類無法通過縱向繼承體系進行抽象的重復性代碼提供了解決方案。
橫向抽取:
從上圖可以看出: AOP希望將這些分散在各個業(yè)務邏輯代碼中的相同代碼通過橫向切割的方式抽取到一個獨立的模塊中,還業(yè)務邏輯一個清新的世界。
當然,將這些重復性的橫切邏輯獨立出來是容易的,但是如何將這些獨立的邏輯融合到業(yè)務邏輯中以完成和原來一樣的業(yè)務流程,這才是關鍵,這也是AOP要解決的主要問題
AOP專業(yè)術語
連接點Joinpoint
連接點是程序執(zhí)行的某個特定位置。比如類初始化前、類初始化后、類的某個方法調(diào)用前\調(diào)用、方法拋出異常后等。
一個類或者一段程序代碼擁有一些具有邊界性質(zhì)的特定點,這些代碼中的特定點被稱為“連接點”
Spring僅支持方法的連接點,即僅僅能在方法調(diào)用前、調(diào)用后、方法拋出異常時以及方法調(diào)用前后這些程序執(zhí)行點織入增強。
連接點由兩個信息確定:
- 一是用方法標識的程序執(zhí)行點
- 二是用相對位置標識的方位
比如Test.foo()方法執(zhí)行前的連接點,執(zhí)行點為Test.foo(),方位為該方法執(zhí)行前的位置。 Spring使用切點對執(zhí)行點進行定位,而方位則在增強類型中定義。
切點Pointcut
每個程序類都擁有多個連接點,比如擁有兩個方法的類,這兩個方法都是連接點。
在眾多的連接點中,如何定位我們需要的連接點呢? AOP通過“切點”定位特定的連接點。
一個切點可以匹配多個連接點。
在Spring中,切點通過 org.springframework.aop.Pointcut接口類進行描述,它使用類和方法作為連接點的查詢條件,Spring AOP的規(guī)則引擎負責解析切點所設定的查詢條件,找到對應的連接點。
確切的說,應該是執(zhí)行點而非連接點,因為連接點是方法執(zhí)行前、執(zhí)行后等包含方位信息的具體程序執(zhí)行點, 而切點只是定位到某個方法上, 如果希望定位到具體的連接點上,還需要提供方位信息,
增強Advice
增強是織入目標類連接點上的一段程序代碼。
在Spring中,增強除了用于描述一段程序代碼外,還擁有另一個和連接點相關的信息,這便是執(zhí)行點的方位。 結(jié)合執(zhí)行點的方位信息和切點信息,就可以找到特定的連接。
正是因為增強既包含用于添加到目標連接點上的一段執(zhí)行邏輯,又包含用于特定連接點的方位信息,所以Spring提供的增強接口都是帶方位名的,比如BeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。
所以只有結(jié)合切點和增強,才能確定特定的連接點并實施增強邏輯。
目標對象Target
增強邏輯的織入目標類。
如果沒有AOP,業(yè)務目標類需要自己實現(xiàn)所有的邏輯,如最上面的代碼(性能測試和事務管理)。 在AOP的幫助下,ForumService只需要試下那些非橫切邏輯的程序邏輯,而性能監(jiān)視和事務管理等這些橫切邏輯則可以使用AOP動態(tài)織入特定的連接點上。
引介Introduction
引介是一種特殊的增強,它為類添加一些屬性和方法。
這樣,即使一個業(yè)務類原本沒有實現(xiàn)某個接口,通過AOP的引介功能,也可以動態(tài)的為該業(yè)務類添加接口的實現(xiàn)邏輯,讓業(yè)務類成為這個接口的實現(xiàn)類。
織入Weaving
織入是將增強添加到目標的具體連接點上的過程。
AOP有三種織入方式
Spring采用動態(tài)代理織入 ,而AspectJ 采用編譯期織入和裝載期織入
代理Proxy
一個類被AOP織入增強后,就產(chǎn)生了一個結(jié)果類,它是融合了原類和增強邏輯的代理類。
切面Aspect
切面由切點和增強(引介)組成。它既包括橫切邏輯的定義,也包括連接點的定義。
SoringAOP就是負責實施切面的框架,它將切面所定義的橫切邏輯織入切面所指定的連接點中。
AOP的工作重心在于如何將增強應用于目標對象的連接點上。 主要包括兩點:
AOP的實現(xiàn)者
AspectJ
AspectJ是目前最完善的AOP語言,對Java編程語言進行了擴展,定義了AOP語法,能夠在編譯期提供橫切代碼的織入。AspectJ提供了兩種橫切實現(xiàn)機制,一種稱為動態(tài)橫切(Dynamic Crosscuting),另一種成為靜態(tài)橫切(Static Crosscuting)
AspectWerkz
基于java的簡單、動態(tài)和輕量級的AOP框架,支持運行期或者類裝載期織入橫切代碼,它擁有一個特殊的類裝載器。他與AspectJ項目已經(jīng)合并,第一個發(fā)行版是AspectJ5。擴展AspectJ語言,以基于注解的方式支持類似AspectJ的代碼風格。
JBoss AOP
JBoss是一個開源的符合J2EE規(guī)范的應用服務器,作為J2EE規(guī)范的補充,JBoss中引入了AOP框架,為普通Java提供了J2EE服務,而無需遵循EJB規(guī)范。JBoss通過類載入時,使用Javassis對字節(jié)碼操作實現(xiàn)動態(tài)AOP框架。
Spring AOP
Spring AOP使用純Java實現(xiàn),不需要專門的編譯過程,不需要特殊的類裝載器,他在運行期通過代理方式向目標類織入增強代碼。Spring并不嘗試提供最完整的AOP實現(xiàn),主要側(cè)重一種和Spring IoC容器整合的AOP實現(xiàn),以解決企業(yè)級開發(fā)中的常見問題。
總結(jié)
以上是生活随笔為你收集整理的Spring-AOP概述的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring-国际化信息03-容器级的国
- 下一篇: Spring-AOP基础知识