两种代理方式——JDK和CGLIB

方式一:JDK

1.业务逻辑接口和实现类

public interface ForumService {
    void removeTopic(String topicID);
}

实现类:


public class ForumServiceImpl implements ForumService{

    public void removeTopic(String topicId){
        System.out.println("删除ID为"+topicId+"的topic信息");
    }

}

2.切面逻辑类,无关业务


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

/**
 * 纯切面逻辑
 *JDK代理需要切面实现InvocationHandler
 */
public class QieMianHandler implements InvocationHandler {
    private Object target;

    public QieMianHandler(Object target){
        this.target=target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        PerformanceMonitor.begin(target.getClass().getName()+"."+method.getName());
        Object object=method.invoke(target,args);
        PerformanceMonitor.end();
        return object;
    }
}

 


public class PerformanceMonitor {
    private static ThreadLocal<Performance> th=new ThreadLocal<>();
    public static void begin(String method){
        System.out.println("方法开始执行");
        Performance performance=new Performance(method);
        th.set(performance);
    }

    public static void end(){
        System.out.println("方法执行完毕");
        Performance performance=th.get();
        performance.printTotalTime();
    }

}

 


public class Performance {
    private long beginDate;
    private long endDate;
    private String method;

    public Performance(String method){
        this.method=method;
        beginDate=System.currentTimeMillis();
    }

    public void printTotalTime(){
        endDate=System.currentTimeMillis();
        System.out.println(method+"方法一共执行了"+(endDate-beginDate)+"毫秒");
    }

}

3.创建代理类实例

    @org.junit.Test
    public void test2(){
        ForumService forumService=new ForumServiceImpl();
        QieMianHandler qieMian=new QieMianHandler(forumService);
        
        //创建代理实例,并进行方法调用
        ForumService proxy=(ForumService)Proxy.newProxyInstance(forumService.getClass().getClassLoader()
                                ,forumService.getClass().getInterfaces(),qieMian);
        proxy.removeTopic("test_1");

    }

Proxy.newProxyInstance方法的三个参数:1.类加载器,2。为创建代理实例所需要实现的一组接口;3.整合业务逻辑和切面的编织起对象,编织起对象要实现InvocationHandler

以上就是JDK代理技术的简单实现。

 

方式二:

 CGLib代理的实现:需要实现 MethodInterceptor接口

package com.pactera.workflow.test;


import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CglibInterceptor implements MethodInterceptor {

    private Enhancer enhancer=new Enhancer();

    public Object getProxy(Class clzz){
        enhancer.setSuperclass(clzz);
        enhancer.setCallback(this);
        return enhancer.create();
        //下面这种写法是错误的,返回enhancer和enhancer.create()是不一样的
//        return enhancer;

    }


    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        PerformanceMonitor.begin(o.getClass().getName()+"."+method.getName());
        Object obj=methodProxy.invokeSuper(o,objects);
        PerformanceMonitor.end();
        return obj;
    }
}

测试:

  @org.junit.Test
    public void test3(){
        CglibInterceptor cglib=new CglibInterceptor();
        ForumServiceImpl obj=(ForumServiceImpl)cglib.getProxy(ForumServiceImpl.class);
        obj.removeTopic("removeId");
        obj.addTopic("addId");
    }

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值