zoukankan      html  css  js  c++  java
  • 动态代理3之代理工厂实现

    动态代理的深化:承接动态代理2( 对 上级实例进行 深化),也就是 spring 的前身

    (必须掌握)实例:

    文件说明:1.有一个Waiter接口,该接口有一个 server() 、ShouQian()方法

    2.有一个 Waiter接口的实现类,ManWaiter类

    3.一个 测试Test类

         4. 后置增强接口: AfterAdvice 接口

         5.前置增强接口:BeforeAdvice接口

         6. 生成代理对象 的 ProxyFactory类

    1. Waiter.java 接口

    // 服务员

    public interface Waiter {

        // 服务

        public void serve();

        

        //收钱

        public void shouQian();

    }

     

    2. BeforeAdvice.java 接口,前置增强接口

    /**

    * 前置增强

    * @author cxf

    *

    */

    public interface BeforeAdvice {

        public void before();

    }

     

    3. AfterAdvice.java 接口,后置增强接口

    /**

    * @function 后置增强

    * @author not-bug

    *

    */

    public interface AfterAdvice {

        public void after();

    }

     

    4 . ManWaiter.java 类,该类实现了 Waiter接口

    //该类实现了 Waiter 接口

    public class ManWaiter implements Waiter {

        public void serve() {

            System.out.println("服务中...");

        }

        

        public void shouQian() {

            System.out.println("混蛋,给我钱!");

        }

    }

     

    5. ProxyFactory.java 类,用来生成代理对象的类

    /**

    * 它用来生成代理对象

    * 它需要所有的参数

    * * 目标对象

    * * 增强

    * @author cxf

    */

    /**

    * 1. 创建代理工厂

    * 2. 给工厂设置三样东西:

    * * 目标对象:setTargetObject(xxx);

    * * 前置增强:setBeforeAdvice(该接口的实现)

    * * 后置增强:setAfterAdvice(该接口的实现)

    * 3. 调用createProxy()得到代理对象

    * * 执行代理对象方法时:

    * > 执行BeforeAdvicebefore()

    * > 目标对象的目标方法

    * > 执行AfterAdviceafter()

    * @author cxf

    *

    */

    public class ProxyFactory {

        private Object targetObject;//目标对象

        private BeforeAdvice beforeAdvice;//前置增强

        private AfterAdvice afterAdvice;//后置增强

          

        

        /**

         * 用来生成代理对象

         * @return

         */

        public Object createProxy() {

            /*

             * 1. 给出三大参数

             */

            ClassLoader loader = this.getClass().getClassLoader();

            Class[] interfaces = targetObject.getClass().getInterfaces();

            InvocationHandler h = new InvocationHandler() {

                public Object invoke(Object proxy, Method method, Object[] args)

                        throws Throwable {

                    /*

                     * 在调用代理对象的方法时会执行这里的内容

                     */

                    // 执行前置增强

                    if(beforeAdvice != null) {

                        beforeAdvice.before();

                    }

                    

                    Object result = method.invoke(targetObject, args);//执行目标对象的目标方法

                    // 执行后置增强

                    if(afterAdvice != null) {

                        afterAdvice.after();

                    }

                    

                    // 返回目标对象的返回值

                    return result;

                }

            };

            /*

             * 2. 得到代理对象

             */

            Object proxyObject = Proxy.newProxyInstance(loader, interfaces, h);

            return proxyObject;

        }

          

        

        public Object getTargetObject() {

            return targetObject;

        }

        public void setTargetObject(Object targetObject) {

            this.targetObject = targetObject;

        }

        public BeforeAdvice getBeforeAdvice() {

            return beforeAdvice;

        }

        public void setBeforeAdvice(BeforeAdvice beforeAdvice) {

            this.beforeAdvice = beforeAdvice;

        }

        public AfterAdvice getAfterAdvice() {

            return afterAdvice;

        }

        public void setAfterAdvice(AfterAdvice afterAdvice) {

            this.afterAdvice = afterAdvice;

        }

    }

     

    6. Test.java ,测试类

     

    /*

    * 目标是让目标对象和增强都可以切换!

    */

    public class Demo3 {

        @Test

        public void fun1() {

            ProxyFactory factory = new ProxyFactory();//创建工厂

            factory.setTargetObject(new ManWaiter());//设置目标对象

            factory.setBeforeAdvice(new BeforeAdvice() {//设置前置增强

                public void before() {

                    System.out.println("您好不好!");

                }

            });

            

            factory.setAfterAdvice(new AfterAdvice() {//设置后置增强

                public void after() {

                    System.out.println("再见不见!");

                }

            });

            

            Waiter waiter = (Waiter)factory.createProxy();

            //waiter.shouQian();

            waiter.serve();

        }

        

        //转账方法

        public void zhuanZhang() {

            /*

             * 1.

             * 2.

             * 3.

             */

        }

    }

     

    运行结果:

  • 相关阅读:
    不懂区块链?先来看一下这篇
    ZooKeeper 分布式共享锁的实现
    关于 use-default-filters 属性的说明
    MapReduce 入门之一步步自实现词频统计功能
    Spring、SpringMVC、SpringData + JPA 整合详解
    使用 Hadoop 进行语料处理(面试题)
    顺序线性表 ---- ArrayList 源码解析及实现原理分析
    JPA + SpringData 操作数据库 ---- 深入了解 SpringData
    JPA + SpringData 操作数据库原来可以这么简单 ---- 深入了解 JPA
    JPA + SpringData 操作数据库原来可以这么简单 ---- 深入了解 JPA
  • 原文地址:https://www.cnblogs.com/Prozhu/p/5452962.html
Copyright © 2011-2022 走看看