AOP技术在车险业务系统中的应用

时间:2022-05-17 02:17:36

AOP技术在车险业务系统中的应用

摘要:面向方面的编程(AOP)是一种新的编程技术,它弥补了面向对象的编程(OOP)在跨越模块行为上的不足。AOP引进了Aspect,它将影响多个类的行为封装到一个可重用模块中,它允许程序员对横切关注点进行模块化,从而消除了OOP引起的代码混乱和分散问题,增强了系统的可维护性和代码的重用性。该文分析传统权限控制、事务控制的实现方法,并研究了在AOP下权限控制、事务控制的实现方法从而为AOP技术在项目中的应用提供一定的参考。

关键词:AOP;设计模式;权限;事务;车险

中图分类号:TP311文献标识码:A文章编号:1009-3044(2008)34-1770-02

Application on Vehicle Insurance System with AOP

WANG Pei-lin1, TANG Yang2

(1.Department of software, TongJi University, Shanghai 200092, China; 2. The 1ST Department, 91746 Unit, Beijing,102206, China)

Abstract: AOP is a new coding technique, which remedies the shortage of OOP in spanning module behavior. Aspect which affects the behaviors of several classes when they are encapsulated in a repeatable used module is introduced in AOP. It also allows programmers to module the transversely points, which eliminates code confusion and distribution, and enhances the maintainability of system and repeatable use of codes. This paper analyses and studies the way of the privilege controlling, transaction controlling. It can be a reference for application of AOP.

Key Words: AOP; design pattern; privilege; transaction; vehicle insurance

1 引言

车险业务系统项目中,总体架构分为7层,分别是客户层、表现层与控制层、业务服务层、业务逻辑层、数据访问层、数据持久层、数据层,在项目集成方面车险系统要与十几个系统进行交互和集成,因此项目模块之间的低耦合性和可扩展性对后续的开发非常重要,而AOP技术的优点正可以在这些方面发挥优势,所以AOP技术将在项目中的业务逻辑层、数据访问层、数据持久层有着很广泛的应用,对整个系统起很重要的作用,以此把这AOP技术在此项目中的应用作为研究课题。

2 AOP技术的概念以及对传统开发的改造

AOP是Aspect Oriented Programming的缩写,意思是面向方面编程,是一种新兴的编程技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。它可以解决OOP和过程化方法不能够很好解决的横切问题,如:事务、安全、日志等横切关注。当未来系统变得越来越复杂,横切关注点就成为一个大问题的时候,AOP就可以很轻松的解决横切关注点这个问题。

通常,为满足整个企业应用某方面得需求,开发者需要整理出系统的关注点。图1形象地描述了关注点,它能够从AOP Aspect角度看待系统。比如,持久化、日志、应用的业务逻辑通常被认为是应用需要解决的问题。因此,他们通常作为关注点看待。从整个系统角度考虑,它往往是由大量的关注点构成的。

在J2EE应用开发中,我们主要用到AOP的拦截能力,它为我们提供了“在任何对象的方法调用前/后加入自定义行为”的能力,这使得我们可以处理企业应用中的横切关注点,并且仍然保持强类型(不需要改变方法签名)。

3 AOP技术在车险核心业务系统权限控制中的应用

3.1 权限控制的传统实现

在传统的权限实现中我们通常要对每个业务方法实现单独的权限控制,典型的做法如下:

public someFunciton() {

User user = context.getUser();

if (user.canExecuteThisFunction()) {//权限判断

// ...

} else {

throw new PermissionDeniedException();

}

}

这种做法能够将权限的粒度控制到具体的业务方法,因此它的控制能力应该是强大的。可以看到,权限判断部分对于每个方法几乎是独立的。

这种在具体功能前加入权限操作检验的实现方式有很多缺点:

1) 每个功能类都需要相应的权限检验代码,将程序功能和权限检验混淆在一起,存在紧密的耦合性,扩展修改难度大。

2) 以模式为每个功能类实现一个相应的类,虽然解耦了程序功能和权限检验,但是,从某个角色的权限检验这个切面考虑,涉及具体Proxy类太多,扩展修改难度大。

3.2 AOP技术下的实现

有了AOP技术,结合我们工程的技术架构,我们只要在实现业务逻辑的BSH层添加一些有特殊标记的方法,比如把要进行权限控制的方法都以x开头而把含有用户信息的对象做为第一个参数把要过滤权限的功能资源名称做为第二个参数:

public xdoBusinessBsh(IpeContext ipeContext,String functionName,type paras) {

// do your business

}

没有了额外的权限操作,这个业务方法看起来那么清晰自然。将对权限的操作作为一个Advice,并将Advisor关注到所有需要过滤权限的业务方法(就是有特殊标记的方法),然后,剩下的事情就由Spring以及AOP来完成了。通过这样的分离,纵向的一个业务方法被分割为一个更为自然的业务方法和一个关注点。这个关注点写法可能如下:

