Spring框架中的11种设计模式(设计模式之美)

适配器模式

例如Controller的三种实现方式:

  • @Controller注解
  • 实现Controller接口 + xml配置文件:配置DemoController与URL的对应关系
  • 实现Servlet接口 + xml配置文件:配置DemoController类与URL的对应关系

不同的Controller如何调用呢?可以通过适配器模式。

terface HandlerAdapter {boolean supports(Object var1);ModelAndView handle(HttpServletRequest var1, HttpServletResponse var2, Object var3) throws Exception;long getLastModified(HttpServletRequest var1, Object var2);
}// 对应实现Controller接口的Controller
public class SimpleControllerHandlerAdapter implements HandlerAdapter {public SimpleControllerHandlerAdapter() {}public boolean supports(Object handler) {return handler instanceof Controller;}public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return ((Controller)handler).handleRequest(request, response);}public long getLastModified(HttpServletRequest request, Object handler) {return handler instanceof LastModified ? ((LastModified)handler).getLastModified(request) : -1L;}
}// 对应实现Servlet接口的Controller
public class SimpleServletHandlerAdapter implements HandlerAdapter //AnnotationMethodHandlerAdapter对应通过注解实现的Controller,

策略模式

Spring AOP是通过动态代理来实现的。Spring支持两种动态代理实现方式,一种是JDK提供的动态代理实现方式,另一种是Cglib提供的动态代理实现方式。Spring会在运行时动态地选择不同的动态代理实现方式:策略模式包含三部分,策略的定义、创建和使用。

public interface AopProxy {Object getProxy();Object getProxy(ClassLoader var1);
}public interface AopProxyFactory {AopProxy createAopProxy(AdvisedSupport var1) throws AopConfigException;
}public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {public DefaultAopProxyFactory() {}public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {if (!config.isOptimize() && !config.isProxyTargetClass() && !this.hasNoUserSuppliedProxyInterfaces(config)) {return new JdkDynamicAopProxy(config);} else {Class<?> targetClass = config.getTargetClass();if (targetClass == null) {throw new AopConfigException("TargetSource cannot determine target class: Either an interface or a target is required for proxy creation.");} else {return (AopProxy)(!targetClass.isInterface() && !Proxy.isProxyClass(targetClass) ? new ObjenesisCglibAopProxy(config) : new JdkDynamicAopProxy(config));}}}//用来判断用哪个动态代理实现方式private boolean hasNoUserSuppliedProxyInterfaces(AdvisedSupport config) {Class<?>[] ifcs = config.getProxiedInterfaces();return ifcs.length == 0 || ifcs.length == 1 && SpringProxy.class.isAssignableFrom(ifcs[0]);}
}

组合模式

Spring Cache提供了一套抽象的Cache接口。使用它我们能够统一不同缓存实现(Redis、Google Guava…)的不同的访问方式。Spring中针对不同缓存实现的不同缓存访问类,都依赖这个接口,比如:EhCacheCache、GuavaCache、NoOpCache、RedisCache、JCacheCache、ConcurrentMapCache、CaffeineCache。Cache接口的源码如下所示:

public interface Cache {String getName();Object getNativeCache();Cache.ValueWrapper get(Object var1);<T> T get(Object var1, Class<T> var2);<T> T get(Object var1, Callable<T> var2);void put(Object var1, Object var2);Cache.ValueWrapper putIfAbsent(Object var1, Object var2);void evict(Object var1);void clear();public static class ValueRetrievalException extends RuntimeException {private final Object key;public ValueRetrievalException(Object key, Callable<?> loader, Throwable ex) {super(String.format("Value for key '%s' could not be loaded using '%s'", key, loader), ex);this.key = key;}public Object getKey() {return this.key;}}public interface ValueWrapper {Object get();}
}

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

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

相关文章

链表传一级指针以及leetcode做题有感

