APP下载

基于AOP的数据填充在教学诊改系统中的应用

2018-07-27郭新东杨华孙瑜

现代电子技术 2018年14期

郭新东 杨华 孙瑜

摘 要: 为了分离教学诊断与改进系统中有关数据填充等大量非系统核心业务的边缘逻辑,提出基于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.