JavaSE 代理模式

博客介绍了动态代理相关内容,涉及JDKProxy、CGLib、Javassist和ASM等技术。动态代理在信息技术领域有重要应用,这些不同的代理方式各有特点。
/**
 * 代理模式:
 *          主题:接口,公共对外方法,代理类也会实现该主题
 *          原主题实现:被代理实现的业务逻辑
 *          代理主题:封装原主题实现与代理实现。
 *          Client:拼装原主题与代理主题
 */

/**
 * 主题
 */
interface  IDBQuery {
    String request();
}

/**
 * 原主题实现
 */
class  DBquery implements  IDBQuery{
    @Override
    public String request() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return  "request....";
    }

}

/**
 * 代理主题
 */
class  DbQueryProxy implements  IDBQuery{
    /**
     * 采用组合
     * 持有被代理对象与实现统一主题接口
     */
    private  DBquery dbQuery;

    @Override
    public String request() {
        //延迟加载
        if(dbQuery==null) 
            dbQuery = new DBquery();
        return dbQuery.request();
    }

    public DBquery getDbQuery() {
        return dbQuery;
    }

    public void setDbQuery(DBquery dbQuery) {
        this.dbQuery = dbQuery;
    }
}
public class ProxyClient {

    public static void main(String[] args) {

         IDBQuery idbQuery = new DbQueryProxy();
         idbQuery.request()

    }
}

动态代理: JDKProxy,CGLib,Javassist,ASM。

JDKProxy


/**
 * JdkProxy
 *         实现 InvocationHandler
 */
public class JdkDbQueryHandler implements InvocationHandler {
    //被代理对象
    private  IDBQuery idbQuery;

    public IDBQuery getIdbQuery() {
        return idbQuery;
    }

    public void setIdbQuery(IDBQuery idbQuery) {
        this.idbQuery = idbQuery;
    }

    /**
     * 1:代理 做日志
     * 2:方法增强
     * 3:简化操作
     * 4:改变返回实际类型
     * @param proxy 不需要关注
     * @param method  代理方法名,都会执行 如果只代理某个注意判断
     * @param args    原对象调用传递参数,这里可以做更改
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        if(idbQuery==null)
            idbQuery = new DBquery();
        return idbQuery.request();
    }
    /**
     * 得到代理对象
     */
    public  static  IDBQuery getIdbQueryProxy(){
        IDBQuery jdkProxy = (IDBQuery)Proxy.newProxyInstance(
                ClassLoader.getSystemClassLoader(),
                IDBQuery.class.getInterfaces(),new JdkDbQueryHandler()
        );
        return jdkProxy;
    }
}

CGlib:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值