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

Posted The Gao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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();
    

以上是关于Spring5一篇文章带你理解Spring5中的静态代理模式的主要内容,如果未能解决你的问题,请参考以下文章

spring5 源码深度解析----- Spring事务 是怎么通过AOP实现的?(100%理解Spring事务)

Spring5-Reactor函数式编程

Spring5-Reactor函数式编程

Spring5框架 笔记总结

Spring5框架 笔记总结

Spring5源码分析(004)——IoC篇之理解Ioc