美文网首页
Java中的静态代理

Java中的静态代理

作者: 因你而在_caiyq | 来源:发表于2019-04-11 22:45 被阅读0次

原创文章,转载请注明原文章地址,谢谢!

什么是静态代理?

代理模式,客户端不会直接去访问真实对象,而是通过代理的方式间接访问真实对象。所谓静态代理,就是在程序运行之前就已经存在代理文件了,是我们自己创建的代理对象,即代理对象和真实对象在程序运行前就确定了。

静态代理实现简单事务管理

在我们的应用中,很多地方都要用到事务,像保存、更新这样的操作,没有事务管理是万万不能的。一般在我们的业务代码中冗杂这事务代码,随着业务的增加,要一直重复着事务代码,业务代码和事务代码耦合,不利于扩展维护。我们先来看一下原先的代码是如何实现的。

public interface EmployeeService {

    void save();

    void update();
}
public class EmployeeServiceImpl implements EmployeeService {

    public void save() {
        System.out.println("调用DAO中的方法执行保存");
    }

    public void update() {
        System.out.println("调用DAO中的方法执行更新");
    }
}
public class TransactionManager {

    public void begin() {
        System.out.println("开启事务");
    }

    public void commit() {
        System.out.println("提交事务");
    }

    public void rollback() {
        System.out.println("回滚事务");
    }
}

在上述代码中,我们模拟员工的service进行保存操作,用TransactionManager模拟事务场景,那么现在我们在测试类中测试员工的保存操作,并加上事务。

@Test
public void test() {
    EmployeeService employee = new EmployeeServiceImpl();
    TransactionManager transactionManager = new TransactionManager();
    try {
        transactionManager.begin();
        employee.save();
        transactionManager.commit();
    } catch (Exception e) {
        e.printStackTrace();
        transactionManager.rollback();
    }
}

运行程序,观察测试结果为

开启事务
调用DAO中的方法执行保存
提交事务

可以看到,我们已经将事务集成到了业务代码中,实现了事务管理。事实上,我们并不希望关于事务的代码和业务代码写到一起,在service中,我们只想专注于业务代码。且尤其对于数据库操作的增删改,对于使用事务来讲,都是大同小异的。所以既然我们不想做跟事务相关的,那么交给谁来做呢?此时就要想到使用一个代理类来帮我们做这样的事。如果是静态代理,代理对象在运行前确定,那么先要创建代理类。所以接下来我们使用静态代理,来代理真实对象的要做的事。

首先要明确一点,我们使用代理类来帮真实对象做一些事,但是核心业务还是真实对象自己做的,所以在代理类中需要持有真实对象的引用,即代理类帮谁做事,就要持有谁的引用。就好比中介给你租房子,那么房子最终是你自己住,海外代购给你买化妆品,真正用化妆品的是你自己。

public class EmployeeProxy implements EmployeeService {

    private EmployeeService employee;

    private TransactionManager transactionManager = new TransactionManager();

    public EmployeeProxy(EmployeeService employee) {
        this.employee = employee;
    }

    public void save() {
        try {
            System.out.println("日志:保存操作...");
            transactionManager.begin();
            employee.save();
            transactionManager.commit();
        } catch (Exception e) {
            e.printStackTrace();
            transactionManager.rollback();
        }
    }

    public void update() {
        try {
            System.out.println("日志:更新操作...");
            transactionManager.begin();
            employee.update();
            transactionManager.commit();
        } catch (Exception e) {
            e.printStackTrace();
            transactionManager.rollback();
        }
    }
}

那么接下来进行测试

@Test
public void testStaticProxy() {
    EmployeeService employee = new EmployeeServiceImpl();
    EmployeeProxy proxy = new EmployeeProxy(employee);
    proxy.save();
}
日志:保存操作...
开启事务
调用DAO中的方法执行保存
提交事务

测试结果和上面是一样的,同样实现了事务管理,而且还增加了日志。代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强。值得注意的是,代理类和被代理类应该共同实现一个接口。因为代理类是我们自己创建的,在运行之前就存在了,所以叫静态代理。

博客内容仅供自已学习以及学习过程的记录,如有侵权,请联系我删除,谢谢!

相关文章

  • 浅谈Java和SAP ABAP的静态代理和动态代理,以及ABAP

    文章目录 Java的静态代理 静态代理的优缺点 ABAP的静态代理 Spring AOP的动态代理 JDK动态代理...

  • 动态代理

    静态代理 静态代理由委托类和代理类组成,在我们的java文件中写好,编译成.class文件。在客户端调用代理类的方...

  • 动态代理的两种方式

    静态代理就不说了,基本用到的都是动态代理。 Java中动态代理有JDK动态代理和CGLIB动态代理。 JDK代理的...

  • 代理模式

    静态代理 静态代理概述1、在java代码中的代理其实很容易,就是用一个代理类将目标类封装起来,我们调用代理类的方法...

  • JAVA基础

    1、Java中的静态代理与动态代理 1)、静态代理 创建一个接口,然后创建被代理的类实现该接口并且实现该接口中的抽...

  • java反射和动态代理

    java动态代理Proxy.newProxyInstance 详解java代理机制(静态代理、动态代理)以及使用场景

  • Java中的静态代理

    原创文章,转载请注明原文章地址,谢谢! 什么是静态代理? 代理模式,客户端不会直接去访问真实对象,而是通过代理的方...

  • 静态/动态代理模式

    代理, 顾名思义就是让别人替你完成或处理事情。 在Java设计模式中,代理模式又可分为静态代理和动态代理模式。静态...

  • Java静态代理和动态代理

    Java静态代理: 其实就是设计模式中的一种; 如下图所示: 静态代理的缺点: Proxy类其实没有实际的内容,它...

  • java的动态代理详解(javassist,cglib)

    俗话说:Coder不知动态代理,走在路上没人理!!!所以本文尝试说明白java代理模式,代理中的静态代理和动态代理...

网友评论

      本文标题:Java中的静态代理

      本文链接:https://www.haomeiwen.com/subject/qanxwqtx.html