接着前两篇的:
现在结合之前写的简单struts以及transactionManager,完成一个能够通过@Transaction完成事务控制的功能。
我的想法是这样的:
随便写个action类,里面的方法只要加上了@Transaction注解,在里面调用dao的方法,执行的就是事务的处理。如果没加,那就正常处理。
实现原理:
1.将action中的方法进行代理,查看注解,如果需要事务,则添加事务操作。(cglib)
2.写一个TransactionManager,用来控制事务操作。(ThreadLocal)
2.这里用的是mybatis持久层,所以代理了一下他的sqlSession,这个封装在我写的SessionFacoty类中。(Proxy)
看一下几个核心的类:
一、过滤器(前端控制器)
核心方法
private String doAction(HttpServletRequest request, Class clazz,
Method method) {
Object object = this.newTransactionProxyInstance(clazz, method);
this.setParameterToField(request, object);
try {
String returnValue = (String) method.invoke(object, null);
this.setFiledToAttribute(request, object);
return returnValue;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
①.创建代理对象
②.将request参数放入到对象的属性中
③.将属性中的值自动setAttribute到request中
④.返回方法返回值
以上主要的就是第一步,
其他的都容易,2、3步就注意一点:这里使用了cglib代理,所以得到的对象的类getDeclaredFields得不到要的东西,要getSuperClass().getDeclaredFields才能得到想要的属性
private Object newTransactionProxyInstance(Class clazz, Method method) {
Object object = new TransactionActionFactory(clazz, method).newAction();
return object;
}
二.cglib代理<