`
luotuoass
  • 浏览: 637080 次
文章分类
社区版块
存档分类
最新评论

Spring框架与AOP思想的研究与应用

 
阅读更多

Spring框架与AOP思想的研究与应用<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

来源:中国论文下载中心[ 08-05-06 10:11:00 ]作者:梁琳 许向众

摘要本文对Spring框架中所包含的AOP思想以及事务管理进行了分析,并通过对一个业务对象实现加锁/解锁的操作,说明了动态代理模式的可行性与有效性。

关键词AOP;横切关注点;控制反转;动态代理

0引言

AspectOrientedProgramming(AOP)是近年来计算机技术中比较热门的话题之一。其发展历史从学术领域和研发机构的运用开始,目前流行的Spring应用程序框架将AOP思想融入了整个框架的设计开发与应用当中。使用Spring框架固然给我们的编程带来了好处与便利,但是同时存在着一个问题,对于初学者来说,所谓的控制反转,不是一个能够望文生义的好名称,依赖注入也是一样,也正是因为这样,不少初学者很难在短时间内理解和掌握这些名字和他们的用法,而要使用AOP的功能也需要理解AOP,也比较难。基于以上原因,我们就会想到,能否简单地将Spring框架中运用到的优秀的理念,巧妙的运用到我们需要使用的地方,而又绕过不容易上手的Spring框架,做到一举两得呢?本文就将围绕着上述提出的问题给出作者的看法和观点。

1AOP思想与面向方面的编程

AOP实际是GoF四人组设计模式的一种扩展,设计模式所追求的是降低代码之间的耦合度,增加程序的灵活性和可重用性,AOP实际上就是设计模式所追求的目标的一种实现。所谓的分离关注就是将某一通用的需求功能从不相关的类之中分离出来;同时,能够使得很多类共享一个行为,一旦行为发生变化,不必修改很多类,只要修改这个行为就可以。AOP就是这种实现分散关注的编程方法,它将关注封装在方面中。

面向对象的编程(OOP)方法是在面向过程的编程方法基础上进行的改进,而面向方面编程(AOP)方法又是在面向对象编程(OOP)方法的基础上进行改进而来的一种创新的软件开发方法。AOPOOP虽然在字面上十分相似,但是却是面向不同领域的两种设计思想。OOP(面向对象编程)针对问题领域中以及业务处理过程中存在的实体及其属性和操作进行抽象和封装,面向对象的核心概念是纵向结构的,其目的是获得更加清晰高效的逻辑单元划分;而AOP则是针对业务处理过程中的切面进行提取,例如,某一个操作在各个模块中都有涉及,这个操作就可以看成横切存在于系统当中。在许多情况下,这些操作都是与业务逻辑相关性不强或者不属于逻辑操作的必须部分,而面向对象的方法很难对这种情况做出处理。AOP则将这些操作与业务逻辑分离,使程序员在编写程序时可以专注于业务逻辑的处理,而利用AOP将贯穿于各个模块间的横切关注点自动耦合进来。AOP所面对的是处理过程中的某个步骤或阶段,对不同的阶段领域加以隔离,已获得逻辑过程中各部分之间低耦合性的隔离效果,其与面向方面编程在目标上有着本质的差异。AOP的核心思想就是将应用程序中的业务逻辑处理部分同对其提供支持的通用服务,即所谓的横切关注点进行分离,这些横切关注点贯穿了程序中的多个纵向模块的需求。

使用AOP机制进行开发,首先要对方面进行了解,将需求分解成一般关注点和横切关注点,即将核心模块级的关注点和系统级的横切关注点分离;然后各自独立的实现这些关注点;最后用工具将业务逻辑代码和横切关注点代码编织到一起,形成最终的程序。通过面向方面的编程可以减少编码时间和重复。

2.目前已经形成的Spring框架

2.1Spring框架的特点

Spring框架目前如此流行,一方面的原因在于Spring提供了一套全面并且十分成熟的轻型应用程序基本框架,并且对复杂的应用开发提供了有力的支持。除此之外,从实际应用开发角度来看,Spring最大的优势在于它是从实际项目开发经验中抽取的,其提供了丰富的类库,可大大节省编码量,它是一种高效的、可高度重用的应用框架。Spring框架中目前最吸引人也是该应用框架最具特色的地方就是名为控制反转(IOC=InverseOfControl)或者依赖注入(DI=DependenceInjection)的设计思想,这是一种相当优秀的设计思想,即好莱坞原则:不用你主动来找我,我会通知你。但是,仅仅凭借着这样一个单纯的设计模式并不能使得Spring如此成功,Spring最成功的地方,还是目前使用最为广泛的AOP应用,也就是Spring中基于AOP实现的业务管理机制,也正是由于这一点,使得SpringAOP成为应用框架中极其闪光的一个亮点。

2.2AOP思想在Spring框架中的体现

文章前面已经讲述了AOP的概念以及什么叫做所谓的横切关注点,事务管理就是J2EE应用中一个横切多个对象的横切关注点的例子。

<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" /><chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899"><span lang="EN-US" style="FONT-FAMILY: ˎ̥; mso-bidi-font-size: 10.5pt">2.2.1</span></chsdate>事务管理

对于J2EE应用程序而言,事务的处理一般有两种模式:依赖特定事务资源的事务处理与依赖容器的参数化事务管理。在这里我们略去对第一种处理方式的说明,直接对第二种方式,即依赖容器的参数化事务管理来阐述笔者的观点。

Spring事务管理究竟能带给我们什么?

了解Spring的人们都知道,对于传统的基于事务资源的事务处理而言,Spring并不会产生什么影响,我们照样可以成功编写并且运行这样的代码。

对于依赖容器的参数化事务管理而言,Spring则可以用来帮助实现对事务的管理而无须使用EJBSpring本身也是一个容器,只是相对EJB容器所要付出的代价而言,Spring属于轻量级容器,它能够替代EJB,通过使用AOP来提供声明式事务管理,即可通过Spring实现基于容器的事务管理(从本质上来讲,Spring的事务管理是基于动态AOP)。SpringEJB最大的区别在于:第一,Spring可以为任意的JavaClass实现事务管理而无须转换成标准的EJB;第二,Spring事务管理并不依赖特定的事务资源从而使得系统的应用与部署更佳灵活。

<chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899"><span lang="EN-US" style="FONT-FAMILY: ˎ̥; mso-bidi-font-size: 10.5pt">2.2.2</span></chsdate>动态代理机制的实现

Spring框架中所提供的AOP支持,是基于动态AOP机制实现的,即通过动态Proxy模式,在目标对象的方法调用前后插入相应的处理代码。AOP代理可以是基于JDK动态代理,也可以是基于CGLIB代理。Spring默认使用的是基于JavaDynamicProxy模式实现,这样任何的接口都能被代理。基于Spring框架的应用程序开发,程序员会有一种自然的倾向性来实现面向接口编程而不是类,业务对象通常也是实现一个或者多个接口,这也是一种良好的编程习惯。Spring也可以基于CGLIB实现AOP代理,这样所代理的是类而不是接口。如果一个业务对象没有实现某一个接口,那么CGLIB将被使用。

我们先来分析一下Spring事务管理机制的实现原理。由于Spring内置AOP默认使用动态代理模式实现,我们就先来分析一下动态代理模式的实现方法。动态代理模式的核心就在于代码中不出现与具体应用层相关联的接口或者类引用,如上所说,这个代理类适用于任何接口的实现。下面我们来看一个例子。

publicclassTxHandlerimplementsInvocationHandler{
privateObjectoriginalObject;
publicObjectbind(Objectobj){
this.originalObject=obj;
returnProxy.newProxyInstance(
obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
this);
}
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)
throwsThrowable{
Objectresult=null;
if(!method.getName().startsWith("save")){
UserTransactiontx=null;
try{
tx=(UserTransaction)(
newInitialContext().lookup("java/tx")
);
result=method.invoke(originalObject,args);
tx.commit();
}catch(Exceptionex){
if(null!=tx){
try{
tx.rollback();
}catch(Exceptione){
}
}
}
}else{
result=method.invoke(originalObject,args);
}

returnresult;
}
}
下面我们来分析一下上述代码的关键所在。
首先来看一下这段代码:
returnProxy.newProxyInstance(
obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
this);
java.lang.reflect.Proxy.newProxyInstance方法
根据传入的接口类型(obj.getClass.getInterfaces())动态构造一个代理类实例返回,这也说明了为什么动态代理实现要求其所代理的对象一定要实现一个接口。这个代理类实例在内存中是动态构造的,它实现了传入的接口列表中所包含的所有接口。
再来分析以下代码:
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)
throwsThrowable{
……
result=method.invoke(originalObject,args);
……
returnresult;
}
InvocationHandler.invoke
方法将在被代理类的方法被调用之前触发。通过这个方法,我们可以在被代理类方法调用的前后进行一些处理,如代码中所示,InvocationHandler.invoke方法的参数中传递了当前被调用的方法(Method,以及被调用方法的参数。同时,可以通过method.invoke方法调用被代理类的原始方法实现。这样就可以在被代理类的方法调用前后写入任何想要进行的操作。
Spring
的事务管理机制实现的原理,就是通过这样一个动态代理对所有需要事务管理的Bean进行加载,并根据配置在invoke方法中对当前调用的方法名进行判定,并在method.invoke方法前后为其加上合适的事务管理代码,这样就实现了Spring式的事务管理。Spring中的AOP实现更为复杂和灵活,不过基本原理是一致的。
3.AOP
思想与动态代理模式的应用实例
综上我们分析了Spring框架的事务管理机制的基本现实原理。尽管Spring框架集中体现了当前流行框架中未曾关注到的一些内容,但是,Spring框架存在晦涩难懂的致命问题。以上通过对Spring框架的一些基本实现原理的研究,给我们带来了一些启示。我们如果不直接使用庞大的Spring框架,而是将融入Spring框架中的AOP思想直接应用于程序中,既绕过了Spring框架这个高门槛,又利用了Spring框架中先进的设计理念,这样便达到了一举两得的目的。
下面我们来看一段代码,我们来编写一个DynamicProxybasedAOP实现的实例。假设现在有一个UserDao接口和以及其实现类UserDaoImp
UserDAO.java:
publicinterfaceUserDAO{
publicvoidsaveUser(Useruser);
}
UserDAOImp.java:
publicclassUserDAOImpimplementsUserDAO{
publicvoidsaveUser(Useruser){
……
}
}
我们需要在saveUser方法中添加对一个业务对象的锁,比如在saveUser前后加锁和解锁。在不影响外部逻辑和不对现有的代码做任何改动的前提下,代理模式是一个不错的选择。但是如果有多个类似的接口,面对每个接口都要实现一个类似的Proxy,实在是一个烦琐无味的苦力过程。回想一下Spring在处理这个问题上的设计理念我们不难想到,使用动态代理模式,是这个问题的一个聪明的解决方法。
publicclassAOPHandlerimplementsInvocationHandler{
privatestaticLoglogger=LogFactory.getLog(AOPHandler.class);
privateListinterceptors=null;
privateObjectoriginalObject;
publicObjectbind(Objectobj){
this.originalObject=obj;
returnProxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces().this);
}
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{
Objectresult=null
if(method.getName.startsWith(“saveUser”)){
lock();
result=method.invoke(this.originalObject,args);
unlock();
}
returnresult;
}
privatevoidlock(){
logger.info(“lockobject!”);
}
privatevoidunlock(){
logger.info(“unlockobject!”);
}
}
上述代码中并没有出现与具体应用层相关联的接口以及类的引用,所以对所有的类都适用。这就解决了用静态Proxy类实现所产生的弊端。
4.总结
与展望
以上我们讨论了Spring框架基于动态AOP机制实现以及动态代理机制的应用,围绕着AOP的实现与应用,一直有一个热门的话题,即权限管理。Spring框架目前AOP的支持做得相当出色,但是一直有一个尴尬的问题尚未解决,那就是目前还没有一个完备的权限管理组件。仔细想想,这并不是AOP的瓶颈,而是因为权限管理的形式过于灵活和复杂多变,系统中的权限管理逻辑多种多样各不相同,我们很难做出一个统一的管理与操作。另一方面,权限管理作为一个独立的切面显得过于庞大,需要进一步切分设计,设计过程复杂,实现难度较大。所以我们还在期待着AOP思想在权限管理方面能有突破性的应用与扩展。

参考文献
1.MartinFowler
撰文.透明编译.Ioc容器和DependencyInjection模式,20022
2.GraigWalls,RyanBreidenbach.SpringinAction,ManningPublicationCo.2003
2
3.
阎宏.Java与模式》,北京:电子工业出版社,200210
4.Spring-java/j2eeApplicationFrameworkreference,Spring
中文论坛
5.HantsyBai
SpringQuickStart.2002.6

分享到:
评论

相关推荐

    Spring框架研究与探讨

    本文对Spring框架中所包含的AOP思想以及事务管理进行了分析,并通过对一个业务对象实现加锁/解锁的操作,说明 了动态代理模式的可行性与有效性。 Aspect Oriented Programming(AOP)是近年来计算机技术中比较...

    进击的编程思想!带你学Spring AOP核心编程思想教程 新角度学面向切面编程

    Spring AOP 是基于 AOP 编程模式的一个框架,它的使用有效减少了系统间的重复代码,达到了模块间的松耦合目的。AOP 的全称是“Aspect Oriented Programming”,即面向切面编程,它将业务逻辑的各个部分进行隔离,使...

    Spring技术内幕:深入解析Spring架构与设计原理

    你不仅能从本书中参透Spring框架的出色架构和设计思想,还能从Spring优雅的实现源码中一窥Java语言的精髓。本书在开篇之前对Spring的设计理念和整体架构进行了全面的介绍,能让读者从宏观上厘清Spring各个功能模块...

    深入解析Spring架构与设计原理

    你不仅能从本书中参透Spring框架的优秀架构和设计思想,还能从Spring优雅的实现源码中一窥Java语言的精髓。本书在开篇之前对Spring的设计理念和整体架构进行了全面的介绍,能让读者从宏观上厘清Spring各个功能模块...

    Spring技术内幕:深入解析 Spring架构与设计原理.pdf

    你不仅能从本书中参透Spring框架的优秀架构和设计思想,还能从Spring优雅的实现源码中一窥Java语言的精髓。本书在开篇之前对Spring的设计理念和整体架构进行了全面的介绍,能让读者从宏观上厘清Spring各个功能模块...

    Spring技术内幕:深入解析Spring架构与设计原理(第2部分)

    你不仅能从木书中参透Spring框架的优秀架构和设计思想,而且还能从Spring优雅的实现源码中一窥Java语言的精髓。此外,《Spring技术内幕:深入解析Spring架构与设计原理》还展示了阅读源代码的卓越方法,不仅授你以鱼...

    Spring.NET框架参考文档

    Spring.NET以Java版的Spring框架为基础,将Spring.Java的核心概念与思想移植到了.NET平台上。企业级应用一般由多个物理层组成,每个物理层也经常划分为若干功能层。不同层次之间需要相互协作,例如,业务服务层一般...

    Spring详细学习资料下载

    1 什么是spring ? Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的 ... 高度开放性:Spring并不完全依赖于Spring,开发者可自由选用Spring框架的部分或全部,它的架构仍然是内在稳定的

    Spring技术内幕:深入解析Spring架构与设计原理(第2版)

    你不仅能从《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》中参透Spring框架的优秀架构和设计思想,还能从Spring优雅的实现源码中一窥Java语言的精髓。《Spring技术内幕:深入解析Spring架构与设计原理...

    Spring高级之注解驱动开发视频教程

    Spring框架是一系列应用框架的核心,也可以说是整合其他应用框架的基座。同时还是SpringBoot的基础。在当下的市场开发环境中,Spring占据的地位是非常高的,基本已经成为了开发者绕不过去的框架了。它里面包含了...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版) 决战大数据时代!IT技术人员不得不读! 计文柯 著

    你不仅能从本书中参透Spring框架的出色架构和设计思想,还能从Spring优雅的实现源码中一窥Java语言的精髓。本书在开篇之前对Spring的设计理念和整体架构进行了全面的介绍,能让读者从宏观上厘清Spring各个功能模块...

    Spring基础与快速入门

    所谓非侵入式是指Spring框架的API不会在业务逻辑上出现,也就是说我们的业务逻辑应该是纯净的,不能出现与业务逻辑无关的代码。首先针对应用而言,这样我们才能将业务逻辑从当前应用中剥离出来,从而在其他的应用中...

    SPRING3技术内幕

    你不仅能从木书中参透Spring框架的优秀架构和设计思想,而且还能从Spring优雅的实现源码中一窥Java语言的精髓。此外,《Spring技术内幕:深入解析Spring架构与设计原理》还展示了阅读源代码的卓越方法,不仅授你以鱼...

    Spring技术内幕:深入解析Spring架构与设计原理 1/2

    你不仅能从木书中参透spring框架的优秀架构和设计思想,而且还能从spring优雅的实现源码中一窥java语言的精髓。此外,本书还展示了阅读源代码的卓越方法,不仅授你以鱼,而且还授你以渔!..  如果你以一种淡定的心态...

    Spring技术内幕:深入解析Spring架构与设计原理(第1部分)

    你不仅能从木书中参透Spring框架的优秀架构和设计思想,而且还能从Spring优雅的实现源码中一窥Java语言的精髓。此外,《Spring技术内幕:深入解析Spring架构与设计原理》还展示了阅读源代码的卓越方法,不仅授你以鱼...

    Spring技术内幕:深入解析Spring架构与设计原理(第一部分)

    你不仅能从木书中参透Spring框架的优秀架构和设计思想,而且还能从Spring优雅的实现源码中一窥Java语言的精髓。此外,《Spring技术内幕:深入解析Spring架构与设计原理》还展示了阅读源代码的卓越方法,不仅授你以鱼...

    SPRING技术内幕:深入解析SPRING架构与设计原理

    你不仅能从本书中参透Spring框架的优秀架构和设计思想,还能从Spring优雅的实现源码中一窥Java语言的精髓。本书在开篇之前对Spring的设计理念和整体架构进行了全面的介绍,能让读者从宏观上厘清Spring各个功能模块...

    Spring技术内幕:深入解析Spring架构与设计原理(第2版)

    你不仅能从《Spring技术内幕:深入解析Spring架构与设计原理(第2版)》中参透Spring框架的优秀架构和设计思想,还能从Spring优雅的实现源码中一窥Java语言的精髓。 《Spring技术内幕:深入解析Spring架构与设计...

Global site tag (gtag.js) - Google Analytics