• 代理-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();
            
        }
    
    }
  • 相关阅读:
    Chapter 14 高级I/O
    UNP总结 Chapter 3 套接字编程简介
    UNP总结 Chapter 1 简介
    Chapter 13 守护进程
    Chapter 17 高级进程间通信
    Chapter 15 进程间通信
    实例详解JSP内置对象
    一个记录程序运行时间表的控件
    .Grove—— .Net下的ORM框架
    .Net 下的Wondows窗体常用项目
  • 原文地址:https://www.cnblogs.com/yangyanbo/p/12370156.html
Copyright © 2020-2023  润新知