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中的静态代理模式的主要内容,如果未能解决你的问题,请参考以下文章