郭新東 楊華 孫瑜
摘 要: 為了分離教學(xué)診斷與改進(jìn)系統(tǒng)中有關(guān)數(shù)據(jù)填充等大量非系統(tǒng)核心業(yè)務(wù)的邊緣邏輯,提出基于AOP技術(shù)實(shí)現(xiàn)系統(tǒng)中的數(shù)據(jù)填充業(yè)務(wù)分離的方法。使用Spring AOP技術(shù)框架作為AOP的實(shí)現(xiàn)方式,介紹了Spring AOP框架和IOC容器的實(shí)現(xiàn)方法和內(nèi)在機(jī)制,并說明分離橫切關(guān)注點(diǎn)和核心業(yè)務(wù)的一般步驟。重點(diǎn)闡述Spring AOP在教學(xué)診改系統(tǒng)中數(shù)據(jù)填充邊緣邏輯處理的研究與實(shí)現(xiàn)。系統(tǒng)結(jié)果表明,使用AOP技術(shù)框架可以有效分離數(shù)據(jù)填充等邊緣邏輯與系統(tǒng)核心業(yè)務(wù)邏輯,從而實(shí)現(xiàn)解耦,使系統(tǒng)可以更加專注于自身的核心業(yè)務(wù)。
關(guān)鍵詞: 面向切面編程; 數(shù)據(jù)填充; 教學(xué)診斷; 橫切關(guān)注點(diǎn); 邊緣邏輯; 核心業(yè)務(wù)
中圖分類號(hào): TN957.52?34; TP311.52; TP393.08 文獻(xiàn)標(biāo)識(shí)碼: A 文章編號(hào): 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 引 言
近年來,為了建立常態(tài)化的職業(yè)院校人才培養(yǎng)質(zhì)量自主保證機(jī)制,教育部辦公廳相繼頒布了“關(guān)于建立職業(yè)院校教學(xué)工作診斷與改進(jìn)制度的通知”等數(shù)條通知及辦法,該舉措既是深化應(yīng)用型學(xué)校改革的重要方法,也是在新形勢(shì)下加快現(xiàn)代職業(yè)教育發(fā)展的戰(zhàn)略選擇[1]。然而,由于我國職業(yè)院校建設(shè)起步較晚,雖然經(jīng)過多年的摸索已然形成一套適合自己的制度體系,但是仍然存在不少的問題。加之多數(shù)落后地區(qū)的職業(yè)院校缺乏有經(jīng)驗(yàn)的職教專家團(tuán)隊(duì),所以在推進(jìn)教學(xué)工作診斷與改進(jìn)的道路上參差不齊[2]。
由職教專家團(tuán)隊(duì)提供專家經(jīng)驗(yàn),設(shè)計(jì)并開發(fā)職業(yè)院校教學(xué)診斷與改進(jìn)系統(tǒng)(下稱診改系統(tǒng)),可以為職業(yè)院校的教學(xué)診改工作提供更加實(shí)質(zhì)性的指導(dǎo)。診改系統(tǒng)根據(jù)教育部及省教育廳頒布的辦法中的診斷要素和診斷點(diǎn)建立學(xué)校對(duì)應(yīng)數(shù)據(jù)庫,并可與院校狀態(tài)數(shù)據(jù)平臺(tái)共享數(shù)據(jù)。系統(tǒng)根據(jù)專家知識(shí)針對(duì)所需診斷點(diǎn)制定診斷方案,然后從不同的數(shù)據(jù)源中提取出需要的數(shù)據(jù),并將數(shù)據(jù)填充到診斷方案中的各個(gè)點(diǎn)中,從而輸出診斷報(bào)告。分析診改系統(tǒng)可知,系統(tǒng)中的診斷點(diǎn)雖然較多,診斷方案也不同,但是實(shí)施步驟一致,即制定診斷方案、提取數(shù)據(jù)、填充數(shù)據(jù)和輸出診斷報(bào)告。系統(tǒng)中難免會(huì)存在大量提取和填充數(shù)據(jù)的操作,而這些操作并不是系統(tǒng)的核心業(yè)務(wù)。若為每個(gè)診斷點(diǎn)對(duì)應(yīng)的診斷模塊添加相應(yīng)的數(shù)據(jù)填充功能,則會(huì)導(dǎo)致系統(tǒng)代碼高度耦合,程序過于復(fù)雜,使系統(tǒng)維護(hù)困難且不易擴(kuò)展。
通過面向切面編程(Aspect Oriented Programming, AOP)對(duì)橫切關(guān)注點(diǎn)實(shí)施分離,然后根據(jù)約定或配置,自動(dòng)將分離出的橫切關(guān)注點(diǎn)動(dòng)態(tài)織入(Weaving)到系統(tǒng)中的確定位置[3]。使用AOP技術(shù)將數(shù)據(jù)填充作為橫切關(guān)注點(diǎn)從系統(tǒng)核心業(yè)務(wù),即制定診斷方案的功能模塊中分離出來,有效地降低了系統(tǒng)模塊間的耦合度,提高了模塊的復(fù)用度,使開發(fā)者可以更多地關(guān)注系統(tǒng)核心業(yè)務(wù)[4]。在系統(tǒng)后期的維護(hù)和擴(kuò)展中,也能保持系統(tǒng)的整體架構(gòu)不發(fā)生改變,同時(shí)保證系統(tǒng)中的大多數(shù)模塊獨(dú)立性。
1 AOP
面向切面編程(AOP)是對(duì)面向?qū)ο缶幊蹋∣OP)的擴(kuò)展和補(bǔ)充,旨在將分布于系統(tǒng)核心業(yè)務(wù)中的可復(fù)用邏輯分離出來,形成獨(dú)立的模塊,以提高代碼復(fù)用率,降低模塊間的耦合度。通過把橫切關(guān)注點(diǎn)以切面(Aspect)的形式抽取出來,在合適的時(shí)機(jī)織入(Weave)到特定的切點(diǎn)(Pointcut)上以完成任務(wù)[5]。
1.1 Spring AOP
Spring框架對(duì)AOP提供了Java版本的實(shí)現(xiàn),即Spring AOP,且支持AspectJ使用的切入點(diǎn)描述機(jī)制[6]。結(jié)合Spring IOC技術(shù),支持將對(duì)象的創(chuàng)建過程交由容器管理,而使用者直接使用自動(dòng)裝配好的注入對(duì)象即可[7]。Spring AOP支持兩種方式為對(duì)象創(chuàng)建代理,即JDK動(dòng)態(tài)代理機(jī)制和CGLIB機(jī)制,前者應(yīng)用于實(shí)現(xiàn)了接口(Interface)的目標(biāo)對(duì)象上,而后者應(yīng)用于其他類目標(biāo)對(duì)象[8]。
1.2 開發(fā)步驟
使用Spring AOP進(jìn)行開發(fā)的基本步驟如下:
1) 分離切面。切面即為橫切關(guān)注點(diǎn),把在系統(tǒng)分析過程中定義為非核心業(yè)務(wù)的、具有可重用性的功能提取出來,以獨(dú)立模塊的形式實(shí)現(xiàn),形成切面。在設(shè)計(jì)切面的時(shí)候,應(yīng)該使設(shè)計(jì)出的切面能完整覆蓋核心業(yè)務(wù)的需求點(diǎn)。
2) 實(shí)現(xiàn)通知。通知(Advice)即為切面的具體代碼實(shí)現(xiàn),表現(xiàn)為實(shí)現(xiàn)類。Spring AOP支持方法級(jí)別的通知,如在目標(biāo)方法執(zhí)行前后,或方法有異常拋出時(shí)。
3) 定義切點(diǎn)。切點(diǎn)定義一個(gè)連接點(diǎn)(Join Point)的集合,連接點(diǎn)則是程序執(zhí)行過程中某一特定的時(shí)機(jī)點(diǎn)。AOP本身定義了多種形式的連接點(diǎn),但Spring AOP為了不破壞對(duì)象的封閉性,只支持方法級(jí)別的連接點(diǎn)。通常根據(jù)業(yè)務(wù)的需求點(diǎn)來定義在哪些連接點(diǎn)上被切入。
4) 織入切面。通過配置文件將設(shè)計(jì)好的通知織入到定義好的切點(diǎn),使分離出的邊緣邏輯切入到主邏輯中。整體邏輯如圖1所示。
1.3 特性及優(yōu)勢(shì)
使用Spring AOP分離非核心關(guān)注點(diǎn),可以使系統(tǒng)主邏輯不再對(duì)其形成依賴,在降低程序復(fù)雜性的同時(shí)提高了模塊的復(fù)用度[9]。結(jié)合Spring IOC框架,使對(duì)象的創(chuàng)建及裝配任務(wù)交由容器負(fù)責(zé),可以在運(yùn)行期間由容器動(dòng)態(tài)搜索需要的資源,減少了組件間的相互依賴,使系統(tǒng)組件間的耦合度更加松散。此外,Spring AOP的抽象事務(wù)模型為開發(fā)者提供了聲明式的企業(yè)級(jí)事務(wù)能力,如事務(wù)管理、安全性服務(wù)等,使開發(fā)者可以不必介入到復(fù)雜的事務(wù)管理中,而能更多地關(guān)注主業(yè)務(wù)[10]。
2 數(shù)據(jù)填充關(guān)注點(diǎn)的分離
2.1 系統(tǒng)分析
教學(xué)工作診斷與改進(jìn)系統(tǒng)跟一般信息系統(tǒng)的不同之處在于其需要根據(jù)不同的診斷點(diǎn)結(jié)合專家給出的診斷規(guī)則制定診斷方案,而后從不同的數(shù)據(jù)源中取出方案所需數(shù)據(jù)動(dòng)態(tài)填入其中,最終輸出診斷報(bào)告并給出指導(dǎo)性的改進(jìn)建議。由于診斷點(diǎn)眾多,且每個(gè)診斷點(diǎn)對(duì)應(yīng)的診斷規(guī)則集合各不相同,從而形成的診斷方案也存在較大的差異,所以,這就要求系統(tǒng)要從不同的數(shù)據(jù)源中取出方案所需的數(shù)據(jù)集整合后做填充。系統(tǒng)采用分層的模型設(shè)計(jì),則負(fù)責(zé)生成方案的業(yè)務(wù)層需要頻繁地調(diào)用不同的DAO層對(duì)象才能夠從不同的對(duì)象中獲取所需數(shù)據(jù),而業(yè)務(wù)層對(duì)象維護(hù)過多的DAO層對(duì)象會(huì)使層與層之間的耦合度過高,如TeacherSchemeService和TrainingSchemeService都會(huì)依賴PartTimeTeacherDAO,同時(shí)也各自包含獨(dú)立依賴的其他模塊。保持過多的數(shù)據(jù)連接會(huì)加重?cái)?shù)據(jù)庫和系統(tǒng)的負(fù)擔(dān),影響系統(tǒng)性能。
針對(duì)存在的問題,使用Spring AOP將數(shù)據(jù)填充及事務(wù)處理橫切關(guān)注點(diǎn)分離出來,作為切面織入生成診斷方案和輸出改進(jìn)報(bào)告之間的連接點(diǎn)。切面模塊的定義應(yīng)該滿足細(xì)粒度,以提高模塊的復(fù)用率,如師資數(shù)據(jù)填充切面應(yīng)分為SeniorTitleAspect,IntermediateTitleAspect,PrimaryTitleAspect和PartTimeTeacherAspect,這樣可以保證這些切面能供多個(gè)改進(jìn)方案填充數(shù)據(jù)使用,再將切面類交由Spring IOC容器管理,在運(yùn)行時(shí)動(dòng)態(tài)織入匹配的切點(diǎn)處,如圖2所示。分離出橫切關(guān)注點(diǎn)后,生成方案業(yè)務(wù)層作為核心邏輯不再與數(shù)據(jù)填充邊緣邏輯直接交互,由切面模塊充當(dāng)中間件負(fù)責(zé)提取數(shù)據(jù)并填充。切面的透明性使其便于移植,系統(tǒng)層次清晰,在不改變系統(tǒng)總體結(jié)構(gòu)的前提下解決了緊耦合的數(shù)據(jù)填充問題。
2.2 分離關(guān)注點(diǎn)
分離橫切關(guān)注點(diǎn)即在原有模塊的設(shè)計(jì)基礎(chǔ)之上,將核心業(yè)務(wù)模塊中的相同需求點(diǎn)處的邊緣邏輯分離出來。以師資隊(duì)伍建設(shè)診斷和實(shí)訓(xùn)基地建設(shè)診斷為例,師資隊(duì)伍建設(shè)診斷方案需要分別獲取具備高級(jí)職稱、中級(jí)職稱、初級(jí)職稱和企業(yè)兼職教師隊(duì)伍建設(shè)情況,而實(shí)訓(xùn)基地建設(shè)診斷方案需要分別獲取校內(nèi)基地、校外基地、及校內(nèi)教師和企業(yè)兼職教師隊(duì)伍情況,如圖3所示。診改系統(tǒng)根據(jù)診斷方案及填充的數(shù)據(jù)輸出改進(jìn)報(bào)告,然而系統(tǒng)并不關(guān)心數(shù)據(jù)是從何處獲取或是如何填充到方案中,所以數(shù)據(jù)填充對(duì)于診斷方案及報(bào)告的生成就屬于邊緣邏輯,應(yīng)該分離。對(duì)于像企業(yè)兼職教師數(shù)據(jù)填充這樣的模塊,會(huì)被多個(gè)不同的診斷方案使用,所以應(yīng)當(dāng)在系統(tǒng)上下文(Context)中共享實(shí)例,運(yùn)用單例模式能夠較好地解決這類問題。
2.3 切面設(shè)計(jì)
不同于AspectJ框架,Spring AOP并沒有為切面引入新的設(shè)計(jì)語言,使用帶注解@Aspect的標(biāo)準(zhǔn)POJO類就可以完成切面,避免了切面的高侵入性。根據(jù)系統(tǒng)分析可知數(shù)據(jù)填充模塊具有一些通用的操作,如建立到數(shù)據(jù)源的連接,所以首先建立通用數(shù)據(jù)填充模塊,然后根據(jù)所需數(shù)據(jù)的粒度去泛化該通用模塊。填充數(shù)據(jù)的動(dòng)作需要在輸出診斷報(bào)告之前完成,所以使用前置通知織入診斷輸出模塊較為合適。Spring AOP在切面類中使用帶@Before注解的方法即可完成前置通知的實(shí)現(xiàn)。以教學(xué)資源建設(shè)中的網(wǎng)絡(luò)課程建設(shè)為例,需要獲取網(wǎng)絡(luò)課程建設(shè)的數(shù)據(jù)并填充,其核心程序代碼如下:
@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 織入配置
切面完成之后,就可以按規(guī)則將切面織入到特定的切點(diǎn)中。Spring AOP是依賴動(dòng)態(tài)代理機(jī)制實(shí)現(xiàn)的,只支持基于方法攔截的織入。使用基于AspectJ的注解方式配置切點(diǎn),則切點(diǎn)就是一個(gè)添加了注解@Pointcut的類方法,方法名即為切點(diǎn)的標(biāo)識(shí)名,因此節(jié)點(diǎn)的可訪問性等同于方法的可訪問性。對(duì)于只用于特定業(yè)務(wù)類中的切面,則可以將其切點(diǎn)放置在該切面類中,如SeniorTitleAspect只在TeachingStaffService業(yè)務(wù)類中填充數(shù)據(jù),故將切點(diǎn)@Pointcut(“com.diag.services.TeachingStaffService.generateReportPart()”)置于SeniorTitleAspect切面類中。對(duì)于具有通用性的切面,則可以將這些切面的切點(diǎn)統(tǒng)一放置于一個(gè)系統(tǒng)類SystemUtilPointcut中方便調(diào)用。
這樣系統(tǒng)在運(yùn)行時(shí),TeachingStaffService,Teaching
ResService等業(yè)務(wù)模塊可以專注于診斷報(bào)告的生成,而不需要關(guān)注數(shù)據(jù)的獲取及填充等非核心業(yè)務(wù),從而實(shí)現(xiàn)了數(shù)據(jù)填充邊緣邏輯的分離。
3 結(jié) 語
教學(xué)診改系統(tǒng)應(yīng)用Spring AOP解決了數(shù)據(jù)填充邊緣邏輯與主邏輯分離的問題,使數(shù)據(jù)填充功能對(duì)于主邏輯是透明的。聲明式的編程方式使程序結(jié)構(gòu)清晰、層次分明,利于系統(tǒng)的維護(hù)和擴(kuò)展。使用Spring AOP框架需要多加注意的是,系統(tǒng)的主邏輯模塊和邊緣邏輯模塊都需要由Spring IOC容器管理,若系統(tǒng)中存在非容器創(chuàng)建的實(shí)例且與模塊形成依賴關(guān)系,則可能導(dǎo)致邏輯不可控甚至系統(tǒng)崩潰。所以使用Spring AOP框架時(shí),須在系統(tǒng)設(shè)計(jì)階段理清模塊間的依賴關(guān)系,與主邏輯或邊緣邏輯具有依賴關(guān)系時(shí)必須交由容器管理。
參考文獻(xiàn)
[1] 李曉燕.高職院校教學(xué)診斷與改進(jìn)工作芻議[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] 劉海.教學(xué)診斷與改進(jìn):職業(yè)院校質(zhì)量提升的內(nèi)生動(dòng)力[J].職業(yè)技術(shù)教育,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系統(tǒng)權(quán)限設(shè)計(jì)與實(shí)現(xiàn)[J].現(xiàn)代電子技術(shù),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技術(shù)的重構(gòu)方法研究與實(shí)現(xiàn)[J].小型微型計(jì)算機(jī)系統(tǒng),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] 孟凡新,張京軍,劉光遠(yuǎn).基于AOP和Web服務(wù)的多層分布式系統(tǒng)[J].計(jì)算機(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的企業(yè)應(yīng)用開發(fā)技術(shù)[J].計(jì)算機(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的實(shí)時(shí)系統(tǒng)關(guān)注點(diǎn)分離方法[J].計(jì)算機(jī)工程與設(shè)計(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.