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("阿飞");}}
整个结果
打开事物
执行增删改查
关闭事物
- spring事物控制的初步假设
- spring的事物控制
- spring声明式事物控制的注意事项
- spring事物控制--HibernateTransactionManager
- struts2+hibernate+spring 事物控制
- spring事物控制详细整理
- spring-控制事物回滚
- 浅谈spring aop 控制下的事物 Dk
- 记住事物的控制
- Spring的事物管理
- Spring的事物配置
- Spring的事物管理
- spring的事物实现
- spring事物的传播
- spring的事物配置
- spring的事物管理
- spring里的事物
- spring的事物
- 串口流控制(flow control)
- Android学习资料分享
- HTML设定字符集
- android v8
- error C2440 “static_cast” 无法从“void (__thiscall CPppView )(void)”转换为“LRESULT (__thiscall CWnd )(WPARA
- spring事物控制的初步假设
- 守护进程C实现简单分析
- Linux进程模型总结
- C# 基础之老生常谈——委托
- 西电1232 求斐波拉契数列的后四位
- 为什么丧失了“慢”的能力?
- 正则表达式之概述、测试工具
- HDU 1003 Max Sum - 简单动态规划
- web开发总结