Java中处理事务的代理Proxy模式
我们知道,在Hibernate中除开查询数据之外.对数据库进行,添加,修改,删除数据的时,需要对事务的手动提交.
在session对数据保存数据时,都需要手动开启事务,这样的操作非常的繁琐.
所以,我们决定使用Proxy类.去帮助我们处理,这样的操作.
?
Transaxtion tx = session.beginTransaction();
session.save(obj);
tx.commit();
?
?
Proxy类,具体的实现如下:
package pack.hibernate.basedao;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import org.hibernate.Session;import org.hibernate.Transaction;import pack.hibernate.sessionfactory.HibernateSessionFactory;/** * 动态代理类; * 必须实现InvocationHandler * @author zhouhaitao * */public class MyProxy implements InvocationHandler{//根据构造方法给业务对象初始化;//代理业务对象private Object service;public MyProxy(Object service){this.service = service;}public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {Session session = HibernateSessionFactory.getSession();Transaction tr = session.beginTransaction();Object obj = null;try {//会自动调用反射方法(调用原来的业务方法)obj = method.invoke(service, args);tr.commit();} catch (Throwable e) { tr.rollback();e.printStackTrace();}return obj;}}?
之后,通过代理工厂负责,创建创建每一个的事务代理的实例.具体代码如下:
package pack.hibernate.basedao;import java.lang.reflect.Proxy;/** * 根据代理类生成业务代理对象; * @author zhouhaitao */public class MyServiceFactory { public static Object getObject(Object service){ //1.service加载器 //2.service实现的接口 //3.代理对象 return Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces(),new MyProxy(service)); }}?
//然后,我们再Struts Action中. 根据UserLoginServiceImpl业务实现类,通过
MyServiceFactory工厂。获得LoginService接口. 则使用这个接口对象.进行操作即可。
?
ILoginService uis=(ILoginService)MyServiceFactory.getObject(new UserLoginServiceImpl());
?
?
?
?
?