没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
50页
本文对Spring框架中所包含的AOP思想以及事务管理进行了分析,并通过对一个业务对象实现加锁/解锁的操作,说明<br>了动态代理模式的可行性与有效性。<br> Aspect Oriented Programming(AOP)是近年来计算机技术中比较热门的话题之一。其发展历史从学术领域和研发机构<br>的运用开始,目前流行的Spring应用程序框架将AOP思想融入了整个框架的设计开发与应用当中。使用Spring框架固然给<br>我们的编程带来了好处与便利,但是同时存在着一个问题,对于初学者来说,所谓的“控制反转”,不是一个能够望文生义的<br>好名称,“依赖注入”也是一样,也正是因为这样,不少初学者很难在短时间内理解和掌握这些名字和他们的用法,而要使用<br>AOP的功能也需要理解AOP,也比较难。基于以上原因,我们就会想到,能否简单地将Spring框架中运用到的优秀的理念,<br>巧妙的运用到我们需要使用的地方,而又绕过不容易上手的Spring框架,做到一举两得呢?本文就将围绕着上述提出的问题<br>给出作者的看法和观点。
资源推荐
资源详情
资源评论
Spring 框架研究与探讨
第 1 页 共 50 页
探讨 Spring 框架与 AOP 思想的研究与应用
【摘 要】
本文对 Spring 框架中所包含的 AOP 思想以及事务管理进行了分析,并通过对一个业务对象实现加锁/解锁的操作,说明
了动态代理模式的可行性与有效性。
引言
Aspect Oriented Programming(AOP)是近年来计算机技术中比较热门的话题之一。其发展历史从学术领域和研发机构
的运用开始,目前流行的 Spring 应用程序框架将 AOP 思想融入了整个框架的设计开发与应用当中。使用 Spring 框架固然给
我们的编程带来了好处与便利,但是同时存在着一个问题,对于初学者来说,所谓的“控制反转”,不是一个能够望文生义的
好名称,“依赖注入”也是一样,也正是因为这样,不少初学者很难在短时间内理解和掌握这些名字和他们的用法,而要使用
AOP 的功能也需要理解 AOP,也比较难。基于以上原因,我们就会想到,能否简单地将 Spring 框架中运用到的优秀的理念,
巧妙的运用到我们需要使用的地方,而又绕过不容易上手的 Spring 框架,做到一举两得呢?本文就将围绕着上述提出的问题
给出作者的看法和观点。
AOP 思想与面向方面的编程
AOP 实际是 GoF 四人组设计模式的一种扩展,设计模式所追求的是降低代码之间的耦合度,增加程序的灵活性和可重用
性,AOP 实际上就是设计模式所追求的目标的一种实现。所 谓 的分离关注就是将某一通用的需求功能从不相关的类之中分离出
来;同时,能够使得很多类共享一个行为,一旦行为发生变化,不必修改很多类,只要修改这个行为就可以。AOP 就是这种实
现分散关注的编程方法,它将“关注”封装在“方面”中。
面向对象的编程(OOP)方法是在面向过程的编程方法基础上进行的改进,而面向方面编程(AOP)方法又是在面向对
象编程(OOP)方法的基础上进行改进而来的一种创新的软件开发方法。AOP 和 OOP 虽然在字面上十分相似,但是却是面向
不同领域的两种设计思想。OOP(面向对象编程)针对问题领域中以及业务处理过程中存在的实体及其属性和操作进行抽象和
封装,面向对象的核心概念是纵向结构的,其目的是获得更加清晰高效的逻辑单元划分;而 AOP 则是针对业务处理过程中的
切面进行提取,例如,某一个操作在各个模块中都有涉及,这个操作就可以看成“横切”存在于系统当中。在许多情况下,这
些操作都是与业务逻辑相关性不强或者不属于逻辑操作的必须部分,而面向对象的方法很难对这种情况做出处理。AOP 则将这
些操作与业务逻辑分离,使程序员在编写程序时可以专注于业务逻辑的处理,而利用 AOP 将贯穿于各个模块间的横切关注点
自动耦合进来。AOP 所面对的是处理过程中的某个步骤或阶段,对不同的阶段领域加以隔离,已获得逻辑过程中各部分之间低
耦合性的隔离效果,其与面向方面编程在目标上有着本质的差异。AOP 的核心思想就是将应用程序中的业务逻辑处理部分同对
其提供支持的通用服务,即所谓的“横切关注点”进行分离,这些“横切关注点”贯穿了程序中的多个纵向模块的需求。
Spring 框架研究与探讨
第 2 页 共 50 页
使用AOP 机制进行开发,首先要对方面进行了解,将需求分解成一般关注点和横切关注点,即将核心模块级的关注点和
系统级的横切关注点分离;然后各自独立的实现这些关注点;最后用工具将业务逻辑代码和横切关注点代码编织到一起,形成
最终的程序。通过面向方面的编程可以减少编码时间和重复。
目前已经形成的 Spring 框架
1、Spring 框架的特点
Spring 框架目前如此流行,一 方 面 的 原因在于 Spring 提供了一套全面并且十分成熟的轻型应用程序基本框架,并 且 对 复
杂 的应用开发提供了有力的支持。除此之外,从实际应用开发角度来看,Spring 最大的优势在于它是从实际项目开发经验中抽
取的,其提供了丰富的类库,可大大节省编码量,它是一种高效的、可高度重用的应用框架。Spring 框架中目前最吸引人也是
该应用框架最具特色的地方就是名为控制反转(IOC=Inverse Of Control)或者依赖注入(DI=Dependence Injection)的设
计思想,这是一种相当优秀的设计思想,即“好莱坞”原则:不用你主动来找我,我会通知你。但是,仅仅凭借着这样一个单
纯的设计模式并不能使得 Spring 如此成功,Spring 最成功的地方,还是目前使用最为广泛的 AOP 应用,也就是 Spring 中基
于 AOP 实现的业务管理机制,也正是由于这一点,使得 Spring AOP 成为应用框架中极其闪光的一个亮点。
2、AOP 思想在 Spring 框架中的体现
文章前面已经讲述了 AOP 的概念以及什么叫做所谓的“横切”关注点,事务管理就是 J2EE 应用中一个横切多个对象的
横切关注点的例子。
2.1 事务管理
对于J2EE 应用程序而言,事务的处理一般有两种模式:依赖特定事务资源的事务处理与依赖容器的参数化事务管理。在
这里我们略去对第一种处理方式的说明,直接对第二种方式,即依赖容器的参数化事务管理来阐述笔者的观点。
Spring 事务管理究竟能带给我们什么?
了解 Spring 的人们都知道,对于 传统 的 基于事务资源的事务处理而言,Spring 并不会产生什么影响,我们照样可以成功
编写并且运行这样的代码。
对于依赖容器的参数化事务管理而言,Spring 则可以用来帮助实现对事务的管理而无须使用 EJB。Spring 本身也是一个
容器,只是相对 EJB 容器所要付出的代价而言,Spring 属于轻量级容器,它能够替代 EJB,通过使用 AOP 来提供声明式事务
管理,即可通过 Spring 实现基于容器的事务管理(从本质上来讲,Spring 的事务管理是基于动态 AOP)。Spring 与 EJB 最
大的区别在于:
第一,Spring 可以为任意的 Java Class 实现事务管理而无须转换成标准的 EJB;
第二,Spring 事务管理并不依赖特定的事务资源从而使得系统的应用与部署更佳灵活。
Spring 框架研究与探讨
第 3 页 共 50 页
2.2 动态代理机制的实现
Spring 框架中所提供的 AOP 支持,是基于动态 AOP 机制实现的,即通过动态 Proxy 模式,在目标对象的方法调用前后
插入相应的处理代码。AOP 代理可以是基于 JDK 动态代理,也可以是基于 CGLIB 代理。Spring 默认使用的是基于 Java Dynamic
Proxy 模式实现,这样任何的接口都能被代理。基于 Spirng 框架的应用程序开发,程序员会有一种自然的倾向性来实现面向接
口编程而不是类,业务对象通常也是实现一个或者多个接口,这也是一种良好的编程习惯。Spring 也可以基于 CGLIB 实现 AOP
代理,这样所代理的是类而不是接口。如果一个业务对象没有实现某一个接口,那么 CGLIB 将被使用。
我们先来分析一下 Spring 事务管理机制的实现原理。由于 Spring 内置 AOP 默认使用动态代理模式实现,我们就先来分
析一下动态代理模式的实现方法。动态代理模式的核心就在于代码中不出现与具体应用层相关联的接口或者类引用,如上所说,
这个代理类适用于任何接口的实现。下面我们来看一个例子。
public class TxHandler implements InvocationHandler {
private Object originalObject;
public Object bind(Object obj) {
this.originalObject = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result = null;
if (!method.getName().startsWith("save")) {
UserTransaction tx = null;
try {
tx = (UserTransaction) (new InitialContext().lookup("java/tx"));
result = method.invoke(originalObject, args);
tx.commit();
} catch (Exception ex) {
if (null != tx) {
try {
tx.rollback();
} catch (Exception e) {
}
}
}
} else {
result = method.invoke(originalObject, args);
}
return result;
}
}
下面我们来分析一下上述代码的关键所在。
Spring 框架研究与探讨
第 4 页 共 50 页
首先来看一下这段代码:
return Proxy.newProxyInstance(
obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
java.lang.reflect.Proxy.newProxyInstance 方法根据传入的接口类型(obj.getClass.getInterfaces())动态构造一个代
理类实例返回,这也说明了为什么动态代理实现要求其所代理的对象一定要实现一个接口。这个代理类实例在内存中是动态构
造的,它实现了传入的接口列表中所包含的所有接口。
再来分析以下代码:
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
……
result = method.invoke(originalObject, args);
……
return result;
}
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 框架中先进的设计理念,这样便达到了一举两得的目的。
下面我们来看一段代码,我们来编写一个 Dynamic Proxy based AOP 实现的实例。假设现在有一个 UserDao 接口和以
及其实现类 UserDaoImp。
UserDAO.java:
public interface UserDAO {
Spring 框架研究与探讨
第 5 页 共 50 页
public void saveUser(User user);
}
UserDAOImp.java:
public class UserDAOImp implements UserDAO{
public void saveUser(User user) {
……
}
}
我们需要在 saveUser 方法中添加对一个业务对象的锁,比如在 saveUser 前后加锁和解锁。在不影响外部逻辑和不对现
有的代码做任何改动的前提下,代理模式是一个不错的选择。但是如果有多个类似的接口,面对每个接口都要实现一个类似的
Proxy,实在是一个烦琐无味的苦力过程。回想一下 Spring 在处理这个问题上的设计理念我们不难想到,使用动态代理模式,
是这个问题的一个聪明的解决方法。
public class AOPHandler implements InvocationHandler {
private static Log logger = LogFactory.getLog(AOPHandler.class);
private List interceptors = null;
private Object originalObject;
public Object bind(Object obj) {
this.originalObject = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces().this);
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{Object result=null
if(method.getName.startsWith(“saveUser”)){
lock();
result=method.invoke(this.originalObject,args);
unlock();
}
return result;
}
private void lock(){
logger.info(“lock object!”);
}
private void unlock(){
logger.info(“unlock object!”);
}
}
上述代码中并没有出现与具体应用层相关联的接口以及类的引用,所以对所有的类都适用。这就解决了用静态 Proxy 类
实现所产生的弊端。
总结与展望
以上我们讨论了 Spring 框架基于动态 AOP 机制实现以及动态代理机制的应用,围绕着 AOP 的实现与应用,一 直 有一个
热门的话题,即权限管理。Spring 框架目前对 AOP 的支持做得相当出色,但是一直有一个尴尬的问题尚未解决,那就是目前
剩余49页未读,继续阅读
资源评论
OneMinute
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- week6.1.7z
- 移动机器人自主路径规划之RRTStar算法MATLAB实现代码
- 基于Python+OpenCV+FFmpeg实现自动识别电影剪辑+分析剪辑主题颜色+源码+文档(毕业设计&课程设计&项目开发)
- 基于python的二手商品交易平台 python+django开发的供需平台
- 微信小程序源码 侧滑布局小程序 (源码下载 +内附使用说明)
- heima-JUC-资料
- coreg_FSL.sh
- ROS+YOLOV8+SLAM智能小车导航实战(四、激光雷达+SLAM建图)
- 什么是决策树,有哪些适用场景?
- 基于python开发的口红色号识别程序+源码+开发文档+源码解析(毕业设计&课程设计&项目开发)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功