Spring事务管理机制的实现原理-动态代理
- 格式:pdf
- 大小:68.16 KB
- 文档页数:2
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实 现更为复杂和灵活,不过基本原理是⼀致的。