Spring事务管理机制的实现原理-动态代理
来源:互联网 发布:阿里云 机房地址 编辑:程序博客网 时间:2024/05/17 08:49
Spring事务管理机制的实现原理-动态代理 .
之前在做项目中遇到spring无法进行事务代理问题,最后发现是因为没有写接口,原因当时明白了,看到这篇文章写的清楚些,转过来
我们先来分析一下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;
}
}
下面我们来分析一下上述代码的关键所在。
首先来看一下这段代码:
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实 现更为复杂和灵活,不过基本原理是一致的。
- Spring事务管理机制的实现原理-动态代理
- Spring事务管理机制的实现原理-动态代理
- Spring事务管理机制的实现原理-动态代理
- Spring事务管理机制的实现原理-动态代理
- Spring事务管理机制的实现原理
- Spring AOP 的实现原理----动态代理
- Spring的动态代理机制
- 由service层接口有什么用?引申到基于JDK原生和CGLIB动态代理实现spring事务管理的机制的思考
- JAVA的动态代理机制及Spring的实现方式
- JAVA的动态代理机制及Spring的实现方式
- JAVA的动态代理机制及Spring的实现方式
- JAVA的动态代理机制及Spring的实现方式
- Java的动态代理机制和Spring的实现方式
- JAVA的动态代理机制及Spring的实现方式
- Java的动态代理机制及Spring的实现方式
- Java的动态代理机制及Spring的实现方式
- Spring AOP的实现机制(一)----- 动态代理
- Spring AOP的实现——动态代理机制
- 01背包 决策树模型 Python
- itercast.com学习笔记-Linux磁盘及文件系统管理
- STM8S各个模块初始化
- 黑马程序员_String对象
- 673 - Parentheses Balance
- Spring事务管理机制的实现原理-动态代理
- 如何让GCC检查类printf函数的参数
- [Java] 日期处理 04 总结
- IE10和IE9兼容性常见问题解答(FAQ)
- essential C++的复习
- 【踩雷】指针惹的货
- db2设置参数数据及更新
- iOS7 UI改变总结
- 深入了解android平台的jni