基于接口动态代理进行事务改造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; // 返回代理对象
	}

}


你可能感兴趣的:(动态代理冷知识)