声明式事务功能实现

需要cglib.jar asm.jar

最近在设计一个框架,想实现和spring相同的声明式事务功能,于是研究了一下cglib,cglib好处是针对普通java方法,不需要JDK的动态代理那样一定要实现接口方法。
这样框架就可以对任意java方法进行AOP操作,比如自动的事务管理,见下面代码:

import java.util.ArrayList;
import java.util.List;

import net.sf.cglib.proxy.*;

/**
 * 方法动态代理
 */
public class TransactionProxy implements MethodInterceptor {
    private String methodName = "";
    public Object newInstance(Class clazz ,String methodName){
      try{
       this.methodName = methodName;
       Enhancer e = new Enhancer();
       e.setSuperclass(clazz);
       e.setCallback(this);
       return e.create();
      }catch(Throwable e ){
       e.printStackTrace();
       throw new Error(e.getMessage());
      }
    }
   
    public Object intercept(Object obj, java.lang.reflect.Method method, Object[] args, MethodProxy proxy) throws Throwable {
        Object retValFromSuper = null;
        if(method.getName().equals(methodName)){
         try {
          System.out.println("<======前处理 比如开始事务=========>");
             retValFromSuper = proxy.invokeSuper(obj, args);
             System.out.println("<======后处理 比如提交事务=========>");
         }catch(Throwable t){
             System.out.println("throw "+t);
             throw t.fillInStackTrace();
         }finally{
          System.out.println("<======结束处理 比如结束事务=========>");
         }
        }else{
         retValFromSuper = proxy.invokeSuper(obj, args);
        }
        return retValFromSuper;
    }
   
    public static void main(String[] args){
     List list  = (ArrayList)new TransactionProxy().newInstance(ArrayList.class, "add");//表明只针对add方法进行动态代理
     list.add("测试");
     System.out.println(list.get(0));
    }
   
}

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值