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());

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值