• java静态代理、动态代理、cglib代理


    首先定义一个接口:

    public interface AdminControl {
        void find();
        void update();
        void add();
    }

    实现类:

    public class AdminControlImpl implements AdminControl{
        public void find() {
            System.out.println("查询所有管理员信息");
        }
    
        public void update() {
            System.out.println("修改管理员信息");
        }
    
        public void add() {
            System.out.println("增加管理员信息");
        }
    }

    静态代理

    public class AdminControlProxy implements AdminControl{
        private AdminControl adminControl;
        public AdminControlProxy(AdminControl adminControl){
            this.adminControl = adminControl;
        }
        public void find() {
            System.out.println("进入方法find");
            adminControl.find();
            System.out.println("退出方法find");
        }
    
        public void update() {
            System.out.println("进入方法update");
            adminControl.update();
            System.out.println("退出方法update");
        }
    }

    代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强.

    静态代理缺点:

    1.假设系统中需要代理的service过多,那么就会创建很多代理对象

    2.假设代理的service方法改变,那么相应的代理对象也会改变

    动态代理

    • proxy 代理对象
    • method 代理对象调用的方法
    • args 调用的方法中的参数
    public class AdminControlInvocation implements InvocationHandler {
        private Object object;
        public AdminControlInvocation(Object object){
            this.object = object;
        }
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("进入方法"+method.getName());
            Object object = method.invoke(object,args);
            System.out.println("退出方法"+method.getName());
            return object;
        }
    }
    public class AdminMain {
        public static void main(String[] args) {
    
            AdminControlImpl target = new AdminControlImpl();
            AdminControl adminControl = new AdminControlProxy(target);
            AdminControl adminControl = (AdminControl) Proxy.newProxyInstance(AdminControlImpl.class.getClassLoader(),
                    AdminControlImpl.class.getInterfaces(),
                    new AdminControlInvocation(target));
            adminControl.find();
            adminControl.update();
            adminControl.add();
        }
    }

    假设代理的对象没有接口,那么就不能使用动态代理

    cglib代理

    首先引入依赖

    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>3.3.0</version>
    </dependency>

    代码

    public class AdminControlCglibProxy implements MethodInterceptor {
        private Object object;
        public AdminControlCglibProxy(Object object){
            this.object = object;
        }
        public Object getProxyInstance(){
            Enhancer enhancer = new Enhancer();
            // 设置代理类的父类
            enhancer.setSuperclass(target.getClass());
            enhancer.setCallback(this);
            return enhancer.create();
        }
        @Override
        public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            System.out.println("进入方法"+method.getName());
            Object object = method.invoke(object,objects);
            System.out.println("退出方法"+method.getName());
            return object;
        }
    }
    public class AdminMain {
        public static void main(String[] args) {
    
            AdminControlImpl target = new AdminControlImpl();
            AdminControlImpl adminControl = (AdminControlImpl) new AdminControlCglibProxy(target).getProxyInstance();
            adminControl.find();
            adminControl.update();
            adminControl.add();
        }
    }

    对于一个没有接口的类,使用cglib代理,前提,该类必须可以被继承,方法不能为final、static。

    cglib是采用动态创建子类的方法来代理

  • 相关阅读:
    Json对象和字符串互转
    JSNOP调用。。。
    org.hibernate.LazyInitializationException: could not initialize proxy no Session
    myeclipse生成注解实体
    jquery判断浏览器和版本
    JSTL XML标签库
    ORACLE 月份不全,补全月份的sql
    js 上下左右键控制焦点
    google gson使用
    js判断undefined类型
  • 原文地址:https://www.cnblogs.com/FivePointOne/p/13984384.html
Copyright © 2020-2023  润新知