郭新東 楊華 孫瑜
摘 要: 為了分離教學診斷與改進系統中有關數據填充等大量非系統核心業務的邊緣邏輯,提出基于AOP技術實現系統中的數據填充業務分離的方法。使用Spring AOP技術框架作為AOP的實現方式,介紹了Spring AOP框架和IOC容器的實現方法和內在機制,并說明分離橫切關注點和核心業務的一般步驟。重點闡述Spring AOP在教學診改系統中數據填充邊緣邏輯處理的研究與實現。系統結果表明,使用AOP技術框架可以有效分離數據填充等邊緣邏輯與系統核心業務邏輯,從而實現解耦,使系統可以更加專注于自身的核心業務。
關鍵詞: 面向切面編程; 數據填充; 教學診斷; 橫切關注點; 邊緣邏輯; 核心業務
中圖分類號: TN957.52?34; TP311.52; TP393.08 文獻標識碼: A 文章編號: 1004?373X(2018)14?0150?04
Application of AOP?based data filling in teaching diagnosis and improvement system
GUO Xindong, YANG Hua, SUN Yu
(School of Information Science and Engineering, Shanxi Agricultural University, Jinzhong 030800, China)
Abstract: To separate a large quantity of data filling related edge logics of non?core system services in the teaching diagnosis and improvement system, a data filling service separation method is realized based on the aspect oriented programming (AOP) technology for the system. With the Spring AOP technical framework as the implementation mode of the AOP, the implementation method and internal mechanism of the Spring AOP framework and IOC container are introduced, and the general steps of separating crosscutting concerns from core services are expounded. The research and implementation of data filling edge logic processing in teaching diagnosis and improvement system based on Spring AOP is emphatically explained. The system result shows that the AOP technical framework can efficiently separate the data filling edge logic from the core system service logic, and realize decoupling to enable the system more focused on its core services.
Keywords: AOP; data filling; teaching diagnosis; crosscutting concern; edge logic; core service
0 引 言
近年來,為了建立常態化的職業院校人才培養質量自主保證機制,教育部辦公廳相繼頒布了“關于建立職業院校教學工作診斷與改進制度的通知”等數條通知及辦法,該舉措既是深化應用型學校改革的重要方法,也是在新形勢下加快現代職業教育發展的戰略選擇[1]。然而,由于我國職業院校建設起步較晚,雖然經過多年的摸索已然形成一套適合自己的制度體系,但是仍然存在不少的問題。加之多數落后地區的職業院校缺乏有經驗的職教專家團隊,所以在推進教學工作診斷與改進的道路上參差不齊[2]。
由職教專家團隊提供專家經驗,設計并開發職業院校教學診斷與改進系統(下稱診改系統),可以為職業院校的教學診改工作提供更加實質性的指導。診改系統根據教育部及省教育廳頒布的辦法中的診斷要素和診斷點建立學校對應數據庫,并可與院校狀態數據平臺共享數據。系統根據專家知識針對所需診斷點制定診斷方案,然后從不同的數據源中提取出需要的數據,并將數據填充到診斷方案中的各個點中,從而輸出診斷報告。分析診改系統可知,系統中的診斷點雖然較多,診斷方案也不同,但是實施步驟一致,即制定診斷方案、提取數據、填充數據和輸出診斷報告。系統中難免會存在大量提取和填充數據的操作,而這些操作并不是系統的核心業務。若為每個診斷點對應的診斷模塊添加相應的數據填充功能,則會導致系統代碼高度耦合,程序過于復雜,使系統維護困難且不易擴展。
通過面向切面編程(Aspect Oriented Programming, AOP)對橫切關注點實施分離,然后根據約定或配置,自動將分離出的橫切關注點動態織入(Weaving)到系統中的確定位置[3]。使用AOP技術將數據填充作為橫切關注點從系統核心業務,即制定診斷方案的功能模塊中分離出來,有效地降低了系統模塊間的耦合度,提高了模塊的復用度,使開發者可以更多地關注系統核心業務[4]。在系統后期的維護和擴展中,也能保持系統的整體架構不發生改變,同時保證系統中的大多數模塊獨立性。
1 AOP
面向切面編程(AOP)是對面向對象編程(OOP)的擴展和補充,旨在將分布于系統核心業務中的可復用邏輯分離出來,形成獨立的模塊,以提高代碼復用率,降低模塊間的耦合度。通過把橫切關注點以切面(Aspect)的形式抽取出來,在合適的時機織入(Weave)到特定的切點(Pointcut)上以完成任務[5]。
1.1 Spring AOP
Spring框架對AOP提供了Java版本的實現,即Spring AOP,且支持AspectJ使用的切入點描述機制[6]。結合Spring IOC技術,支持將對象的創建過程交由容器管理,而使用者直接使用自動裝配好的注入對象即可[7]。Spring AOP支持兩種方式為對象創建代理,即JDK動態代理機制和CGLIB機制,前者應用于實現了接口(Interface)的目標對象上,而后者應用于其他類目標對象[8]。
1.2 開發步驟
使用Spring AOP進行開發的基本步驟如下:
1) 分離切面。切面即為橫切關注點,把在系統分析過程中定義為非核心業務的、具有可重用性的功能提取出來,以獨立模塊的形式實現,形成切面。在設計切面的時候,應該使設計出的切面能完整覆蓋核心業務的需求點。
2) 實現通知。通知(Advice)即為切面的具體代碼實現,表現為實現類。Spring AOP支持方法級別的通知,如在目標方法執行前后,或方法有異常拋出時。
3) 定義切點。切點定義一個連接點(Join Point)的集合,連接點則是程序執行過程中某一特定的時機點。AOP本身定義了多種形式的連接點,但Spring AOP為了不破壞對象的封閉性,只支持方法級別的連接點。通常根據業務的需求點來定義在哪些連接點上被切入。
4) 織入切面。通過配置文件將設計好的通知織入到定義好的切點,使分離出的邊緣邏輯切入到主邏輯中。整體邏輯如圖1所示。
1.3 特性及優勢
使用Spring AOP分離非核心關注點,可以使系統主邏輯不再對其形成依賴,在降低程序復雜性的同時提高了模塊的復用度[9]。結合Spring IOC框架,使對象的創建及裝配任務交由容器負責,可以在運行期間由容器動態搜索需要的資源,減少了組件間的相互依賴,使系統組件間的耦合度更加松散。此外,Spring AOP的抽象事務模型為開發者提供了聲明式的企業級事務能力,如事務管理、安全性服務等,使開發者可以不必介入到復雜的事務管理中,而能更多地關注主業務[10]。
2 數據填充關注點的分離
2.1 系統分析
教學工作診斷與改進系統跟一般信息系統的不同之處在于其需要根據不同的診斷點結合專家給出的診斷規則制定診斷方案,而后從不同的數據源中取出方案所需數據動態填入其中,最終輸出診斷報告并給出指導性的改進建議。由于診斷點眾多,且每個診斷點對應的診斷規則集合各不相同,從而形成的診斷方案也存在較大的差異,所以,這就要求系統要從不同的數據源中取出方案所需的數據集整合后做填充。系統采用分層的模型設計,則負責生成方案的業務層需要頻繁地調用不同的DAO層對象才能夠從不同的對象中獲取所需數據,而業務層對象維護過多的DAO層對象會使層與層之間的耦合度過高,如TeacherSchemeService和TrainingSchemeService都會依賴PartTimeTeacherDAO,同時也各自包含獨立依賴的其他模塊。保持過多的數據連接會加重數據庫和系統的負擔,影響系統性能。
針對存在的問題,使用Spring AOP將數據填充及事務處理橫切關注點分離出來,作為切面織入生成診斷方案和輸出改進報告之間的連接點。切面模塊的定義應該滿足細粒度,以提高模塊的復用率,如師資數據填充切面應分為SeniorTitleAspect,IntermediateTitleAspect,PrimaryTitleAspect和PartTimeTeacherAspect,這樣可以保證這些切面能供多個改進方案填充數據使用,再將切面類交由Spring IOC容器管理,在運行時動態織入匹配的切點處,如圖2所示。分離出橫切關注點后,生成方案業務層作為核心邏輯不再與數據填充邊緣邏輯直接交互,由切面模塊充當中間件負責提取數據并填充。切面的透明性使其便于移植,系統層次清晰,在不改變系統總體結構的前提下解決了緊耦合的數據填充問題。
2.2 分離關注點
分離橫切關注點即在原有模塊的設計基礎之上,將核心業務模塊中的相同需求點處的邊緣邏輯分離出來。以師資隊伍建設診斷和實訓基地建設診斷為例,師資隊伍建設診斷方案需要分別獲取具備高級職稱、中級職稱、初級職稱和企業兼職教師隊伍建設情況,而實訓基地建設診斷方案需要分別獲取校內基地、校外基地、及校內教師和企業兼職教師隊伍情況,如圖3所示。診改系統根據診斷方案及填充的數據輸出改進報告,然而系統并不關心數據是從何處獲取或是如何填充到方案中,所以數據填充對于診斷方案及報告的生成就屬于邊緣邏輯,應該分離。對于像企業兼職教師數據填充這樣的模塊,會被多個不同的診斷方案使用,所以應當在系統上下文(Context)中共享實例,運用單例模式能夠較好地解決這類問題。
2.3 切面設計
不同于AspectJ框架,Spring AOP并沒有為切面引入新的設計語言,使用帶注解@Aspect的標準POJO類就可以完成切面,避免了切面的高侵入性。根據系統分析可知數據填充模塊具有一些通用的操作,如建立到數據源的連接,所以首先建立通用數據填充模塊,然后根據所需數據的粒度去泛化該通用模塊。填充數據的動作需要在輸出診斷報告之前完成,所以使用前置通知織入診斷輸出模塊較為合適。Spring AOP在切面類中使用帶@Before注解的方法即可完成前置通知的實現。以教學資源建設中的網絡課程建設為例,需要獲取網絡課程建設的數據并填充,其核心程序代碼如下:
@Aspect
public class OnlineCourseAspect extends CommonAspect {
@Before(pointcut="com.diag.services.teachingres.
TeachingResServices.generateReportPart()")
public void filling() {
…//get the data and fill to the pointcut
}
…
}
2.4 織入配置
切面完成之后,就可以按規則將切面織入到特定的切點中。Spring AOP是依賴動態代理機制實現的,只支持基于方法攔截的織入。使用基于AspectJ的注解方式配置切點,則切點就是一個添加了注解@Pointcut的類方法,方法名即為切點的標識名,因此節點的可訪問性等同于方法的可訪問性。對于只用于特定業務類中的切面,則可以將其切點放置在該切面類中,如SeniorTitleAspect只在TeachingStaffService業務類中填充數據,故將切點@Pointcut(“com.diag.services.TeachingStaffService.generateReportPart()”)置于SeniorTitleAspect切面類中。對于具有通用性的切面,則可以將這些切面的切點統一放置于一個系統類SystemUtilPointcut中方便調用。
這樣系統在運行時,TeachingStaffService,Teaching
ResService等業務模塊可以專注于診斷報告的生成,而不需要關注數據的獲取及填充等非核心業務,從而實現了數據填充邊緣邏輯的分離。
3 結 語
教學診改系統應用Spring AOP解決了數據填充邊緣邏輯與主邏輯分離的問題,使數據填充功能對于主邏輯是透明的。聲明式的編程方式使程序結構清晰、層次分明,利于系統的維護和擴展。使用Spring AOP框架需要多加注意的是,系統的主邏輯模塊和邊緣邏輯模塊都需要由Spring IOC容器管理,若系統中存在非容器創建的實例且與模塊形成依賴關系,則可能導致邏輯不可控甚至系統崩潰。所以使用Spring AOP框架時,須在系統設計階段理清模塊間的依賴關系,與主邏輯或邊緣邏輯具有依賴關系時必須交由容器管理。
參考文獻
[1] 李曉燕.高職院校教學診斷與改進工作芻議[J].文教資料,2016(7):154?155.
LI Xiaoyan. Discussion on teaching diagnosis and improvement in higher vocational colleges [J]. Data of culture and education, 2016(7): 154?155.
[2] 劉海.教學診斷與改進:職業院校質量提升的內生動力[J].職業技術教育,2016,37(18):19?23.
LIU Hai. Diagnosis and improvement of teaching: endogenous power of quality improvement of vocational colleges [J]. Vocational and technical education, 2016, 37(18): 19?23.
[3] 趙秀霞,付秀麗.基于組件和攔截器的Web系統權限設計與實現[J].現代電子技術,2014,37(8):105?107.
ZHAO Xiuxia, FU Xiuli. Permission design and implementation of Web system based on subassembly and interceptor [J]. Modern electronics technique, 2014, 37(8): 105?107.
[4] 陳雷,孟博.基于AOP技術的重構方法研究與實現[J].小型微型計算機系統,2004,25(9):1700?1703.
CHEN Lei, MENG Bo. Research and implementation of refactoring based on AOP technique [J]. Journal of Chinese computer systems, 2004, 25(9): 1700?1703.
[5] 孟凡新,張京軍,劉光遠.基于AOP和Web服務的多層分布式系統[J].計算機工程,2010,36(1):61?63.
MENG Fanxin, ZHANG Jingjun, LIU Guangyuan. Multi?tier distributed system based on AOP and Web services [J]. Computer engineering, 2010, 36(1): 61?63.
[6] 王申源,董傳良,劉英丹.一種基于AOP的企業應用開發技術[J].計算機仿真,2005,22(5):234?238.
WANG Shenyuan, DONG Chuanliang, LIU Yingdan. An enterprise applicable developing technology based on AOP [J]. Computer simulation, 2005, 22(5): 234?238.
[7] 鮑陳,汪千松.基于AOP的實時系統關注點分離方法[J].計算機工程與設計,2011,32(9):3082?3086.
BAO Chen, WANG Qiansong. Separation approach for concerns in real?time system based on AOP [J]. Computer engineering and design, 2011, 32(9): 3082?3086.
[8] JIANG H. The strategy pattern based on AOP implementation [J]. Microcomputer & its applications, 2016, 35(1): 9?11.
[9] CHOI I. A study on rule separation based on AOP for an efficient service system [J]. Pacific science review, 2015, 17(2): 51?60.
[10] GE B, MAO X, CHEN Y, et al. An AOP?based robot behaviors safety checking method [C]// Proceedings of International Conference on Industrial Informatics?Computing Technology, Intelligent Technology, Industrial Information Integration. Wuhan: IEEE, 2016: 116?123.