Spring框架中所提供的AOP支持,是基于动态AOP机制实现的,即通过动态Proxy模式,在目标对象的方法调用前后插入相应的处理代码。通过动态代理机制,接口都能被代理。
我们先来分析一下Spring事务管理机制的实现原理。由于Spring内置AOP默认使用动态代理模式实现,我们就先来分析一下动态代理模式的实现方法。动态代理模式的核心就在于代码中不出现与具体应用层相关联的接口或者类引用,如上所说,这个代理类适用于任何接口的实现。代码如下(注意:在实际操作中需要在你的applicationContext.xml文件作相应的配置):
MyInvocationHandler.java
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class MyInvocationHandler implements InvocationHandler
{
Object objTarget = null;
//InvocationHandler hander = new InvocationHandler();
public MyInvocationHandler(Object objTarget)
{
this.objTarget = objTarget;
}
public Object invoke(Object objProxy, Method method, Object[] arg2) throws Throwable {
// TODO Auto-generated method stub
Log log = LogFactory.getLog(MyInvocationHandler.class);
log.info(method.getName()+"将被调用!");
Object objValue = arg1.invoke(objTarget,arg2);
return objValue;
}
}
InvocationHandler.invoke方法将在被代理类的方法被调用之前触发。通过这个方法,我们可以在被代理类方法调用的前后进行一些处理,如代码中所示,InvocationHandler.invoke方法的参数中传递了当前被调用的方法(Method),以及被调用方法的参数。同时,可以通过method.invoke方法调用被代理类的原始方法实现。这样就可以在被代理类的方法调用前后写入任何想要进行的操作,即所谓的面向切面。
Spring的事务管理机制实现的原理,就是通过这样一个动态代理对所有需要事务管理的Bean进行加载,并根据配置在invoke方法中对当前调用的方法名进行判定,并在method.invoke方法前后为其加上合适的事务管理代码,这样就实现了Spring式的事务管理。Spring中的AOP实现更为复杂和灵活,不过基本原理是一致的。
未完待续:)........