基于接口动态代理进行事务改造service源码

package cn.myhome.factory;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import cn.myhome.service.ICustomerService;
import cn.myhome.service.impl.CustomerServiceImpl;
import cn.myhome.utils.HibernateUtil;

public class BeanFactory {

	public static ICustomerService getCustomerService() {
		final CustomerServiceImpl customerService = new CustomerServiceImpl();// 真实对象

		// 返回的代理对象
		ICustomerService proxyCs = (ICustomerService) Proxy.newProxyInstance(
				customerService.getClass().getClassLoader(), customerService
						.getClass().getInterfaces(),
				// 增强
				new InvocationHandler() {

					// 事务控制
					@Override
					public Object invoke(Object proxy, Method method,
							Object[] args) throws Throwable {

						Object rtValue = null;// 返回值
						try {
							// 开启事务
							HibernateUtil.beginTransaction();
							// 调用目标方法
							rtValue = method.invoke(customerService, args);
							// 提交
							HibernateUtil.commit();

						} catch (Exception e) {
							// 出现异常事务回滚
							HibernateUtil.rollback();
							e.printStackTrace();
						}
						/*
						 * 关闭,HIbernate的处理, 如果会话绑定在同一线程上,默认必须开启事务。
						 * sesion生命周期,随线程启动而启动,随线程关闭而关闭
						 */
						// 返回值
						return rtValue;
					}
				});

		return proxyCs; // 返回代理对象
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值