zoukankan      html  css  js  c++  java
  • 三、spring——动态代理模式(AOP)

    大神:https://blog.csdn.net/jiankunking/article/details/52143504?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase#%E5%9B%9B%E3%80%81%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86%E6%80%8E%E4%B9%88%E5%AE%9E%E7%8E%B0%E7%9A%84%EF%BC%9F

    大神:https://www.cnblogs.com/gonjan-blog/p/6685611.html

    参考:https://blog.csdn.net/lz1170063911/article/details/79835248

    一、JDK动态代理

    租房为例

    1、定义接口:

    //定义我们需要完成租房的事情
    public interface LetRoom {
        void zf();
    }

    2、定义2个房东,继承租房

    public class FD implements LetRoom{
        @Override
        public void zf() {
            System.out.println("--出租1号楼4层拐角厕所男--");
        }
    }
    public class FD2 implements LetRoom{
        @Override
        public void zf() {
            System.out.println("--出租2号楼2层拐角厕所男--");
        }
    }

    3、定义代理类(中介)

    public class MyInv implements InvocationHandler {
        private LetRoom letRoom;
    
        public LetRoom getLetRoom() {
            return letRoom;
        }
    
        public void setLetRoom(LetRoom letRoom) {
            this.letRoom = letRoom;
        }
    
        //执行改方法就会动态产生代理对象
        public Object getProxy(){
            /**
             *
             *  参数一:保证类型是ClassLoader
             *
             *  参数二:接口的class数组
             *
             *  参数三:参数类型是InvocationHandler即可
             *
             * */
            Object obj = Proxy.newProxyInstance(MyInv.class.getClassLoader(), new Class[]{LetRoom.class}, this);
            return obj;
        }
    
    
        //这个方法就类似于书写中介中的zf()
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            /**
             * proxy:代理对象--中介
             *
             * method:代理对象中的方法
             *
             * args:参数--null;
             *
             * */
            System.out.println("---收取推荐费100元--");
    
            Object invoke = method.invoke(letRoom, args);
    
            System.out.println("---收取管理费费500元--");
            return invoke;
        }
    }

    4、测试(我要租房子了)

    public class Test {
        public static void main(String[] args) {
            MyInv my = new MyInv();
            //设置具体的房东
            my.setLetRoom(new FD2());
            //产生了中介代理对象,动态产生
            LetRoom letroom =(LetRoom) my.getProxy();
            letroom.zf();
            Util.writeProxyClassToHardDisk("E:/$Proxy11.class",new FD2().getClass().getInterfaces() );  //生成class文件,通过反编译查看编译思路
        }
    }

     二、cglib动态代理

    1、定义房东

    public class FD {
        public    void   zf(){
            System.out.println("--出租4号楼1层--");
        }
    }

    2、定义代理类

    public class MethodInv implements MethodInterceptor {
        //产生代理类对象
        public Object getProxy(){
    
            Enhancer en = new Enhancer();
            //类似于之前的接口
            en.setSuperclass(FD.class);
            en.setCallback(this);
            //使整个设置的内容生效
            Object o = en.create();
            return o;
        }
    
    
        @Override
        public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            /**
             * o:被代理对象
             *
             * method:被代理对象的方法
             *
             * objects:参数
             *
             * methodProxy:代理对象中方法
             * */
            System.out.println(method+"---"+objects+"---"+methodProxy);
            System.out.println("--收取管理费100元--");
            //调用真正房东的zf()
            Object o1 = methodProxy.invokeSuper(o, objects);
            System.out.println("--收取管理费500元--");
    
            return o1;
    
        }
    }

    3、测试(我要租房)

    public class Test {
        public static void main(String[] args) {
            MethodInv me = new MethodInv();
            FD fd = (FD) me.getProxy();
            fd.zf();
        }
    }

  • 相关阅读:
    sql ''增删改'' 笔记
    表单
    html基础
    第一本书的总结
    带参
    字符串
    zookeeper入门与实践
    node中间层转发请求
    npm脚本传参问题
    docker入门笔记
  • 原文地址:https://www.cnblogs.com/qiaoxin11/p/13117724.html
Copyright © 2011-2022 走看看