栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Spring5】一篇文章带你理解Spring5中的静态代理模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Spring5】一篇文章带你理解Spring5中的静态代理模式

首先可以通过一个生活化的案例简单理解下静态代理模式。比如现在很常见的租房问题。对于租房需求,有房东、中介、客户三个角色。

  • 对于租房来说,是房东想要去完成的事情。
  • 对于房东来说,只想要完成租房这一个事情,但是其他的事情不想去做。
  • 对于中介来说,需要代表房东完成租房的事情,除此之外自己还有一些事情要做,比如带客户看房、收中介费、签合同等。
  • 对于客户来说,就想租个房子。

这样的话,中介就要代理房东去完成租房这个事情,客户租房实际上是与中介直接打交道。这个就是静态代理模式。

如果通过Java代码表达静态代理模式呢?项目的整体结构如图所示。

对于需求来说,通过UserService这个接口(也可以是抽象类)实现。

public interface UserService {
    public void add();
    public void delete();
    public void update();
    public void query();
}

在Impl中实现每个方法的具体逻辑。

public class UserServiceImpl implements UserService{
    public void add() {
        System.out.println("add");
    }
    public void delete() {
        System.out.println("delete");
    }
    public void update() {
        System.out.println("update");
    }
    public void query() {
        System.out.println("query");
    }
}

不改变源代码是软件开发中的一个重要原则,如果想要扩展每个方法的功能,因此需要引入代理模式。那么就需要一个UserServiceProxy类实现需要扩展的部分。比如引入日志模块。

public class UserServiceProxy implements UserService{
    private UserService userService;
    public void setUserService(UserService userService) {
        this.userService = userService;
    }
    public void add() {
        log("add");
        userService.add();
    }
    public void delete() {
        log("delete");
        userService.delete();
    }
    public void update() {
        log("update");
        userService.update();
    }
    public void query() {
        log("query");
        userService.query();
    }
    public void log(String msg) {
        System.out.println("日志功能已添加到" + msg + "方法中");
    }
}

在UserServiceProxy类中也需要实现UserService接口,同时需要有一个userService对象,通过调用这个UserService对象的相应方法去实现对应逻辑。这里UserService是一个接口,接口是没法是没法实例化对象的,因此通过Setter方法设置UserService对象的运行类型,通过Java的动态加载机制去调用具体的方法。

那么客户在调用方法时,就可以通过proxy对象去调用相应的方法,不过在调用方法前,需要通过Setter方法先设置UserService的运行类型。

public class Client {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        UserServiceProxy proxy = new UserServiceProxy();
        proxy.setUserService(userService);
        proxy.add();
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/602592.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号