Java动态代理和AOP应用示例

 更新时间:2019年07月15日 09:32:27   作者:cakincqm  
这篇文章主要介绍了Java动态代理和AOP应用,结合实例形式分析了java动态代理在AOP面向切面编程中的相关操作技巧与使用注意事项,需要的朋友可以参考下

本文实例讲述了Java动态代理和AOP应用。分享给大家供大家参考,具体如下:

一 点睛

动态代理在AOP(Aspect Orient Program,即面向切面编程)里被称为AOP代理,AOP代理可代替目标对象,AOP代理包含了目标对象的全部方法。但AOP代理中的方法与目标对象的方法存在差异:AOP代理里的方法可以在执行目标方法之前、之后插入一些通用处理。

二 代码

Dog.java

public interface Dog
{
  // info方法声明
  void info();
  // run方法声明
  void run();
}

GunDog.java

public class GunDog implements Dog
{
  // 实现info()方法,仅仅打印一个字符串
  public void info()
  {
    System.out.println("我是一只猎狗");
  }
  // 实现run()方法,仅仅打印一个字符串
  public void run()
  {
    System.out.println("我奔跑迅速");
  }
}

DogUtil.java

public class DogUtil
{
  // 第一个拦截器方法
  public void method1()
  {
    System.out.println("=====模拟第一个通用方法=====");
  }
  // 第二个拦截器方法
  public void method2()
  {
    System.out.println("=====模拟通用方法二=====");
  }
}

MyInvokationHandler.java

import java.lang.reflect.*;
public class MyInvokationHandler implements InvocationHandler
{
  // 需要被代理的对象
  private Object target;
  public void setTarget(Object target)
  {
    this.target = target;
  }
  // 执行动态代理对象的所有方法时,都会被替换成执行如下的invoke方法
  public Object invoke(Object proxy, Method method, Object[] args)
    throws Exception
  {
    DogUtil du = new DogUtil();
    // 执行DogUtil对象中的method1。
    du.method1();
    // 以target作为主调来执行method方法
    Object result = method.invoke(target , args);
    // 执行DogUtil对象中的method2。
    du.method2();
    return result;
  }
}

MyProxyFactory.java

import java.lang.reflect.*;
public class MyProxyFactory
{
  // 为指定target生成动态代理对象
  public static Object getProxy(Object target)
    throws Exception
    {
    // 创建一个MyInvokationHandler对象
    MyInvokationHandler handler =
    new MyInvokationHandler();
    // 为MyInvokationHandler设置target对象
    handler.setTarget(target);
    // 创建、并返回一个动态代理
    return Proxy.newProxyInstance(target.getClass().getClassLoader()
      , target.getClass().getInterfaces() , handler);
  }
}

Test.java

public class Test
{
  public static void main(String[] args)
    throws Exception
  {
    // 创建一个原始的GunDog对象,作为target
    Dog target = new GunDog();
    // 以指定的target来创建动态代理
    Dog dog = (Dog)MyProxyFactory.getProxy(target);
    dog.info();
    dog.run();
  }
}

三 运行

E:\Java\疯狂java讲义\codes\18\18.5\DynaProxy>java Test
=====模拟第一个通用方法=====
我是一只猎狗
=====模拟通用方法二=====
=====模拟第一个通用方法=====
我奔跑迅速
=====模拟通用方法二=====

更多java相关内容感兴趣的读者可查看本站专题:《Java面向对象程序设计入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • 深入理解JAVA 备忘录模式

    深入理解JAVA 备忘录模式

    这篇文章主要介绍了JAVA 备忘录模式的的相关资料,文中示例代码非常细致,供大家参考和学习,感兴趣的朋友可以了解下
    2020-06-06
  • Java中单例模式详解

    Java中单例模式详解

    这篇文章主要介绍了Java中单例模式详解,单例模式包括了懒汉式单例、饿汉式单例、登记式单例三种,想要了解的朋友可以了解一下。
    2016-11-11
  • Springboot并发调优之大事务和长连接

    Springboot并发调优之大事务和长连接

    这篇文章主要介绍了Springboot并发调优之大事务和长连接,重点分享长事务以及长连接导致的并发排查和优化思路和示例,具有一定的参考价值,感兴趣的可以了解一下
    2022-05-05
  • mybatis如何使用Java8的日期LocalDate和LocalDateTime详解

    mybatis如何使用Java8的日期LocalDate和LocalDateTime详解

    这篇文章主要给大家介绍了关于mybatis如何使用Java8的日期LocalDate和LocalDateTime的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-09-09
  • 如何基于Java实现对象List排序

    如何基于Java实现对象List排序

    这篇文章主要介绍了如何基于Java实现对象List排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Spring Boot 搭建 ELK正确看日志的配置流程

    Spring Boot 搭建 ELK正确看日志的配置流程

    这篇文章主要介绍了Spring Boot 搭建 ELK正确看日志的配置流程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • springboot如何使用thymeleaf完成页面缓存

    springboot如何使用thymeleaf完成页面缓存

    这篇文章主要介绍了springboot如何使用thymeleaf完成页面缓存,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • idea中项目文件目录消失如何解决

    idea中项目文件目录消失如何解决

    这篇文章主要介绍了idea中项目文件目录消失的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Spring security如何实现记录用户登录时间功能

    Spring security如何实现记录用户登录时间功能

    这篇文章主要介绍了Spring security如何实现记录用户登录时间功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 分布式消息队列RocketMQ概念详解

    分布式消息队列RocketMQ概念详解

    RocketMQ 是阿里开源的分布式消息中间件,跟其它中间件相比,RocketMQ 的特点是纯JAVA实现,是一套提供了消息生产,存储,消费全过程API的软件系统,本文详细介绍了分布式消息队列RocketMQ概念,需要的朋友可以参考下
    2023-05-05

最新评论