• 用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 }

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

  • 相关阅读:
    docker运行jar包
    jQuery动态添加元素并绑定事件
    Ubuntu将软件(Sublime Text 2为例)锁定到启动器
    jQuery实现列表自动滚动
    浅谈css中的position属性
    关于jQuery中.attr()和.prop()的问题
    Python_opencv库
    Python_faker (伪装者)创建假数据
    Python_Tips_dumpload 和 dumpsloads 的区别与联系
    Linux_CentOS 7下Nginx服务器的安装配置
  • 原文地址:https://www.cnblogs.com/ZRJ-boke/p/5987826.html
Copyright © 2020-2023  润新知