Spring中静态代理设计模式

目录

一、为什么需要代理设计模式

二、代理设计模式

三、静态代理设计模式

[3.1 存在的问题](#3.1 存在的问题)


一、为什么需要代理设计模式

在项目的开发过程中我们知道service层是整个项目中最重要的部分,在service中一般会有两个部分,一个是核心业务 ,一个是额外功能。那么问题来了,这个额外功能放在service层好不好呢?其实在service中有额外功能是不好的,是不利于代码的维护的。所以这里就有了代理设计模式

这样的案例在生活中也是很常见的,就好比说租房中的中介公司就是一个代理(代理类),当有人需要租房的时候直接去找中介公司就可以了,通过中介公司也可以对接到房东签合同,这样就省去了房东自己去打广告的麻烦,所以代理设计模式是非常有必要的!

二、代理设计模式

通过上述的描述,我们发现代理设计模式就是通过一个代理类,为目标类增加额外的功能,这样做的目的就是利于目标类的维护。

1)代理开发的核心要素

由上述过程我们发现在代理类中,目标类的功能是需要有的(中介没有房东出租屋的信息怎么租房呢)同时还需要额外的功能(既然是中介公司那肯定要有广告信息)。有了这两个概念之后我们就能知道代理类和目标类应该实现同一个接口

2)编码实现

首先应该有一个service的接口类,这里直接创建一个UserService接口类

java 复制代码
public interface UserService {
    void register();
    boolean login();
}

接下来再创建一个目标类UserServiceImpl实现这个接口(这个就好比是房东)

java 复制代码
public class UserServiceImpl implements UserService{
    @Override
    public void register() {
        System.out.println("register核心功能正在执行");
    }
    @Override
    public boolean login() {
        return false;
    }
}

最后创建一个代理类UserServiceProxy,这个类既要有目标类的功能,也要有自己的额外功能(中介的广告)

java 复制代码
public class UserServiceProxy implements UserService{
    // 需要有目标类的方法,所以这里需要有目标类
    UserServiceImpl user = new UserServiceImpl();
    @Override
    public void register() {
        // 添加额外功能,这里就不写复杂功能了,打印代替
        System.out.println("----这里是额外功能的添加----log");
        // 将目标类的方法实现
        user.register();
    }
    @Override
    public boolean login() {
        // 添加额外功能,这里就不写复杂功能了,打印代替
        System.out.println("----这里是额外功能的添加----log");
        return user.login();
    }
}

3)进行测试

此时就可以发现这里的目标类中的核心方法执行了,同时这里的额外功能也执行了,这时说明代理的过程已经成功了

java 复制代码
public void test1() {
    UserService userService = new UserServiceProxy();
    userService.register();
    userService.login();
}

三、静态代理设计模式

上述的代理的过程称为静态代理模式:为每一个目标类手工编写一个代理类。

3.1 存在的问题

静态代理的过程中我们会发现其实存在一些问题,因为每一个目标类都需要手动编写一个代理类,那么在这个过程中如果代理类过多就会使得项目的管理难度上升。同时,在静态代理的过程中这些额外功能都是已经写死在代理类中了,后续想要修改这些额外功能就会变得非常的复杂!说了这么多,那有解决办法吗?有!那就是Spring提供的动态代理开发!

相关推荐
why技术7 分钟前
从18w到1600w播放量,我的一点思考。
java·前端·后端
夫唯不争,故无尤也23 分钟前
JavaWeb流式传输速查宝典
java·流式传输
苏小瀚1 小时前
算法---位运算
java·算法
Camel卡蒙1 小时前
数据结构——二叉搜索树Binary Search Tree(介绍、Java实现增删查改、中序遍历等)
java·开发语言·数据结构
2401_841495641 小时前
【数据结构】基于Floyd算法的最短路径求解
java·数据结构·c++·python·算法··floyd
珹洺2 小时前
Java-Spring入门指南(二十七)Android Studio 第一个项目搭建与手机页面模拟器运行
java·spring·android studio
程序猿DD2 小时前
Java 25 中的 6 个新特性解读
java·后端
稻草猫.2 小时前
文件 IO
java·笔记·后端·java-ee·idea
laopeng3012 小时前
基于Spring AI Deep Researcher Agent
java·人工智能·spring
子豪-中国机器人3 小时前
《C++ STL 基础入门》教案
java·开发语言