Spring中静态代理设计模式

目录

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

二、代理设计模式

三、静态代理设计模式

3.1 存在的问题


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

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

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

二、代理设计模式

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

1)代理开发的核心要素

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

2)编码实现

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

public interface UserService {void register();boolean login();
}

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

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

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

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

3)进行测试

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

public void test1() {UserService userService = new UserServiceProxy();userService.register();userService.login();
}

三、静态代理设计模式

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

3.1 存在的问题

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/114246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣每日一题54:螺旋矩阵

题目描述: 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: 输入:matrix [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]示例 2: 输入&#…

mk语法示例

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

『ARM』和『x86』处理器架构解析指南

前言 如果问大家是否知道 CPU,我相信不会得到否定的答案,但是如果继续问大家是否了解 ARM 和 X86 架构,他们的区别又是什么,相信可能部分人就会哑口无言了 目前随着深度学习、高性能计算、NLP、AIGC、GLM、AGI 的技术迭代&#…

自然语言处理---RNN、LSTM、GRU模型

RNN模型 RNN模型概述 RNN(Recurrent Neural Network),中文称作循环神经网络,它一般以序列数据为输入,通过网络内部的结构设计有效捕捉序列之间的关系特征,一般也是以序列形式进行输出。RNN的循环机制使模型隐层上一时间步产生的…

MSP430F5529时钟系统配置

1、为什么要进行时钟管理?   时钟系统是一个数字器件的命脉,对于普通的51单片机来说,它的时钟来源只有外部晶振,然后每12个振荡周期完成一个基本操作,所以也叫做12T单片机,但对于当前高级一点的单片机来…

Spring5学习笔记—高级注解

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Spring专栏 ✨特色专栏: M…

Python 创建或读取 Excel 文件

Excel是一种常用的电子表格软件,广泛应用于金融、商业和教育等领域。它提供了强大的数据处理和分析功能,可进行各种计算和公式运算,并能创建各种类型的图表和可视化数据。Excel的灵活性使其成为处理和管理数据的重要工具。本文将介绍如何使用…

【微信小程序】6天精准入门(第5天:利用案例与后台的数据交互)附源码

一、什么是后台交互? 在小程序中,与后台交互指的是小程序前端与后台服务器之间的数据通信和请求处理过程。通过与后台交互,小程序能够获取服务器端的数据、上传用户数据、发送请求等。 小程序与后台交互可以实现数据的传输、用户认证、实时消…

什么是Sectigo证书?

Sectigo证书,早前被称为Comodo证书,是一种SSL(安全套接层)证书,用于保护互联网上的数据传输的安全性和隐私性。这些证书由全球领先的SSL证书颁发机构Sectigo颁发,被广泛用于网站、应用程序和服务器上。本文…

hexo发生错误 Error: Spawn failed

错误描述 仓库中有东西,运行如下命令后报错 hexo d报错提示: 原因分析: 看别人的博客是用git进行push或hexo d的时候改变了一些.deploy_git文件下的内容,这个.deploy_git的内容对于hexo来说可能是系统文件,这里挖坑 解决办法 一个个的…

分布式Trace:横跨几十个分布式组件的慢请求要如何排查?

目录 前言 一、问题的出现? 二、一体化架构中的慢请求排查如何做 三、分布式 Trace原理 四、如何来做分布式 Trace 前言 在分布式服务架构下,一个 Web 请求从网关流入,有可能会调用多个服务对请求进行处理,拿到最终结果。这个…

自然语言处理---注意力机制

注意力概念 观察事物时,之所以能够快速判断一种事物(当然允许判断是错误的),是因为大脑能够很快把注意力放在事物最具有辨识度的部分从而作出判断,而并非是从头到尾的观察一遍事物后,才能有判断结果。正是基于这样的理论&#xf…

函数和执行上下文

一.变量提升与函数提升 变量提升:通过var关键字定义(声明)的变量,在定义语句之前就可以访问到,只不过其值是undefined 函数提升:通过function声明的函数,在之前就可以调用,值是函数…

聊一聊如何在Vue中使用事件总线( Event Bus)进行组件间通信

事件总线模式允许不同的组件之间进行通信。它要求一个中央枢纽,组件可以通过它发送和接收事件,从而使组件之间的数据交换和交互更加顺畅。本文探讨了它的使用方法,以便开发人员能够充分利用它在Vue开发中的潜力。 跨通信是应用程序中组件之间…

STM32F4X定时器之基本定时器

一、定时器的概述 进行有规律的计数,每记一次数的时间都是固定的 定时器的本质:计数的总时间 记一次数的时间(时钟的频率) * 记多少次(重装载值)。 基本定时器属于片上外设,系统滴答定时器是…

GitHub下载太慢的解决方案

修改hosts文件: windows的hosts文件在 C:\Windows\System32\drivers\etc\hosts cmd管理员运行命令notepad C:\Windows\System32\drivers\etc\hosts 然后cmd命令重启网络ipconfig /flushdns windows修改hosts Ubuntu22.04修改hosts sudo vim /etc/hosts # This fil…

openEuler 服务器安装 JumpServer (all-in-one 模式)

openEuler 服务器安装 JumpServer JumpServer 简介什么是 JumpServer ?JumpServer 的各种类型资产JumpServer 产品特色或优势JumpServer 符合 4A 规范 JumpServer 系统架构应用架构组件说明 JumpServer 安装部署环境要求网络端口网络端口列表防火墙常用命令 在线脚本…

vlookup函数踩坑(wps)

使用wps的朋友看过来 vlookup函数踩坑,vlookup(查找值,查找范围,返回值的索引,精确查找or模糊查找) 我们要查找的数据的那一列,必须是查找范围的第一列! 案例,看下面的…

02、Python 字符串

目录 字符串的基础用法字符串包含引号字符串拼接获取用户输入长字符串原始字符串字节串字符串与字节串转换 字符串的基础用法 列字符串的内容几乎可以包含任何字符,英文字符也行,中文字符也行。 既可用单引号,也可用双引号 字符串包含引号…

shell的for循环与结构化

shell笔记 列表for循环不带列表for循环for循环举例1.例1 所有文件名大写替换为小写2. 例2 读取/etc/passwd文件,依次输出ip段3. 例3 读取/etc/hosts内容for循环,执行ping4. 例4 循环ip列表,输出对应编号5. 例5 批量添加用户 break1. 例1 brea…