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

devtools/2024/9/23 10:21:10/

适配器模式

例如Controller的三种实现方式:

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

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

java">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会在运行时动态地选择不同的动态代理实现方式:策略模式包含三部分,策略的定义、创建和使用。

java">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接口的源码如下所示:

java">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.ppmy.cn/devtools/4206.html

相关文章

权威Scrum敏捷开发企业级实训/敏捷开发培训课程

课程简介 Scrum是目前运用最为广泛的敏捷开发方法&#xff0c;是一个轻量级的项目管理和产品研发管理框架。 这是一个两天的实训课程&#xff0c;面向研发管理者、项目经理、产品经理、研发团队等&#xff0c;旨在帮助学员全面系统地学习Scrum和敏捷开发, 帮助企业快速启动敏…

Git的工作流程概述

Git的工作流程涵盖了从初始化本地仓库、日常开发操作到协作与发布的整个过程。以下是一个简要的Git工作流程概述&#xff1a; 1. 初始化仓库&#xff1a; ○ 在本地创建一个新的目录&#xff0c;进入该目录并通过 git init 命令将其初始化为一个Git仓库。 2. 添加文件到版…

移除离群点------PCL

statisticalOutlierRemoval滤波器移除离群点 /// <summary> /// 使用statisticalOutlierRemoval滤波器移除离群点 /// </summary> /// <param name"cloud">被过滤的点云</param> /// <param name"meank"></param> //…

springboot抑郁症科普知识测试系统ssm-java

本系统设计了二种角色&#xff1a;管理员&#xff0c;用户。通过此系统&#xff0c;管理员可以在线视频、案例展示、、测试试卷、测试试题进行测试。以及在线对测试试卷进行批阅和批量删除&#xff0c;用户可以对自己的测试试卷进行测试&#xff0c;对管理员已经批阅过的试卷可…

uniapp picker 多列选择器用法

uniapp picker 多列选择器联动筛选器交互处理方法&#xff0c; uniapp 多列选择器 mode"multiSelector" 数据及筛选联动交互处理&#xff0c; 通过接口获取数据&#xff0c;根据用户选择当前列选项设置子列数据&#xff0c;实现三级联动效果&#xff0c; 本示例中处…

Pytorch 之torch.nn初探 卷积--Convolution Layers

任务描述 本关任务&#xff1a; 本关提供了一个Variable 类型的变量input&#xff0c;按照要求创建一 Conv1d变量conv&#xff0c;对input应用卷积操作并赋值给变量 output&#xff0c;并输出output 的大小。 相关知识 卷积的本质就是用卷积核的参数来提取原始数据的特征&a…

适用于Windows电脑的最佳数据恢复软件是哪些?10佳数据恢复软件

丢失我们系统中可用的宝贵信息是很烦人的。我们可以尝试几种手动方法来重新获取丢失的数据。然而&#xff0c;当我们采用非自动方法来恢复数据时&#xff0c;这是一项令人厌烦和乏味的工作。在这种情况下&#xff0c;我们可以尝试使用一些正版硬盘恢复软件进行数据恢复。此页面…

《组合实体模式(极简c++)》

本文章属于专栏- 概述 - 《设计模式&#xff08;极简c版&#xff09;》-CSDN博客 模式说明 方案&#xff1a;组合实体模式是一种结构型设计模式&#xff0c;旨在将一组对象组合成单个对象实体来处理。这个实体统一对外提供操作&#xff0c;而不需要直接操作每个对象。优点&…