上个文章说要传二级指针&#xff0c;经过一段时间的学习之后才知道可以传一级指针&#xff1a; 之所以要传二级指针&#xff0c;是要改变一级指针的值&#xff0c;也就是把头节点的指针改变&#xff0c;如图&#xff1a; 从左边到右边&#xff0c;头指针 一级指针plist 的值发…

JS stacktrace 堆内存耗尽

javascript 堆内存耗尽 问题 是 npm run dev 的时候 报错 如下 <--- JS stacktrace --->FATAL ERROR: MarkCompactCollector: young object promotion failed Allocation failed - JavaScript heap out of memory在大多数情况下&#xff0c;默认情况下 Node.js 的堆内存…

【Cocoapods】最新安装指定版本Cocoapods记录

安装ruby https://blog.csdn.net/mydo/article/details/126918391 # 指定版本安装 sudo gem install -n /usr/local/bin cocoapods -v 1.9.3 接下来一定要注意&#xff01;注意&#xff01;注意&#xff01; 如果你的 Mac系统是 10.11 之前&#xff0c;输入&#xff1a; sud…

深入理解Transformer技术原理 | 得物技术

谷歌在2017年发布Transformer架构的论文时&#xff0c;论文的标题是&#xff1a;Attention Is All You Need。重点说明了这个架构是基于注意力机制的。 一、什么是注意力机制 在深入了解Transformer的架构原理之前&#xff0c;我们首先要了解下&#xff0c;什么是注意力机制。…

vulfocus靶场redis 未授权访问漏洞之CNVD-2015-07557

目标系统的权限不够redis用户无法写计划任务和公钥&#xff0c;而且也没有开放ssh端口。 主从复制getshell&#xff0c;写入恶意的so文件达到执行系统命令的目的。 github上有一键可以利用的脚本 https://github.com/n0b0dyCN/redis-rogue-server.git 利用条件&#xff1a;需…

二维数组在内存中的行存储和列存储

目录 例题&#xff1a; 0. BaseAddress 1. 行存储方式&#xff08;Row-major order&#xff09; 2. 列存储方式&#xff08;Column-major order&#xff09; 3. 解方程找到 i 和 j 行存储和列存储方式的区别 行存储方式&#xff08;Row-major order&#xff09;: 列存储…

逆向案例二十八——红某点集登录接口逆向序

网址&#xff1a;aHR0cHM6Ly93d3cuaHJkanl1bi5jb20vIy9sb2dpbj9yZWRpcmVjdD0lMkZyZWFsVGltZUxpdmluZw 登录接口&#xff0c;发现两个参数加密&#xff0c;分别是pwd和sig,t很明显是时间戳。 观察pwd,发现很像md5加密&#xff0c;我输入的密码是123456&#xff0c;在在线加密网…

Oracle SQL - HAVING和分析函数的执行顺序

分析函数是基于最终的结果集进行开窗的&#xff0c;所以HAVING比分析函数先执行 ↓ 没有HAVING时&#xff0c;MAX(col3) over()是A2 SQL> WITH subq_a AS2 (SELECT A col1, A1 col2, 10 col33 FROM dual4 UNION ALL5 SELECT A col1, A1 col2, -5 col36 F…

day81 session会话 文件上传

知识点&#xff1a; session 文件上传 一 session 1&#xff09;session&#xff1a;会话 在服务器端存储信息 指客户与服务器的会话 当用户通过浏览器访问服务器的某个页面时&#xff0c;在服务器开辟一个内存空间session 每个session 有唯一的id 2&#xff09;session过期 …

C——文件操作

1.前言 为什么要使用文件呢&#xff1f; 文件是储存在电脑的磁盘中的&#xff0c;如果没有文件&#xff0c;我们写程序的数据就会存储在电脑的内存中&#xff0c;程序退出&#xff0c;操作系统就会收回内存&#xff0c;数据就丢失了等再次运行程序的时候&#xff0c;是看不到…

