spring事物控制的初步假设

来源:互联网 发布:prize软件百度云 编辑:程序博客网 时间:2024/05/21 05:04
我们假设spring的事物控制其实是动态代理类和ivoke执行方法,并在invoke对应的方法前加入打开事物的步骤,在后面执行commit。我写了如下的代码来模仿整个过程。对这个代码先简要介绍下,AopFactory工厂类用来生成代理类。MyHandler是处理类,工厂类调用他来生成所需的代理类。SutdentService 和StudentServiceImpl就是接口和要被代理的类。package test;import org.apache.log4j.Logger;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;import java.lang.reflect.Method;public class MyHandler implements InvocationHandler{private Object proxyObj;private static Logger log=Logger.getLogger(MyHandler.class);public Object bind(Object obj){this.proxyObj=obj;returnProxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);}public Object invoke(Object proxy,Method method,Object[] args)throws Throwable{Object result=null;try{//请在这里插入代码,在方法前调用
log.info("打开事物");
result=method.invoke(proxyObj,args); //原方法//请在这里插入代码,方法后调用
log.info("关闭事物");
 }catch(Exception e){e.printStackTrace();}return result;}}

service 和dao都实现依赖注入。

而注入的其实由我们的工厂AOPFactory生产的代理类,

关键句:Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);

package test;public interface  StudentInfoService {void findInfo(String studentName);}
任何引用该代理类的方法,都会调用invoke方法,而invoke方法是可以按照我们的意愿写代码的
package test;public class StudentInfoServiceImpl implements StudentInfoService{public void findInfo(String name){System.out.println("执行增删改查");}}

package test;public class AOPFactory {private static Object getClassInstance(String clzName){Object obj=null;try{Class cls=Class.forName(clzName);obj=(Object)cls.newInstance();}catch(ClassNotFoundException cnfe){System.out.println("ClassNotFoundException:"+cnfe.getMessage());}catch(Exception e){e.printStackTrace();}return obj;}public static Object getAOPProxyedObject(String clzName){Object proxy=null;MyHandler handler=new MyHandler();Object obj=getClassInstance(clzName);if(obj!=null) {proxy=handler.bind(obj);}else{System.out.println("Can't get the proxyobj");//throw}return proxy;}}

package test;public class ClientTest {public static void main(String[] args){StudentInfoServicestudentInfo=(StudentInfoService)AOPFactory.getAOPProxyedObject("test.StudentInfoServiceImpl");studentInfo.findInfo("阿飞");}}




整个结果

打开事物

执行增删改查

关闭事物