轻松掌握Java代理模式

 更新时间:2016年09月19日 10:58:25   作者:赵卓  
这篇文章主要帮助大家轻松掌握Java代理模式,什么是静态代理?感兴趣的小伙伴们可以参考一下

和大家一起聊一聊java代理模式

1、静态代理

1.1静态代理的代理类和和被代理的类都要维护一个共同的接口。 

public interface IUserDao {
  void save();
} 

1.2被代理的类,目标对象 

public class UserDao implements IUserDao{
  @Override
  public void save() {
    System.out.println("-----已经保存数据!!!------");
  }
} 


1.3代理对象 

public class UserDaoProxy implements IUserDao{
  // 接收保存目标对象
  private IUserDao target;
  public UserDaoProxy(IUserDao target) {
    this.target = target;
  }
  @Override
  public void save() {
    System.out.println("开始事务...");
    target.save();       // 执行目标对象的方法
    System.out.println("提交事务...");
  }
}

1.4测试类 

public class App {
  public static void main(String[] args) {
    // 目标对象
    IUserDao target = new UserDao();
    // 代理
    IUserDao proxy = new UserDaoProxy(target);
    proxy.save(); // 执行的是,代理的方法
  }
}

2、动态代理

2.1同样的,动态代理也需要完成一个接口。(同上)

2.2目标对象也是相同的。

2.3只是在代理对象上有所不同 

public class ProxyFactory {
  // 维护一个目标对象
  private Object target;
  public ProxyFactory(Object target){
    this.target = target;
  }
  // 给目标对象,生成代理对象 
  public Object getProxyInstance() {
    return Proxy.newProxyInstance(
        target.getClass().getClassLoader(), 
        target.getClass().getInterfaces(),
        new InvocationHandler() {
          @Override
          public Object invoke(Object proxy, Method method, Object[] args)
              throws Throwable {
            System.out.println("开启事务");
            // 执行目标对象方法
            Object returnValue = method.invoke(target, args);  
            System.out.println("提交事务");
            return returnValue;
          }
        });
  }
}

2.4测试类 

public class App {
  public static void main(String[] args) {
    // 目标对象
    IUserDao target = new UserDao();
    System.out.println(target.getClass());
    // 给目标对象,创建代理对象
    IUserDao proxy = (IUserDao) new ProxyFactory(target).getProxyInstance();
    System.out.println(proxy.getClass());
    // 执行方法  【代理对象】
    proxy.save();
  }
}

3、cglib代理

3.1cglib代理不需要完成接口,只需要写被代理的类和代理类即可,此处被代理类同1.2,所以不再编写。

3.2代理类有所不同,用到cglib代理模式需要引用spring的核心框架包。 

public class ProxyFactory implements MethodInterceptor{
  // 维护目标对象
  private Object target;
  public ProxyFactory(Object target){
    this.target = target;
  }
  // 给目标对象创建代理对象
  public Object getProxyInstance(){
    //1. 工具类
    Enhancer en = new Enhancer();
    //2. 设置父类
    en.setSuperclass(target.getClass());
    //3. 设置回调函数
    en.setCallback(this);
    //4. 创建子类(代理对象)
    return en.create();
  }
  @Override
  public Object intercept(Object obj, Method method, Object[] args,
      MethodProxy proxy) throws Throwable {
    System.out.println("开始事务.....");
    // 执行目标对象的方法
    Object returnValue = method.invoke(target, args);
    System.out.println("提交事务.....");
    return returnValue;
  }
}

3.3测试类 

public class App {
  public static void main(String[] args) {
    // 目标对象
    UserDao target = new UserDao();
    System.out.println(target.getClass());
    // 代理对象
    UserDao proxy = (UserDao) new ProxyFactory(target).getProxyInstance();
    System.out.println(proxy.getClass());
    // 执行代理对象的方法
    proxy.save();
  }
}

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

相关文章

  • Prometheus 入门教程之SpringBoot 实现自定义指标监控

    Prometheus 入门教程之SpringBoot 实现自定义指标监控

    这篇文章主要介绍了Prometheus 入门教程之SpringBoot 实现自定义指标监控,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • java中几种http请求方式示例详解

    java中几种http请求方式示例详解

    在日常工作和学习中有很多地方都需要发送HTTP请求,下面这篇文章主要给大家介绍了关于java中几种http请求方式的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11
  • Spark SQL关于性能调优选项详解

    Spark SQL关于性能调优选项详解

    这篇文章将为大家详细讲解有关Spark SQL性能调优选项,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获
    2023-02-02
  • java文件对话框过滤特定文件类型示例

    java文件对话框过滤特定文件类型示例

    文件作为存储数据的单元,会根据数据类型产生很多分类,也就是所谓的文件类型。在对数据文件进行操作时,常常需要根据不同的文件类型来作不同的处理。本实例实现的是读取文件夹指定类型的文件并显示到表格控件中
    2014-02-02
  • SSH框架网上商城项目第15战之线程、定时器同步首页数据

    SSH框架网上商城项目第15战之线程、定时器同步首页数据

    这篇文章主要为大家详细介绍了SSH框架网上商城项目第15战之线程、定时器同步首页数据,感兴趣的小伙伴们可以参考一下
    2016-06-06
  • java 中List按照date排序的实现

    java 中List按照date排序的实现

    这篇文章主要介绍了java 中List按照date排序的实现的相关资料,需要的朋友可以参考下
    2017-06-06
  • spring cloud整合ribbon问题及解决方案

    spring cloud整合ribbon问题及解决方案

    很多小伙伴在整合ribbon都出了相同的问题,今天特地为大家整理了该问题的解决方案,文中有非常详细的图文解说,对出现同样问题的小伙伴们很有帮助,需要的朋友可以参考下
    2021-05-05
  • CentOS7和8中安装Maven3.8.4的简单步骤

    CentOS7和8中安装Maven3.8.4的简单步骤

    maven是属于apache的一个工具,主要是对java进行编译打包,解决依赖关系,下面这篇文章主要给大家介绍了关于CentOS7和8中安装Maven3.8.4的相关资料,需要的朋友可以参考下
    2022-04-04
  • java中i=i++和j=i++的区别小结

    java中i=i++和j=i++的区别小结

    这篇文章主要给大家介绍了关于java中i=i++和j=i++区别的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • java的java.security.egd源码解读

    java的java.security.egd源码解读

    这篇文章主要为大家介绍了java的java.security.egd源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08

最新评论