欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

利用spring aop实现动态代理

程序员文章站 2024-03-31 17:41:22
下面由我来给大家展示用spring aop实现动态代理的例子(电脑打印) 下面就看一下具体的代码: 先定义一个打印机的接口 package aop007_co...

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

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

先定义一个打印机的接口

package aop007_comprint;

public interface print {
  
  public void colorprint();  //彩色打印
  public void whiteprint();  //黑白打印
}

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

package aop007_comprint;

public class colorprint implements print {

  @override
  public void colorprint() {
    system.out.println("[核心业务逻辑]我是一台彩色打印机!");
    system.out.println("[核心业务逻辑]我主要负责打印彩色资料!");
  }

  @override
  public void whiteprint() {
    //system.out.println("[核心业务逻辑]我主要负责打印黑白资料!");
  }

}
package aop007_comprint;

public class whiteprint implements print {

  @override
  public void whiteprint() {
    system.out.println("[核心业务逻辑]我是一台黑白打印机!");
    system.out.println("[核心业务逻辑]我主要负责打印黑白资料!");
  }
  
  @override
  public void colorprint() {
    //system.out.println("[核心业务逻辑]我主要负责打印彩色资料!");
  }

}

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

package aop007_comprint;

import java.lang.reflect.invocationhandler;
import java.lang.reflect.method;
import java.util.date;

public class printhandler implements invocationhandler {
  //目标类型不确定
  private object target;
  public printhandler(object target){
    this.target = target;
  }
  /*
   * return 返回的是原来目标方法所返回的内容 method 就是要执行的方法
   */
  @override
  public object invoke(object proxy, method method, object[] args) throws throwable {
    before();
    
    // 具体的业务逻辑代码
    // object returnprintobj = targer.method  //用于解释下面一行代码
    object returnprintobj = method.invoke(target, args);
    
    after();
    return returnprintobj;
  }
  
  private void before(){
    // 前置任务
    system.out.println(new date());
    system.out.println("打印机");
    system.out.println("南方it学院提供!");
  }
  
  private void after(){
    // 后置任务
    system.out.println("学院打印机");
    system.out.println("请好好爱护,弄坏你可赔不起的哦!!!");
  }

}

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

package aop007_comprint;

import java.lang.reflect.invocationhandler;
import java.lang.reflect.proxy;

/*
 * 增加一个【动态代理类】,类似与明星的经纪人
 * 把核心的业务逻辑的代码 和 非核心的 分离
 * 把非核心的代码交给经纪人(proxy)去管理,
 * 注意:经纪人和要明星,必须实现同一个接口
 */
public class testprint {

  public static void main(string[] args) {
    //第一步:创建目标实现类的实例
    print cprint = new colorprint();
    print wprint = new whiteprint();
    
    //第二步:创建一个动态代理类(ceo 首席执行官)
    invocationhandler cprinthandler = new printhandler(cprint);
    invocationhandler wprinthandler = new printhandler(wprint);
    
    //第三步:创建动态代理(跟静态代理一样,申明的变量仍然是目标的接口)
    print cprintproxy = (print) proxy.newproxyinstance(cprint.getclass().getclassloader(),
                              cprint.getclass().getinterfaces(),
                              cprinthandler);
    print wprintproxy = (print) proxy.newproxyinstance(wprint.getclass().getclassloader(),
                              wprint.getclass().getinterfaces(),
                              wprinthandler);
    
    cprintproxy.colorprint();  //对比 cprint.colorprint(); [只有核心代码] 运行后的区别
    system.out.println("------------------------------");
    wprintproxy.whiteprint();  //对比 wprint.whiteprint(); [只有核心代码] 运行后的区别
  }

}

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

 利用spring aop实现动态代理

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。