【春秋云镜】CVE-2023-43291 emlog SQL注入

靶场介绍 emlog是一款轻量级博客及CMS建站系统&#xff0c;在emlog pro v.2.1.15及更早版本中的不受信任数据反序列化允许远程攻击者通过cache.php组件执行SQL语句。 不感兴趣的可以直接拉到最后面&#xff0c;直接获取flag 备注&#xff1a;没有通过sql注入获取到flag&…

汇编语言——将DX,AX组成的32位数逻辑左移3位

data segment data ends stack segment stacktop label worddw 100 dup (?) stack ends code segmentassume cs:code,ds:data,ss:stack main proc farmov ax,datamov ds,axmov ax,stackmov ss,axlea sp,top;0000 0001 1100 1010 | 0000 0010 0001 1111;逻辑左移三位后&#xf…

基于SpringBoot框架的智慧食堂

采用技术 基于SpringBoot框架实现的web的智慧社区系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 系统功能 系统首页 用户注册页面 菜品信息页面 …

spispio

SS:NSS( NOT SLAVE SELET )、CS( CHIP SELECT ) 同步&#xff1a;SCK引脚用于提供时钟信号&#xff0c;数据位的输出和输入都是在SCK的上升沿或下降沿进行&#xff0c;数据位的收发时刻因此得以确定。同步时序下时钟快慢或中途暂停都没问题。SCK相当于IIC通信下的SCL&#xff0…

Spark面试整理-如何在Spark中进行数据清洗和转换?

在Apache Spark中进行数据清洗和转换是数据处理流程中的一个重要步骤。这个过程涉及从原始数据中删除或修正不准确、不完整、不相关或不正确格式的数据,以及将数据转换成更适合分析的形式。以下是在Spark中进行数据清洗和转换的一些常见方法: 1. 读取数据 首先,需要从支持的…

Android 性能优化(七):APK安装包体积优化

包体积优化重要性 移动 App 特别关注投放转化率指标&#xff0c;而 App 包体积是影响用户新增的重要因素&#xff0c;而 App 的包体积又是影响投放转化率的重要因素。 Google 2016 年公布的研究报告显示&#xff0c;包体积每上升 6MB 就会带来下载转化率降低 1%&#xff0c; …

SpringBoot Jar包在CentOS7.x上注册成服务并开机启动

本文将介绍如何把SpringBoot Jar包在CentOS7.x上注册成服务并设置为开机启动。 在CentOS系统中&#xff0c;将Spring Boot应用程序打包成jar文件后&#xff0c;可以通过创建Systemd服务来将其部署为系统服务&#xff0c;并设置为开机启动。 以下是详细的步骤和说明&#xff1a…

直方图与核密度估计

技术背景 直方图是一种经常被用于统计的图形表达形式&#xff0c;简单来说它的功能就是用一系列的样本数据&#xff0c;去分析样本的分布规律。而直方图跟核密度估计(Kernel Density Estimation&#xff0c;KDE)方法的主要差别在于&#xff0c;直方图得到的是一个离散化的统计分…

【全开源】多功能完美运营版商城 虚拟商品全功能商城 全能商城小程序 智慧商城系统 全品类百货商城

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 完美运营版商城/拼团/团购/秒杀/积分/砍价/实物商品/虚拟商品等全功能商城 干干净净 没有一丝多余收据 还没过手其他站 还没乱七八走的广告和后门 后台可以自由拖曳修改前端UI页面 …

实名制重要性、PHP身份实名认证示例、身份证ocr识别核验

身份证丢失失&#xff0c;可能会被不法分子利用去贷款。虽然是被人冒名办理&#xff0c;客观上不承担责任&#xff0c;但会造成个人信用信息的困扰。因此&#xff0c;对于个人来讲&#xff0c;要妥善保管自己的身份证&#xff0c;避免不必要的麻烦。对于贷款机构来说&#xff0…