代理-cglib代理

jdk的动态代理只可以为接口去完成操作,而cglib它可以为没有实现接口的类去做代理,也可以为实现接口的类去做代理。

IDB

package com.bjpowernode.proxy;

/**
 * 代理类和目标类都必须使用同一个接口。 
 */
public interface IDB {
    
    int insert();
    int delete();
    int update();
}

OracleDB 

package com.bjpowernode.proxy;

/**
 * 这是一个Oracle数据库相关的操作类
 * 
 * 目标类(委托类)。
 */
public class OracleDB implements IDB{
    public int insert(){
        
        //以下是一个插入操作
        System.out.println("Oracle insert data....");
        try {
            Thread.sleep(526);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return 0;
    }
    
    
    public int delete(){
        
        //以下是一个删除操作
        System.out.println("Oracle delete data....");
        try {
            Thread.sleep(569);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        return 0;
    }
    
    
    public int update(){
        
        //以下是一个更新操作
        System.out.println("Oracle update data....");
        try {
            Thread.sleep(456);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        return 0;
    }
    
}

CglibProxyFactory

public class CglibProxyFactory implements MethodInterceptor {
    //得到目标对象
    private Object target;

    //使用构造方法传递目标对象
    public CglibProxyFactory(Object target) {
        super();
        this.target = target;
    }


    //proxy 是代理对象的引用;method 是目标类中的目标方法;args 是目标类中的目标方法的实参;参数四:需要增强的方法的代理
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        System.out.println("这是增强方法前......");
        Object invoke = methodProxy.invoke(target, args);
        System.out.println("这是增强方法后......");
        return invoke;
    }

}

Test 

import java.lang.reflect.Proxy;

public class Test {

    public static void main(String[] args) {
        
        //创建目标类对象
        IDB db = new OracleDB();
        
        //1.创建Enhancer
        Enhancer enhancer = new Enhancer();
        //2.传递目标对象的class
        enhancer.setSuperclass(db.getClass());
        //3.设置回调操作
        IDB dbProxy = (IDB)enhancer.setCallback(new CglibProxyFactory(db));
        
        
        //通过代理对象中的方法去执行目标对象中的方法。
        dbProxy.insert(); 
        dbProxy.delete(); 
        dbProxy.update();
        
    }

}

 

posted @ 2020-02-27 01:00  Ayan_ayan  阅读(228)  评论(0编辑  收藏  举报