一、优化方案:将代理类单独抽取出来封装成为一个代理工厂
package com.mollen.config;
import com.mollen.utils.TransactionManager;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
/**
* @ClassName: BeanFactory
* @Auther: Mollen
* @CreateTime: 2018-11-07 16:00:35
* @Description:
* 方法参数service为需要增强的类对象
*
*/
public class ProxyFactory {
/**
* 1.jdk动态代理事务
* @param service
* @return
*/
public static Object transferUseJdk(final Object service) {
/**
* ClassLoader loader, 真实对象的类加载器
* Class<?>[] interfaces, 真实对象实现的所有接口
* InvocationHandler h 代理对象的处理类
*/
Object proxy = Proxy.newProxyInstance(
service.getClass().getClassLoader(),
service.getClass().getInterfaces(),
new InvocationHandler() {
/**
* 调用代理对象任意方法,InvocationHandler中的invoke()都会执行
* @param proxy 代理对象
* @param method 代理对象调用的方法
* @param args 代理对象调用方法时掺入的参数
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//声明一个事务执行结果
Object obj = null;
try {
//1.开启事务--业务执行之前
TransactionManager.startTransaction();
//2.执行业务--执行业务操作
obj = method.invoke(service, args);
//3.提交事务--业务正常执行
TransactionManager.commitTransaction();
} catch (Exception e) {
//4.回滚事务--业务执行异常
TransactionManager.rollbackTransaction();
e.printStackTrace();
} finally {
//5.关闭连接
TransactionManager.close();
}
return obj;
}
});
return proxy;
}
/**
* 2.cglib动态代理事务1
* @param service
* @return
*/
public static Object transferUseCglib(final Object service) {
//1. 创建cglib的核心对象
Enhancer enhancer = new Enhancer();
//2. 设置产生的代理对象的父类
enhancer.setSuperclass(service.getClass());
//3. 设置调用代理对象的回调函数
enhancer.setCallback(new MethodInterceptor() {
/**
*
* @param proxy 代理对象
* @param method 代理对象执行的方法
* @param args 代理对象调用方法时传入的参数
* @param methodProxy 调用方法的代理对象 一般没什么用
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
Object obj = null;
try {
//1. 在转账业务执行之前 开启事物
TransactionManager.startTransaction();
//2. 执行原有的转账业务
obj = method.invoke(service, args);
//3. 转账业务执行成功-- 提交事物
TransactionManager.commitTransaction();
} catch (Exception e) {
e.printStackTrace();
//4. 转账业务执行失败---回滚事物
TransactionManager.rollbackTransaction();
} finally {
TransactionManager.close();
}
return obj;
}
});
return enhancer.create();
}
/**
* 2.cglib动态代理事务2
* @param service
* @return
*/
public static Object transferUseCglibPlus(final Object service) {
return Enhancer.create(
service.getClass(),
new MethodInterceptor() {
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
Object obj = null;
try {
TransactionManager.startTransaction(); //1.开启事物
obj = method.invoke(service, args); //2. 执行业务
TransactionManager.commitTransaction(); //3. 提交事物
} catch (Exception e) {
TransactionManager.rollbackTransaction(); //4. 回滚事物
e.printStackTrace();
} finally {
TransactionManager.close(); //5. 关闭连接
}
return obj;
}
});
}
}
二、创建测试类:MyTest2.java
package com.mollen.test;
import com.mollen.config.ProxyFactory;
import com.mollen.service.AccountService;
import com.mollen.service.impl.AccountServiceImpl;
import org.junit.Test;
/**
* @ClassName: MyTest2
* @Auther: Mollen
* @CreateTime: 2018-11-07 16:28:15
* @Description:
*/
public class MyTest2 {
private AccountService accountService = new AccountServiceImpl();
private AccountService proxy;
/**
* 1.jdk动态代理事务测试
*/
@Test
public void test01() throws Exception {
proxy = (AccountService)ProxyFactory.transferUseJdk(accountService);
proxy.transfer("aaa", "bbb", 100);
}
/**
* 2.cglib动态代理事务测试1
*/
@Test
public void test02() throws Exception {
proxy = (AccountService)ProxyFactory.transferUseCglib(accountService);
proxy.transfer("aaa", "bbb", 100);
}
/**
* 3.cglib动态代理事务测试2
*/
@Test
public void test03() throws Exception {
proxy = (AccountService)ProxyFactory.transferUseCglibPlus(accountService);
proxy.transfer("aaa", "bbb", 100);
}
}