深入理解代理模式(Proxy Pattern)及其实际应用
引言
在软件开发中,有时候我们需要在不改变现有代码的情况下添加一些功能,比如延迟初始化、访问控制、日志记录等。代理模式(Proxy Pattern)通过代理对象控制对原对象的访问,为现有代码添加了额外的功能。本篇文章将详细介绍代理模式的概念、应用场景、优缺点,并通过Java代码示例展示代理模式的实际应用。
1. 什么是代理模式?
代理模式是一种结构型设计模式,它提供一个代理对象控制对原对象的访问。代理模式可以在不修改原对象的情况下,向其添加一些功能,比如访问控制、延迟加载、日志记录等。
代理模式的结构
代理模式包含以下几个主要角色:
- 抽象主题(Subject):定义代理类和真实主题类的公共接口。
- 真实主题(RealSubject):实现抽象主题接口,定义真实对象。
- 代理(Proxy):实现抽象主题接口,包含对真实主题对象的引用,并可以在调用真实主题对象前后添加额外功能。
2. 代理模式的代码示例
示例背景
假设我们有一个简单的业务服务类,它有一个方法需要在调用前后执行一些日志记录。我们可以使用代理模式来实现这一点。
抽象主题接口
首先,我们定义抽象主题接口:
// 抽象主题接口
interface BusinessService {void performTask();
}
真实主题类
然后,我们定义真实主题类:
// 真实主题类
class RealBusinessService implements BusinessService {@Overridepublic void performTask() {System.out.println("Performing the main task...");}
}
代理类
接下来,我们定义代理类,在方法调用前后执行增强内容:
// 代理类
class BusinessServiceProxy implements BusinessService {private RealBusinessService realBusinessService;public BusinessServiceProxy(RealBusinessService realBusinessService) {this.realBusinessService = realBusinessService;}@Overridepublic void performTask() {logBefore();realBusinessService.performTask();logAfter();}private void logBefore() {System.out.println("Log before method execution");}private void logAfter() {System.out.println("Log after method execution");}
}
客户端代码
最后,我们在客户端代码中使用代理模式:
public class ProxyPatternDemo {public static void main(String[] args) {RealBusinessService realBusinessService = new RealBusinessService();BusinessService businessService = new BusinessServiceProxy(realBusinessService);// 调用方法前后会执行增强内容businessService.performTask();}
}
输出
Log before method execution
Performing the main task...
Log after method execution
解释
在这个示例中,我们定义了一个业务服务接口 BusinessService
及其实现类 RealBusinessService
,并通过代理类 BusinessServiceProxy
在方法调用前后添加了日志记录功能。代理类在调用真实业务服务对象的方法前后,分别调用了 logBefore
和 logAfter
方法,从而实现了在方法调用前后执行增强内容。
3. 代理模式在实际框架中的应用
代理模式在许多实际框架中都有广泛的应用。下面我们以Spring AOP(面向切面编程)为例,展示代理模式如何在实际应用中为现有代码添加额外功能。
案例分析:Spring AOP
Spring AOP通过代理对象为现有代码添加了日志记录、事务管理、权限控制等功能。Spring AOP可以在不修改现有代码的情况下,通过代理对象在方法调用前后添加额外的功能。
具体实现
下面是一个使用Spring AOP的示例:
1. 添加依赖
首先,在Maven的pom.xml文件中添加Spring AOP的依赖:
<dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>5.3.9</version>
</dependency>
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.9</version>
</dependency>
2. 目标对象
定义业务服务类:
// 目标对象
public class MyService {public void performTask() {System.out.println("Performing task...");}
}
3. 切面类
定义切面类,在方法调用前后执行增强内容:
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.After;@Aspect
public class LoggingAspect {@Before("execution(* MyService.performTask(..))")public void logBefore() {System.out.println("Log before method execution");}@After("execution(* MyService.performTask(..))")public void logAfter() {System.out.println("Log after method execution");}
}
4. Spring 配置文件
定义Spring配置文件(aop-config.xml):
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><bean id="myService" class="MyService"/><bean id="loggingAspect" class="LoggingAspect"/><aop:config><aop:aspect ref="loggingAspect"><aop:pointcut id="performTaskPointcut" expression="execution(* MyService.performTask(..))"/><aop:before method="logBefore" pointcut-ref="performTaskPointcut"/><aop:after method="logAfter" pointcut-ref="performTaskPointcut"/></aop:aspect></aop:config>
</beans>
5. 客户端代码
在客户端代码中使用Spring AOP:
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class SpringAOPDemo {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("aop-config.xml");MyService myService = (MyService) context.getBean("myService");myService.performTask();}
}
输出
Log before method execution
Performing task...
Log after method execution
解释
在这个示例中,Spring AOP通过代理对象在方法调用前后添加了日志记录功能,实现了代理模式。在Spring AOP配置文件中,我们定义了切面(Aspect)和切入点(Pointcut),并指定在目标方法调用前后执行增强内容。
4. 代理模式的优缺点
优点
- 控制对象访问:可以在访问对象时添加额外的功能,比如权限控制、延迟加载等。
- 增强对象功能:可以在不修改现有代码的情况下,为对象添加新的功能。
- 灵活性高:代理对象可以灵活地控制对真实对象的访问。
缺点
- 增加复杂性:需要引入代理对象,增加了系统的复杂性。
- 性能开销:代理对象会增加方法调用的开销,影响系统性能。
5. 总结
代理模式通过代理对象控制对原对象的访问,为现有代码添加了额外的功能。在业务服务的示例中,我们展示了如何通过代理类在方法调用前后执行增强内容,实现了日志记录功能。在Spring AOP中的应用展示了代理模式的实际效果,极大地增强了系统的功能和灵活性。
希望这篇文章对你理解代理模式有所帮助。如果觉得本文内容有价值,请点赞、收藏和关注我们,获取更多设计模式的精彩内容!
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
深入理解代理模式(Proxy Pattern)及其实际应用
引言 在软件开发中,有时候我们需要在不改变现有代码的情况下添加一些功能,比如延迟初始化、访问控制、日志记录等。代理模式(Proxy Pattern)通过代理对象控制对原对象的访问,为现有代码添加了额外的功能。本篇文章将详…...
![](https://img-blog.csdnimg.cn/d0d056b13e5c407fb68cbb364be89770.png)
Elasticsearch (1):ES基本概念和原理简单介绍
Elasticsearch(简称 ES)是一款基于 Apache Lucene 的分布式搜索和分析引擎。随着业务的发展,系统中的数据量不断增长,传统的关系型数据库在处理大量模糊查询时效率低下。因此,ES 作为一种高效、灵活和可扩展的全文检索…...
![](https://img-blog.csdnimg.cn/img_convert/3af50cdcffd68e157818f75bb9407e59.png)
【Python爬虫】Python爬取喜马拉雅,爬虫教程!
一、思路设计 (1)分析网页 在喜马拉雅主页找到自己想要的音频,得到目标URL:https://www.ximalaya.com/qinggan/321787/ 通过分析页面的网络抓包,最终的到一个比较有用的json数据包 通过分析,得到了发送json…...
![](https://img-blog.csdnimg.cn/direct/15f11b9000784d40a96da05717b0d9b0.jpeg)
基于Jmeter的分布式压测环境搭建及简单压测实践
写在前面 平时在使用Jmeter做压力测试的过程中,由于单机的并发能力有限,所以常常无法满足压力测试的需求。因此,Jmeter还提供了分布式的解决方案。本文是一次利用Jmeter分布式对业务系统登录接口做的压力测试的实践记录。按照惯例࿰…...
![](https://www.ngui.cc/images/no-images.jpg)
IDEA常用代码模板
在 IntelliJ IDEA 中,常用代码模板可以帮助你快速生成常用的代码结构和模式。以下是一些常用的代码模板及其使用方法: 动态模板(Live Templates) psvm:生成 public static void main(String[] args) 方法。sout:生成 System.out.println(); 语句。soutv:生成 System.ou…...
![](https://img-blog.csdnimg.cn/direct/410185253a184359bf99a1c13e28b311.png)
基于大语言模型的多意图增强搜索
随着人工智能技术的蓬勃发展,大语言模型(LLM)如Claude等在多个领域展现出了卓越的能力。如何利用这些模型的语义分析能力,优化传统业务系统中的搜索性能是个很好的研究方向。 在传统业务系统中,数据匹配和检索常常面临…...
![](https://img-blog.csdnimg.cn/direct/1349c2e546824f978f2ed9fb38f2e8f8.png)
【ai】ubuntu18.04 找不到 nvcc --version问题
nvcc --version显示command not found问题 这个是cuda 库: windows安装了12.5 : 参考大神:解决nvcc --version显示command not found问题 原文链接:https://blog.csdn.net/Flying_sfeng/article/details/103343813 /usr/local/cuda/lib64 与 /usr/local/cuda-11.3/lib64 完…...
![](https://img-blog.csdnimg.cn/direct/942f8bfef36d4d83908ae772ab158bac.png)
深入了解DDoS攻击及其防护措施
深入了解DDoS攻击及其防护措施 分布式拒绝服务(Distributed Denial of Service,DDoS)攻击是当今互联网环境中最具破坏性和普遍性的网络威胁之一。DDoS攻击不仅危及企业的运营,还可能损害其声誉,造成客户信任度的下降。…...
![](https://img-blog.csdnimg.cn/direct/88e851ebea7b4389ad3913570b6fcfb2.jpeg#pic_center)
【面试系列】产品经理高频面试题及详细解答
欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、…...
![](https://www.ngui.cc/images/no-images.jpg)
前端特殊字符数据,后端接收产生错乱,前后端都需要处理
前端: const data {createTime: "2024-06-11 09:58:59",id: "1800346960914579456",merchantId: "1793930010750218240",mode: "DEPOSIT",channelCode: "if(amount > 50){iugu2pay;} else if(amount < 10){iu…...
![](https://img-blog.csdnimg.cn/direct/66f4f53b6a224269a2067a8abecf104e.png)
力扣热100 哈希
哈希 1. 两数之和49.字母异位词分组128.最长连续序列 1. 两数之和 题目:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。…...
![](https://img-blog.csdnimg.cn/direct/29df5817b9c24512a6975e17a94d4032.png)
[图解]SysML和EA建模住宅安全系统-05-参数图
1 00:00:01,140 --> 00:00:03,060 这是实数没错,这是分钟 2 00:00:03,750 --> 00:00:07,490 但是你在这里选,选不了的 3 00:00:07,500 --> 00:00:09,930 因为它这里不能够有那个 4 00:00:11,990 --> 00:00:13,850 但是我们前面这里 5 00…...
![](https://img-blog.csdnimg.cn/img_convert/f00deb232a47e5733df1b4bc0218290b.png)
JavaScript——对象的创建
目录 任务描述 相关知识 对象的定义 对象字面量 通过关键字new创建对象 通过工厂方法创建对象 使用构造函数创建对象 使用原型(prototype)创建对象 编程要求 任务描述 本关任务:创建你的第一个 JavaScript 对象。 相关知识 JavaScript 是一种基于对象&a…...
![](https://www.ngui.cc/images/no-images.jpg)
大二暑假 + 大三上
希望,暑假能早睡早起,胸围达到 95,腰围保持 72,大臂 36,小臂 32,小腿 38🍭🍭 目录 🍈暑假计划 🌹每周进度 🤣寒假每日进度😂 &…...
![](https://img-blog.csdnimg.cn/direct/97a4ae1a25284b0995072b4275601128.jpeg)
C语言使用先序遍历创建二叉树
#include<stdio.h> #include<stdlib.h>typedef struct node {int data;struct node * left;struct node * right; } Node;Node * createNode(int val); Node * createTree(); void freeTree(Node * node);void preOrder(Node * node);// 先序创建二叉树 int main()…...
![](https://www.ngui.cc/images/no-images.jpg)
如何在服务器中安装anaconda
文章目录 Step1: 下载 Anaconda方法1:下载好sh文件上传到服务器安装方法2:在线下载 Step2: 安装AnacondaStep3: 配置环境变量Step 4: 激活AnacondaStep4: 检验安装是否成功 Step1: 下载 Anaconda 方法1:下载好sh文件上传到服务器安装 在浏览…...
![](https://img-blog.csdnimg.cn/direct/daa21f43e22940bebe607a3f830852f4.png#pic_center)
夸克网盘拉新暑期大涨价!官方授权渠道流程揭秘
夸克网盘拉新暑期活动来袭,价格大涨!从7月1日开始持续两个月,在这两个月里夸克网盘拉新的移动端用户,一个从原来的5元涨到了10元。这对做夸克网盘拉新的朋友来说,真的是福利的。趁着暑期时间多,如果有想做夸…...
![](https://img-blog.csdnimg.cn/direct/838b9f20f01c41a5a2bdb67e1dd823f7.png)
机器学习(三)
机器学习 4.回归和聚类算法4.1 线性回归4.1.1 线性回归的原理4.1.2 线性回归的损失和优化原理 4.2 欠拟合与过拟合4.2.1 定义4.2.2 原因以及解决方法4.2.3 正则化 4.3 线性回归改进-岭回归4.3.1 带L2正则化的线性回归-岭回归4.3.2 API 4.4 分类算法-逻辑回归与二分类4.4.1 定义…...
![](https://www.ngui.cc/images/no-images.jpg)
PostgreSQL 基本SQL语法(二)
1. SELECT 语句 1.1 基本 SELECT 语法 SELECT 语句用于从数据库中检索数据。基本语法如下: SELECT column1, column2, ... FROM table_name; 例如,从 users 表中检索所有列的数据: SELECT * FROM users; 1.2 使用 WHERE 条件 WHERE 子…...
![](https://img-blog.csdnimg.cn/direct/f37d412674224ae6b52c45b4543f7721.png)
linux 控制台非常好用的 PS1 设置
直接上代码 IP$(/sbin/ifconfig eth0 | awk /inet / {print $2}) export PS1"\[\e[35m\]^o^\[\e[0m\]$ \[\e[31m\]\t\[\e[0m\] [\[\e[36m\]\w\[\e[0m\]] \[\e[32m\]\u\[\e[0m\]\[\e[33m\]\[\e[0m\]\[\e[34m\]\h(\[\e[31m\]$IP\[\e[m\])\[\e[0m\]\n\[\e[35m\].O.\[\e[0m\]…...
![](https://img-blog.csdnimg.cn/direct/948cf2604f0544da80536249aedb8f1e.png)
【紫光同创盘古PGX-Nano教程】——(盘古PGX-Nano开发板/PG2L50H_MBG324第十二章)Wifi透传实验例程说明
本原创教程由深圳市小眼睛科技有限公司创作,版权归本公司所有,如需转载,需授权并注明出处(www.meyesemi.com) 适用于板卡型号: 紫光同创PG2L50H_MBG324开发平台(盘古PGX-Nano) 一:…...
![](https://www.ngui.cc/images/no-images.jpg)
详述乙级资质企业在城市综合管廊与隧道一体化设计中的挑战与机遇
挑战 1. 技术与设计复杂性 城市综合管廊与隧道项目往往涉及复杂的地质条件、地下水位、周边建筑物影响等因素,要求企业具备高水平的岩土工程、结构工程和流体力学等专业知识。此外,一体化设计需要跨学科合作,协调不同系统的兼容性ÿ…...
![](https://img-blog.csdnimg.cn/img_convert/ca4a9d7b91b6a7c460d0d43268017896.jpeg)
如何借助物联网实现农情监测与预警
如何借助物联网实现农情监测与预警? 物联网技术,作为信息技术与传统行业的深度融合产物,正逐步变革着农业生产的管理模式,特别是在农情监测与预警领域展现出巨大潜力。其核心在于通过感知层的各类传感器、通信层的数据传输技术以…...
![](https://img-blog.csdnimg.cn/direct/b4837c3ddae0486dba2a30c792d63eb1.jpeg)
一个项目学习Vue3---响应式基础
观察下面一段代码,学习响应式基础的全部内容 <template><div><div>将下面的msg属性放到上面来:{{ msg }}</div><button click"count">{{ count }}</button><button click"object.count.value">{{ o…...
![](https://www.ngui.cc/images/no-images.jpg)
白骑士的Python教学基础篇 1.5 数据结构
系列目录 上一篇:白骑士的Python教学基础篇 1.4 函数与模块 数据结构是编程语言中用于存储和组织数据的基本构件。在Python中,常见的数据结构包括列表(List)、元组(Tuple)、字典(…...
![](https://www.ngui.cc/images/no-images.jpg)
Go 常用文件操作
查找文件/目录 os.Stat(String)组合路径 dir, _ : homedir.Dir() filename : args[0] path : filepath.Join(dir, filename)homedir.Dir()为home根目录。 filepath.Join 会自动处理分隔符,将目录和文件名组合成文件路径。 检查是否含有后缀.json strings.HasSu…...
![](https://img-blog.csdnimg.cn/direct/ee7f6ecc4525423aa3d53d1fb3b13149.png)
大数据、人工智能、云计算、物联网、区块链序言【大数据导论】
各位大佬好 ,这里是阿川的博客,祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 本篇序言前 必看 【大数据导论】—大数据序言 这是…...
![](https://img-blog.csdnimg.cn/img_convert/fcef9f4736499e881c03310c84fb4825.png)
ComfyUI流程图、文生图、图生图步骤教学!
前言 leetcode , 209. 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的子数组 [numsl, numsl1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 …...
![](https://www.ngui.cc/images/no-images.jpg)
CSS基础知识学习指南
CSS基础知识学习指南 1. 介绍 CSS(层叠样式表)是用于描述HTML文档的呈现样式的语言。通过CSS,可以控制网页的布局、颜色、字体等各种样式,使得网页更加美观和用户友好。 2. CSS基础语法 CSS由选择器和声明块组成。选择器用于选…...
![](https://www.ngui.cc/images/no-images.jpg)
力扣hot100 -- 贪心算法
👂 ▶ 逍遥叹 - 胡歌&沈以城【Mashup】 (163.com) 👂 庐州月 - 许嵩 - 单曲 - 网易云音乐 2.7 小时,加上写博客,4 道题,😂 -- 希望二刷时,可以 3 小时,8 道题.... 目录 &…...
![](https://www.ngui.cc/images/no-images.jpg)
P2P文件传输协议介绍
P2P文件传输协议是一种基于对等网络(Peer-to-Peer,简称P2P)的文件共享和传输技术。以下是关于P2P文件传输协议的详细介绍: 一、定义与原理 P2P文件传输协议允许网络中的各个节点(即计算机或其他设备)之间…...
![](https://www.ngui.cc/images/no-images.jpg)
Spring Boot集成Spring Mobile快速入门Demo
1.什么是Spring Mobile? Spring Mobile是一个基于Spring Web MVC框架扩展的一个针对不同移动终端的应用开发框架。通过它我们在适配不同终端方面,就不用费劲心思了。 Spring Mobile的主要功能 自动设备检测: Spring Mobile在 server端内置了一个设备解…...
![](https://img-blog.csdnimg.cn/direct/be4c2313883b411099f398667cf0978d.jpeg)
走进开源企业 | 湖南大学OpenHarmony技术实训活动在开鸿智谷顺利举办!
6月24日-6月26日,2024开放原子校源行之湖南大学信息科学与工程学院师生走进开源企业实训交流活动顺利落下帷幕。湖南大学信息科学与工程学院的师生代表团一行90人参与了湖南开鸿智谷数字产业有限公司(以下简称“开鸿智谷”)与母公司拓维信息系…...
![](https://img-blog.csdnimg.cn/direct/39c16728caf34bfc808e75c8671db804.png)
TCP单进程循环服务器程序与单进程客户端程序
实验目的 理解并掌握以下内容: 网络进程标识(即套接字地址)在Linux中的数据结构与地址转换函数。网络字节序与主机字节序的定义、转换以及相关函数在网络编程中的应用。数据结构内存对齐的基本规则,以及基于数据结构构建PDU的基本方法。TCP单进程循环服务器与单进程客户端的…...
![](https://img-blog.csdnimg.cn/direct/515ea66acc804c3f86e94726f31ea0e4.jpeg)
QT+winodow 代码适配调试总结(二)
已经好多年了, linux环境下不同版本的QT程序开发和部署,突然需要适配window环境程序调试,一堆大坑,还真是一个艰巨的任务,可是kpi下的任务计划,开始吧!! 1、首先我们自定义的动态库…...
![](https://img-blog.csdnimg.cn/img_convert/5f088c0f5d26a016b12c8c4a956644db.png)
百家讲坛 | 裴伟伟:企业中安全团队应当如何反馈漏洞
作者简介:裴伟伟,洞源实验室创始人,国家网安基地网络安全行业专家,网安加社区特聘专家,持有CISSP、PMP证书,曾在HITCON、可信云大会、开源产业大会等安全论坛发表演讲。曾任国内某安全实验室负责人、某互金…...
![](https://img-blog.csdnimg.cn/direct/c19bc93c3027442f9171f32877522e80.png)
巧用Fiddler中的Comments提升接口测试效率
有没有同学在使用Fiddler时跟我遇到了同样的问题,就是想给某个抓包的请求进行注释!!!但是奇怪的是,根本没有Comments相关信息呀? 设置Comments 设置Comments非常容易,选中一个请求,…...
![](https://img-blog.csdnimg.cn/img_convert/20edce2ec5b54dc0d5fe1b64cb989a65.gif)
停车场车牌识别计费系统,用Python如何实现?
关注星标,每天学习Python新技能 前段时间练习过的一个小项目,今天再看看,记录一下~ 项目结构 说明: datefile文件夹:保存车辆信息表的xlsx文件 file文件夹:保存图片文件夹。ic_launcher.jpg是窗体的右上角…...
![](https://img-blog.csdnimg.cn/direct/68eb773835224baca8cd5c29b3d891b6.png)
Linux内核——Linux内核体系模式(二)
1 Linux系统的中断机制 Linux内核将中断分为两类:硬件中断和软件中断(异常)。每个中断是由0-255之间的一个数字进行标识。 中断int0-int31(0x00-0x1f)作为异常int32-int255由用户自己设定 int32-int47对应与8259A中断…...
![](https://www.ngui.cc/images/no-images.jpg)
Spring MVC的高级功能——异常处理(一)简单异常处理器
一、HandlerExceptionResolver接口 如果希望对Spring MVC中所有异常进行统一处理,可以使用Spring MVC提供的异常处理器HandlerExceptionResolver接口。Spring MVC内部提供了HandlerExceptionResolver的实现类SimpleMappingExceptionResolver。它实现了简单的异常处理…...
![](https://img-blog.csdnimg.cn/direct/cbeed1f0104c4f7380f37a309f3af1cb.png#pic_center)
【面试干货】Static关键字的用法详解
【面试干货】Static关键字的用法详解 1、Static修饰内部类2、Static修饰方法3、Static修饰变量4、Static修饰代码块5、总结 💖The Begin💖点点关注,收藏不迷路💖 在Java编程语言中,static是一个关键字,它可…...
![](https://img-blog.csdnimg.cn/direct/6e364b09013e4a0b840857e619177722.png)
软件工程实验
实验环境和需求 用户可以对相片进行按类别管理,用户可以设定不同的类别,然后上传照片到相应的类别中,并能进行照片的删除,注释 运行 运行并访问 localhost 8090,图片在数据库中的信息是D:/upgrade 后面的内容 se…...
![](https://www.ngui.cc/images/no-images.jpg)
对于复杂的网页布局,如多列布局和网格布局,CSS 有哪些最佳实践和技巧?
对于复杂的网页布局,如多列布局和网格布局,以下是一些CSS的最佳实践和技巧: 使用Flexbox或CSS Grid布局:Flexbox和CSS Grid是两个强大的CSS布局模型,可用于实现复杂的网页布局。Flexbox适用于单行或单列布局࿰…...
![](https://www.ngui.cc/images/no-images.jpg)
Spring Boot中集成Redis实现缓存功能
Spring Boot中集成Redis实现缓存功能 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨如何在Spring Boot应用程序中集成Redis,实现…...
![](https://img-blog.csdnimg.cn/direct/358c0ceee67c4659a5c36a20bd481e4f.png)
arco disign vue 日期组件的样式穿透
问题描述: 对日期组件进行样式穿透. 原因分析: 如图,日期组件被展开时它默认将dom元素挂载到body下, 我们的页面在idroot的div 里层, 里层想要穿透外层是万万行不通的. 解决问题: 其实官网提供了参数,但是并没有提供例子, 只能自己摸索着过河. 对于日期组件穿透样式,我们能…...
![](https://img-blog.csdnimg.cn/direct/dad41acca7b1433397c104d86ff7b1a5.png)
【深度学习】pytorch训练中的一个大坑
使用的命令:iostat -x 5 可以看到 ssd的利用率已经满了。 之前在的数据集放在了 hdd上,训练结果特别慢。 所以我把它移动到了ssd上,然后训练参数用的 resume, 但是!!!!它把历史记住…...
![](https://www.ngui.cc/images/no-images.jpg)
python全局解释器锁(GIL)
文章目录 1.cpu工作方式2.python全局解释器锁与多线程3.其他语言的多线程4.如何解决假的多线程 1.cpu工作方式 先来先服务(First Come, First Served,FCFS): 最简单的调度算法,按照作业或进程到达的顺序依次执行。没有…...
![](https://img-blog.csdnimg.cn/direct/53614fbd88874332a5de38be097d7553.jpeg)
无人机的起源
无人机起源于20世纪初的早期实验阶段,并随着技术进步逐步发展。无人机,作为现代科技领域中的一项重要创新,已经在全球范围内展现出其巨大的潜力和应用价值。 无人机的历史可以追溯到1917年,美国人艾德温.奥斯特林发明了“飞行训练…...
![](https://img-blog.csdnimg.cn/direct/f951a7f0826f4691a84aedcc407d62f2.png)
专题六:Spring源码之初始化容器BeanFactory
上一篇咱们通过一个例子介绍初始化容器上下文相关内容,并通过两个示例代码看到了Spring在设计阶段为我预留的扩展点,和我们应该如何利用这两个扩展点在Spring初始化容器上下文阶段为我们提供服务。这一篇咱们接着往下看。 老这样子下回到refresh方法上来…...
![](https://img-blog.csdnimg.cn/direct/d761bc47f99b47799d80ea5f8149a5b7.png)
缓存双写一致性(笔记)
缓存更新方案 旁路缓存模式 这是比较多的 旁路缓存模式:缓存有就返回,没有数据库查询,放入缓存返回。 还有些常用缓存策略 读穿透模式 读穿透和旁路很相似,程序不需要关注从哪里读取数据,它只需要从缓存查询数据。…...
![](https://i-blog.csdnimg.cn/direct/f5ce024f1278480e864d91b1fb10f863.png)
Redis优化
一、Redis 高可用 在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正 常服务(99.9%、99.99%、99.999%等等)。 但是在Redis语境中,高可用的含义似乎要宽泛一些,除了…...
![](https://img-blog.csdnimg.cn/img_convert/480cb3acd57a8ef61cbdca3848b2f64d.png)
这3个不可或缺的Windows神器图片处理软件,良心好用
Umi-CUT Umi-CUT是一款功能强大的图片处理软件,主要用于批量处理图片。它具备多种实用功能,包括范围裁剪、自动去除黑边或白边、调整图片大小、压缩图片体积等。该软件通过先进的算法和智能识别技术,能够自动检测并移除图片中的黑边ÿ…...
![](https://i-blog.csdnimg.cn/direct/2b94670e930247ee8103b00810177412.png)
【C++】map和set的使用
前言:前面我们学习了STL中的string、vector、list等等,今天我们就进一步学习更复杂的容器,map和set。 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏分类:高质量C学习 👈 Ǵ…...
![](https://img-blog.csdnimg.cn/img_convert/858d7d3a9be9185f7103cab4c70fa3a6.png)
如何使用 SwiftUI 构建 visionOS 应用
文章目录 前言WindowsVolumes沉浸式空间结论 前言 Apple Vision Pro 即将推出,现在是看看 SwiftUI API 的完美时机,这使我们能够将我们的应用程序适应 visionOS 提供的沉浸式世界。苹果表示,构建应用程序的最佳方式是使用 Swift 和 SwiftUI。…...
![](https://i-blog.csdnimg.cn/direct/5c69648395684452a341e976c5895bc3.png#pic_center)
如何选择一家适合自己的商城源码?
商城源码的选择取决于多个因素,包括商城的功能需求、稳定性、易用性、可定制性以及价格等。启山智软作为在市场上被广泛认可且表现优异的商城源码提供商,具有以下的特点和优势: 特点①:国内知名的B2B2C开源商城源码系统ÿ…...
![](https://www.ngui.cc/images/no-images.jpg)
第10章:Electron应用打包与分发
第10章:应用打包与分发 在完成Electron应用开发后,最后一步是将应用打包并分发给最终用户。本章将介绍如何使用Electron的打包工具将应用打包成可执行文件,并介绍常见的分发策略和工具。 10.1 使用Electron Forge Electron Forge是一个现代…...
![](https://aliypic.oss-cn-hangzhou.aliyuncs.com/Uploadfiles/20240604/2024060414565025.001.png)
“翼”起降本盈运增效!欧曼星翼PRO自动挡中卡引领区域集散运输发展新趋势
在当前运输行业中,随着运价偏低、燃料价格偏高等因素影响,卡友对性价比更高的运输装备需求越发迫切。这一情况不止在重卡领域备受关注,在中卡行业里也成为卡友的心头大事!积极响应行业发展趋势,欧曼以重卡平台+自动挡双重赋能打造的欧曼星翼PRO自动挡中卡即将上市,深度契合用户…...
![](https://www.ngui.cc/images/no-images.jpg)
五菱高管发文“明年更卷”,消费者:车市越卷,我越幸福
日前,上汽通用五菱品牌事业部副总经理周钘在社交平台上发文称,“2024年初至今,宝骏停掉了所有的市场费用。企业认为如果产品、市场、渠道三者节奏都不对则是‘白费’”,“虽然今年行业确实卷,明年会更卷,但我们所有准备”。周钘从车企的角度,说出了车市竞争的残酷。不仅…...
![](https://www.ngui.cc/images/no-images.jpg)
全新领克01vs同级竞品:颜值与性能谁更胜一筹?
在这个追求个性与品质的时代,豪华SUV市场竞争愈发激烈。然而,全新领克01以其独特的外观设计、科技感十足的内饰配置以及卓越的性能表现,成功脱颖而出,成为了市场上的一颗璀璨明珠。它颠覆了传统豪华SUV的刻板印象,以全新的姿态定义了未来豪华SUV的新标准。与此同时,作为同…...
![](https://img-blog.csdnimg.cn/direct/ef6f63bece1b4618a55bf7c77962f907.png)
最长递增子序列,交错字符串
第一题: 代码如下: int lengthOfLIS(vector<int>& nums) {//dp[i]表示以第i个元素为结尾的最长子序列的长度int n nums.size();int res 1;vector<int> dp(n, 1);for (int i 1; i < n; i){for (int j 0; j < i; j){if (nums[i]…...
![](https://img-blog.csdnimg.cn/direct/c75142509b6b4623b6569aa0c9766198.png)
MySQL8找不到my.ini配置文件以及报sql_mode=only_full_group_by解决方案
一、找不到my.ini配置文件 MySQL 8 安装或启动过程中,如果系统找不到my.ini文件,通常意味着 MySQL服务器没有找到其配置文件。在Windows系统上,MySQL 8 预期使用my.ini作为配置文件,而不是在某些情况下用到的my.cnf文件。 通过 …...
![](https://www.ngui.cc/images/no-images.jpg)
机器学习-4-模型评估和混淆矩阵和ROC曲线
通透!详解混淆矩阵和ROC曲线 一文彻底理解 ROC/AUC 概念(Python) 参考小白也能看懂的 ROC 曲线详解 参考分类模型的 ROC AUC 是 0.8266,啥意思? 参考ROC曲线绘制(python+sklearn+多分类) 机器学习中的metrics.classification_report函数 1 ROC曲线 ROC曲线是一种坐标图式…...