轻松掌握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();
  }
}

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

相关文章

  • Java使用apache poi操作excel的方式

    Java使用apache poi操作excel的方式

    这篇文章主要介绍了Java使用apache poi进行excel相关操作,本文主要针对Apache POI对excel的操作进行介绍,主要包括如何创建一个excel、录入数据、读取excel数据的方式,需要的朋友可以参考下
    2022-05-05
  • SpringBoot整合Mybatis与druid实现流程详解

    SpringBoot整合Mybatis与druid实现流程详解

    这篇文章主要介绍了springboot整合mybatis plus与druid详情,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的下伙伴可以参考一下
    2022-10-10
  • 关于jdk8升级jdk21 cxf报错的踩坑记录

    关于jdk8升级jdk21 cxf报错的踩坑记录

    在升级Java项目时,从JDK1.8和Spring2迁移到JDK21和Spring3后,遇到了JAXBException错误,原因是从JDK11开始移除了jaxb模块,而cxf在编译动态客户端时默认classpath不包含必要的类,解决方法是在jar包同级目录创建libs并添加jakarta.xml.bind-api
    2024-10-10
  • Java设计模式之装饰者模式详解

    Java设计模式之装饰者模式详解

    这篇文章主要为大家详细介绍了java设计模式之装饰者模式,装饰者模式是一种结构式模式,感兴趣的朋友可以参考一下
    2021-10-10
  • Windows10系统下修改jar中的文件并重新打包成jar文件然后运行的操作步骤

    Windows10系统下修改jar中的文件并重新打包成jar文件然后运行的操作步骤

    这篇文章主要介绍了Windows10系统下修改jar中的文件并重新打包成jar文件然后运行的操作步骤,文中通过图文结合的形式给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-08-08
  • Spring设计模式中代理模式详细讲解

    Spring设计模式中代理模式详细讲解

    如何实现在不修改源码的基础上实现代码功能的增强呢?spring为我们提供了代理模式。所谓的代理模式通俗来说就是一个中介,它给某一个对象提供一个代理对象,并由代理对象控制原对象的引用,从而实现在不修改源码的基础上实现代码功能的增强
    2023-01-01
  • Spring Boot实现数据访问计数器方案详解

    Spring Boot实现数据访问计数器方案详解

    在Spring Boot项目中,有时需要数据访问计数器,怎么实现数据访问计数器呢?下面小编给大家带来了Spring Boot数据访问计数器的实现方案,需要的朋友参考下吧
    2021-08-08
  • JAVA读取属性文件的几种方法总结

    JAVA读取属性文件的几种方法总结

    以下是对在JAVA中读取属性文件的几种方法进行了详细的总结介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-10-10
  • serialVersionUID作用全面解析

    serialVersionUID作用全面解析

    这篇文章全面解析了java中serialVersionUID的作用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • java8新特性 获取list某一列的操作

    java8新特性 获取list某一列的操作

    这篇文章主要介绍了java8新特性 获取list某一列的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02

最新评论