zoukankan      html  css  js  c++  java
  • 用spring aop实现动态代理的例子

    下面由我来给大家展示用spring aop实现动态代理的例子(电脑打印)

    下面就看一下具体的代码:

    先定义一个打印机的接口

    1 package aop007_ComPrint;
    2 
    3 public interface Print {
    4     
    5     public void ColorPrint();    //彩色打印
    6     public void WhitePrint();    //黑白打印
    7 }

    然后定义两个实现类,分别实现彩色打印和黑白打印

     1 package aop007_ComPrint;
     2 
     3 public class ColorPrint implements Print {
     4 
     5     @Override
     6     public void ColorPrint() {
     7         System.out.println("[核心业务逻辑]我是一台彩色打印机!");
     8         System.out.println("[核心业务逻辑]我主要负责打印彩色资料!");
     9     }
    10 
    11     @Override
    12     public void WhitePrint() {
    13         //System.out.println("[核心业务逻辑]我主要负责打印黑白资料!");
    14     }
    15 
    16 }
     1 package aop007_ComPrint;
     2 
     3 public class WhitePrint implements Print {
     4 
     5     @Override
     6     public void WhitePrint() {
     7         System.out.println("[核心业务逻辑]我是一台黑白打印机!");
     8         System.out.println("[核心业务逻辑]我主要负责打印黑白资料!");
     9     }
    10     
    11     @Override
    12     public void ColorPrint() {
    13         //System.out.println("[核心业务逻辑]我主要负责打印彩色资料!");
    14     }
    15 
    16 }

    再定义一个代理类PrintHandler 实现动态代理打印功能

     1 package aop007_ComPrint;
     2 
     3 import java.lang.reflect.InvocationHandler;
     4 import java.lang.reflect.Method;
     5 import java.util.Date;
     6 
     7 public class PrintHandler implements InvocationHandler {
     8     //目标类型不确定
     9     private Object target;
    10     public PrintHandler(Object target){
    11         this.target = target;
    12     }
    13     /*
    14      * return 返回的是原来目标方法所返回的内容  method 就是要执行的方法
    15      */
    16     @Override
    17     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    18         before();
    19         
    20         // 具体的业务逻辑代码
    21         // Object returnPrintObj = targer.method    //用于解释下面一行代码
    22         Object returnPrintObj = method.invoke(target, args);
    23         
    24         after();
    25         return returnPrintObj;
    26     }
    27     
    28     private void before(){
    29         // 前置任务
    30         System.out.println(new Date());
    31         System.out.println("打印机");
    32         System.out.println("南方it学院提供!");
    33     }
    34     
    35     private void after(){
    36         // 后置任务
    37         System.out.println("学院打印机");
    38         System.out.println("请好好爱护,弄坏你可赔不起的哦!!!");
    39     }
    40 
    41 }

    最后就定义一个测试类TestPrint 用于测试打印的功能

     1 package aop007_ComPrint;
     2 
     3 import java.lang.reflect.InvocationHandler;
     4 import java.lang.reflect.Proxy;
     5 
     6 /*
     7  * 增加一个【动态代理类】,类似与明星的经纪人
     8  * 把核心的业务逻辑的代码 和 非核心的 分离
     9  * 把非核心的代码交给经纪人(proxy)去管理,
    10  * 注意:经纪人和要明星,必须实现同一个接口
    11  */
    12 public class TestPrint {
    13 
    14     public static void main(String[] args) {
    15         //第一步:创建目标实现类的实例
    16         Print cPrint = new ColorPrint();
    17         Print wPrint = new WhitePrint();
    18         
    19         //第二步:创建一个动态代理类(CEO 首席执行官)
    20         InvocationHandler cPrintHandler = new PrintHandler(cPrint);
    21         InvocationHandler wPrintHandler = new PrintHandler(wPrint);
    22         
    23         //第三步:创建动态代理(跟静态代理一样,申明的变量仍然是目标的接口)
    24         Print cPrintProxy = (Print) Proxy.newProxyInstance(cPrint.getClass().getClassLoader(),
    25                                                             cPrint.getClass().getInterfaces(),
    26                                                             cPrintHandler);
    27         Print wPrintProxy = (Print) Proxy.newProxyInstance(wPrint.getClass().getClassLoader(),
    28                                                             wPrint.getClass().getInterfaces(),
    29                                                             wPrintHandler);
    30         
    31         cPrintProxy.ColorPrint();   //对比 cPrint.ColorPrint(); [只有核心代码] 运行后的区别
    32         System.out.println("------------------------------");
    33         wPrintProxy.WhitePrint();   //对比 wPrint.WhitePrint(); [只有核心代码] 运行后的区别
    34     }
    35 
    36 }

    到这里就完了,运行结果如下所示:

  • 相关阅读:
    hdu 2602 Bone Collector 01背包
    总结
    类--接口 抽象父类 多态 鸭子类型 格式化方法与析构方法 反射 异常处理 自定义异常 断言
    类--组合 继承 super关键字 面向对象的三大性
    面向对象 名称空间 类与对象
    re正则模块 垃圾回收机制
    常用模块--hashlib hmac:加密 xml xlrd xlwt:excel读|写 configparser subprocess
    常用模块-- random shutil shevle logging sys.stdin/out/err
    常用模块-- time os sys 递归 序列化

  • 原文地址:https://www.cnblogs.com/ZRJ-boke/p/5987826.html
Copyright © 2011-2022 走看看