利用spring aop实现动态代理

下面由我来给大家展示用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(); [只有核心代码] 运行后的区别
  }

}

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

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

(0)

相关推荐

  • Spring学习之动态代理(JDK动态代理和CGLIB动态代理)

    前言 动态代理,是一种通过运行时操作字节码,以达到增强类的功能的技术,也是Spring AOP操作的基础,关于AOP的内容,将在后面的笔记中详细讲解,本小节主要是理清楚动态代理,毕竟,Spring的AOP是基于动态代理技术,对动态代理技术有所了解,对于学习Spring AOP也会有帮助 动态代理技术详解 动态代理,现在主要是用于增强类的功能,同时由于是具有动态性,所以避免了需要频繁创建类的操作,同时,也使得原有的代码在不需要改变的情况下,对类的功能进行增强,主要的动态代理技术有:通过实现目标接口

  • spring cglib 与 jdk 动态代理

    1. 概述 JDK动态代理是利用java反射机制 生成一个实现接口的匿名类, 在调用具体方法前调用InvocationHandler来处理 Cglib动态代理是 利用asm开源包 把被代理类的class文件加载进来 通过修改其字节码生成子类来处理 如果目标对象实现了接口 那么默认使用jdk代理(可以强制使用cglib代理) 如果没有实现接口 必须使用cglib代理 强制使用cglib代理需要 *引入cglibjar包 *配置spring <aop:aspectj-autoproxy proxy-

  • spring基础概念AOP与动态代理理解

    一.代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为"代理",所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 以简单模拟事务的执行过程说明各种代理区别 1.1 静态代理 由程序员创建或由特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了. public interface PersonDao { vo

  • 利用spring aop实现动态代理

    下面由我来给大家展示用spring aop实现动态代理的例子(电脑打印) 下面就看一下具体的代码: 先定义一个打印机的接口 package aop007_ComPrint; public interface Print { public void ColorPrint(); //彩色打印 public void WhitePrint(); //黑白打印 } 然后定义两个实现类,分别实现彩色打印和黑白打印 package aop007_ComPrint; public class ColorPri

  • SpringBoot/Spring AOP默认动态代理方式实例详解

    目录 1. springboot 2.x 及以上版本 2. Springboot 1.x 3.SpringBoot 2.x 为何默认使用 Cglib 总结: Spring 5.x中AOP默认依旧使用JDK动态代理 SpringBoot 2.x开始,AOP为了解决使用JDK动态代理可能导致的类型转换异常,而使用CGLIB. 在SpringBoot 2.x中,AOP如果需要替换使用JDK动态代理可以通过配置项spring.aop.proxy-target-class=false来进行修改,proxy

  • 深入浅出讲解Spring框架中AOP及动态代理的应用

    目录 一. Spring AOP 1. 传统问题: 2. 问题的解决策略: 3. AOP优点: 二.  动态代理 1.JDK动态代理 2. CGLIB代理 一. Spring AOP 面向切面编程(Aspect Oriented Programming,AOP)是软件编程思想发展到一定阶段的产物,是对面向对象编程(Object Oriented Programming,OOP)的有益补充, 目前已成为一种比较成熟的编程方式.AOP适用于具有横向逻辑的场所,如访问控制.事务管理.性能监测等. 1.

  • 利用Spring AOP记录方法的执行时间

    一.前言 对于spring aop这个我就不多介绍了,网上一搜一大把,使用过spring的人都知道spring的ioc和aop.ioc我们常用,但在我们自己的系统中,aop的使用几乎为零,除了这个监控的小功能应用到了,其他的基本上没有使用到.下面小编就给大家整理下利用Spring AOP记录方法执行时间的解决方案,有需要的一起看看吧. 二.解决方案 1.传统方法 最简单.粗暴的方法是给各个需要统计的方法开始和结尾处加的时间戳,然后差值计算结果即可,代码如下: long startTime = S

  • 关于spring aop两种代理混用的问题

    目录 spring aop两种代理混用问题 一.首先复习一下两种代理 二.我们项目是spring-boot项目 spring的aop和代理模式理解 代理模式代码的主要特点是 代理模式目前实现的方式有三种 Aop的最大意义是 spring aop两种代理混用问题 工作繁忙,但是遇到问题还是要总结积累下来,今天项目中出现了代理混用的问题,解决之后记录一下对两种代理方式的学习理解. 一.首先复习一下两种代理 JDK动态代理 和 cglib代理 1.如果目标对象实现了接口,默认情况下会采用JDK的动态代

  • Spring aop 如何通过获取代理对象实现事务切换

    Spring aop 获取代理对象实现事务切换 在项目中,涉及到同一个类中一个方法调用另外一个方法,并且两个方法的事务不相关, 这里面涉及到一个事务切换的问题,一般的方法没问题,根据通过aop注解在方法上通过加注解标识, 答案是: 通过spring aop类里面的AopContext类获取当前类的代理对象, 这样就能切换对应的事务管理器了,具体做法如下: (1).在applicationContext.xml文件中配置如下: <!-- 开启暴露Aop代理到ThreadLocal支持 --> &

  • 利用spring AOP记录用户操作日志的方法示例

    前言 最近项目已经开发完成,但发现需要加用户操作日志,如果返回去加也不太现实,所以使用springAOP来完成比较合适.下面来一起看看详细的介绍: 注解工具类: @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface LogAnnotation { String operateModelNm() default ""; String operateFuncNm() default

  • Spring中AOP概念与两种动态代理模式原理详解

    目录 1.概念 1.AOP技术简介 2.AOP的优势 3.Spring AOP术语 4.AOP 开发明确的事项 2.AOP底层实现 1.AOP 的动态代理技术: 3.基于cglib的动态代理代码 总结 1.概念 1.AOP技术简介 AOP 为Aspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. AOP 是 OOP 的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一

随机推荐