public class AuthMethodBeforeAdvice {

public void logMethod(JoinPoint jp) throws Exception {

boolean userBool = false;

try {

Class c = jp.getTarget().getClass();

Object[] o = jp.getArgs();

IpeContext ipeContext = (IpeContext) o[0];

String sFunction = o[1].toString();

userBool =userPrivilegeRoleBsh.isFunctionProductRegionOwner(

ipeContext.getBranchId(), ipeContext.getUserId(),

sFunction, o);

//……

} catch (Exception e) {

throw new AuthorizationException("对不起,您操作的数据没有权限");

}

if(userBool == false) throw new AuthorizationException("对不起,您操作的数据没有权限");

}

}

在spring配置文件中首先要注册这个类,然后定义切入点实现对所有符合标准的方法进行权限控制,下面是Spring配置文件的例子:

<beans>

<bean id="theBeforeAdvice" class="mon.authorization.controller.impl.AuthMethodBeforeAdvice"/>

<aop:config>

<aop:pointcut id="authBefore" expression="execution(public * *..*BshImpl.x*(..))"/>

<aop:aspect ref="theBeforeAdvice">

<aop:before pointcut-ref="authBefore" method="logMethod" />

</aop:aspect>

</aop:config>

</bean>

</beans>

这样对于开发人员,只要注意在用到权限控制的时候在方法名称前加一个字符“x”,然后传入相应的参数就能实现,这样的实现方式无论对于降低系统的偶和性还是较低开发人员的开发难度都有非常大的帮助。

4 AOP技术在系统的事务控制中的应用

4.1 传统事务控制的实现

在我们传统的应用开发中事务控制都是在每个方法中实现的,这样每个方法在实现自己的业务逻辑的同时还要关注事务的控制,例如典型的方法的写法如下

try {

conn =DriverManager.getConnection

("jdbc:oracle:thin:@host:1521:SID","username","userpwd";

conn.setAutoCommit(false);//禁止自动提交,设置回滚点

stmt = conn.createStatement();

stmt.executeUpdate(“alter table …”); //数据库更新操作

mit(); //事务提交

}catch(Exception ex) {

ex.printStackTrace();

try {

conn.rollback(); //操作不成功则回滚

}catch(Exception e) {

e.printStackTrace();

}

}

4.2 AOP技术下的实现

AOP技术的引入使事务控制得到了很大的简化,这样只要在spring的配置文件中加入下面的代码:

<bean id="transactionManager"

class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory">

<ref bean="sessionFactory" />

</property>

</bean>

<aop:config>

<aop:advisor advice-ref="txAdvice"

pointcut="execution(public * *..*BshImpl.*)" />

</aop:config>

<tx:advice id="txAdvice" transaction-manager="transactionManager">

<tx:attributes>

<tx:method name="get*" read-only="true" />

<tx:method name="*" />

</tx:attributes>

</tx:advice>

这样开发人员只要在业务服务层(类名以BshImpl为结尾)加入自己关注的业务逻辑实现,系统会自动为该方法加入事务的控制,开发人员就省去了非常多的开发任务,代码也显得非常的简洁。

5 结束语

车险核心业务系统本身是一个非常复杂的系统,他甚至要和十几个系统进行整合,在这样一个复杂的系统中,如果开发人员还要在权限管理和事务控制中花费很大的精力,对系统的开发进度以及系统的性能和整合性带来非常大的问题。AOP技术引进了Aspect,,它允许程序员对横切关注点进行模块化,从而消除了OOP引起的代码混乱和分散问题,增强了系统的可维护性和代码的重用性。利用AOP的拦截能力,它为我们提供了“在任何对象的方法调用前/后加入自定义行为”的能力,这使得我们可以处理企业应用中的权限控制、事务控制等横切关注点,并且仍然保持强类型,解耦了程序功能。

参考文献:

[1] Filman R E.面向方面的软件开发[M].莫倩,译.北京:机械工业出版社,2006.

[2] 罗时飞.Mastering Spring[M].北京:电子工业出版社,2005.

[3] Zieke.Spring AOP框架[EB/OL].(2005-04-18).[2006-07-03]./zieke/.

[4] Glover A.AOP解决紧密耦合的难题(一)[Z].IBM DW,2004

[5] Bonér J.AspectWerkzCdynamic AOP for Java[Z].AOSD, 2004

[6] Shalloway A,Trott J R.设计模式解析(影印版)[M].北京:中国电力出版社,2003.

[7] Horstmann C S,Cormell G.Core Java2, Volume 1―Fundamentals[M].北京:机械工业出版社,2006.

[8] Walls C,Breidenbach R.Spring in Action[M].Greenwich:Manning Publications,2003.

上一篇:计算机网络管理技术研究应用 下一篇:NET验证机制在Web表单验证中的应用研究