JAVA编程119——事务控制/动态代理/代码优化

一、优化方案:将代理类单独抽取出来封装成为一个代理工厂
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);
    }

}

猜你喜欢

转载自blog.csdn.net/mollen/article/details/83831211