面试官:Spring中用了哪些设计模式?

2023-05-16

spring中常用的设计模式达到九种,我们举例说明。

以后再也不怕面试官问我:Spring中用了哪些设计模式了。

1.简单工厂模式

又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。

简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。

spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。如下配置,就是在 HelloItxxz 类中创建一个 itxxzBean。

<beans>
  <bean id="singletonBean" class="com.itxxz.HelloItxxz">
     <constructor-arg>
       <value>Hello! 这是singletonBean</value>
     </constructor-arg>
 </ bean>
 <bean id="itxxzBean" class="com.itxxz.HelloItxxz"  singleton="false">
   <constructor-arg>
       <value>Hello! 这是itxxzBean! </value>
   </constructor-arg>
 </bean>
</beans>

2.工厂方法模式
通常由应用程序直接使用new创建新的对象,为了将对象的创建和使用相分离,采用工厂模式,即应用程序将对象的创建及初始化职责交给工厂对象。

一般情况下,应用程序有自己的工厂对象来创建bean.如果将应用程序自己的工厂对象交给Spring管理,那么Spring管理的就不是普通的bean,而是工厂Bean。

就以工厂方法中的静态方法为例讲解一下:

import java.util.Random;
public class StaticFactoryBean {
 public static Integer createRandom() {
      return new Integer(new Random().nextInt());
  }
}

建一个config.xm配置文件,将其纳入Spring容器来管理,需要通过factory-method指定静态方法名称:

<bean id="random"
class="example.chapter3.StaticFactoryBean" factory-method="createRandom"
scope="prototype"
/>

测试:

public static void main(String[] args) {
//调用getBean()时,返回随机数.如果没有指定factory-method,会返回StaticFactoryBean的实例,即返回工厂Bean的实例      
XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("config.xml"));      
System.out.println("我是IT学习者创建的实例:"+factory.getBean("random").toString());
}

3.单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
spring中的单例模式完成了后半句话,即提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例,这是因为spring管理的是是任意的java对象。

核心提示点:Spring下默认的bean均为singleton,可以通过singleton=“true|false” 或者 scope="?"来指定。

4.适配器模式
在Spring的Aop中,使用的Advice(通知)来增强被代理类的功能。Spring实现这一AOP功能的原理就使用代理模式(1、JDK动态代理。2、CGLib字节码生成技术代理。)对类进行方法级别的切面增强,即,生成被代理类的代理类, 并在代理类的方法前,设置拦截器,通过执行拦截器重的内容增强了代理方法的功能,实现的面向切面编程。
Adapter类接口:Target

public interface AdvisorAdapter {

boolean supportsAdvice(Advice advice);

 MethodInterceptor getInterceptor(Advisor advisor);

} MethodBeforeAdviceAdapter类,Adapter
class MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable {

 public boolean supportsAdvice(Advice advice) {
       return (advice instanceof MethodBeforeAdvice);
 }

 public MethodInterceptor getInterceptor(Advisor advisor) {
       MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice();
 return new MethodBeforeAdviceInterceptor(advice);
 }

}

5.包装器模式

在我们的项目中遇到这样一个问题:我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。我们以往在spring和hibernate框架中总是配置一个数据源,因而sessionFactory的dataSource属性总是指向这个数据源并且恒定不变,所有DAO在使用sessionFactory的时候都是通过这个数据源访问数据库。

但是现在,由于项目的需要,我们的DAO在访问sessionFactory的时候都不得不在多个数据源中不断切换,问题就出现了:如何让sessionFactory在执行数据持久化的时候,根据客户的需求能够动态切换不同的数据源?我们能不能在spring的框架下通过少量修改得到解决?是否有什么设计模式可以利用呢?

首先想到在spring的applicationContext中配置所有的dataSource。这些dataSource可能是各种不同类型的,比如不同的数据库:Oracle、SQL Server、MySQL等,也可能是不同的数据源:比如apache 提供的org.apache.commons.dbcp.BasicDataSource、spring提供的org.springframework.jndi.JndiObjectFactoryBean等。然后sessionFactory根据客户的每次请求,将dataSource属性设置成不同的数据源,以到达切换数据源的目的。

spring中用到的包装器模式在类名上有两种表现:一种是类名中含有Wrapper,另一种是类名中含有Decorator。基本上都是动态地给一个对象添加一些额外的职责。

6.代理模式

为其他对象提供一种代理以控制对这个对象的访问。 从结构上来看和Decorator模式类似,但Proxy是控制,更像是一种对功能的限制,而Decorator是增加职责。
spring的Proxy模式在aop中有体现,比如JdkDynamicAopProxy和Cglib2AopProxy。

7.观察者模式
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
spring中在实例化对象的时候用到Strategy模式
在SimpleInstantiationStrategy中有如下代码说明了策略模式的使用情况:
在这里插入图片描述
9.模板方法模式
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

Template Method模式一般是需要继承的。这里想要探讨另一种对Template Method的理解。spring中的JdbcTemplate,在用这个类时并不想去继承这个类,因为这个类的方法太多,但是我们还是想用到JdbcTemplate已有的稳定的、公用的数据库连接,那么我们怎么办呢?我们可以把变化的东西抽出来作为一个参数传入JdbcTemplate的方法中。但是变化的东西是一段代码,而且这段代码会用到JdbcTemplate中的变量。怎么办?那我们就用回调对象吧。

在这个回调对象中定义一个操纵JdbcTemplate中变量的方法,我们去实现这个方法,就把变化的东西集中到这里了。然后我们再传入这个回调对象到JdbcTemplate,从而完成了调用。这可能是Template Method不需要继承的另一种实现方式。

以下是一个具体的例子:
JdbcTemplate中的execute方法
在这里插入图片描述
JdbcTemplate执行execute方法
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试官:Spring中用了哪些设计模式? 的相关文章

随机推荐

  • 树莓派4B上手教程 2.SSH安装及相关设置

    SSH简介 SSH是一种网络协议 xff0c 用于计算机之间的加密登录 如果一个用户从本地计算机 xff0c 使用SSH协议登录另一台远程计算机 xff0c 我们就可以认为 xff0c 这种登录是安全的 xff0c 即使被中途截获 xff0
  • Ubuntu4B上手教程 3.5如何关闭虚拟桌面

    暑假马上要完事了 树莓派也跟着我要换网络环境 现在的树莓派 虽说插上电就能用 但是也得是同一局域网下 到学校wifi就换了 不知道怎么在ssh和vnc都用不了的情况下让树莓派连接新的WiFi 于是今天想着把虚拟桌面先关掉它 学校起码有显示器
  • 树莓派4B上手教程 4.ROS2不换源安装

    安装ROS对于大多数人来说是一个比较不好的回忆 再难受也得一步一步来啊 不多说了 分享一下我安装ROS2的一些经验 安装环境 我的安装环境是树莓派4B 烧的Ubuntu22 04LTS桌面版镜像 对应的ROS版本是ros2 humble 安
  • 苹果输入法自动合并两个短横线/减号的解决方法

    最近在学MD的时候学到了表格 xff0c 怎么打都打不出来 仔细一看发现在连着打两个横线的时候 xff0c 他合到了一起了 解决方法 设置 通用 键盘 智能标点 Off 问题解决
  • (一篇绝杀)考研英语二阅读题型与技巧总结

    目录 题型一 xff1a 词汇 短语 句子题 xff08 indicate xff09 题型二 xff1a 推断题 xff08 inferred implicit indicate xff09 题型三 xff1a 判断题 xff08 EXC
  • Cache 和 Buffer 都是缓存,主要区别是什么?

    提到这个问题 xff0c 可能意味着你意识到了两者的相关性 的确 xff0c 他们确实有那么一些联系 首先cache是缓存 xff0c buffer是缓冲 xff0c 虽然翻译有那么一个字的不同 xff0c 但这不是重点 个人认为他们最直观
  • C++课后练习

    题目需求 xff1a 编写一个程序 xff0c 它要求用户首先输入其名 xff0c 再输入其姓 然后程序使用一个逗号和空格组合起来 xff0c 并存储和显示组合结果 请使用char数组和头文件cstring 中的函数 xff0c 下面是该程
  • 像睿智一样简单地使用 Shiro

    加我微信索要我正在使用的 Apacher Shiro参考手册中文版学习 pdf 我们一起学习吧 Apache Shiro 中文文档 Apache Shiro 教程 Docs4dev Apache Shiro 是一个功能强大且易于使用的 Ja
  • Zookeeper 安装

    单机版 1 下载 tar gz 2 解压到 usr local zookeeper 下 3 在任何地方 xff08 我是在zookeeper bin 同级下 xff09 创建一个data文件夹 xff0c 用于存放运行时缓存数据 4 在 c
  • 【推荐系统算法之多任务学习】

    推荐系统算法之多任务学习 引言多任务学习设计思路ESMM模型实验 MMOE模型 引言 本文主要是在组队学习 xff0c pytorch复习推荐模型课程中 xff0c 学习课程笔记进行的总结 多任务学习 多任务学习是指模型在同一时间可以学习多
  • Idea快捷键

    1 进入 返回方法快捷键 Ctrl 43 B 进入光标所在方法定义的地方或返回该方法被使用的地方 xff08 代替Ctrl 43 鼠标点击方法进入方式 xff0c 避免了手指在键盘和鼠标之间切换 xff0c 非常好用的快捷键 xff09 C
  • ASP.NET C# 获取当前日期 时间 年 月 日 时 分 秒

    转贴 xff09 在 ASP net c 中 我们可以通过使用DataTime这个类来获取当前的时间 通过调用类中的各种方法我们可以获取不同的时间 xff1a 如 xff1a 日期 xff08 2008 09 04 xff09 时间 xff
  • ASP.NET中的几种弹出框提示基本方法

    NET程序的开发过程中 xff0c 常常需要和用户进行信息交互 xff0c 对话框的出现将解决了这些问题 xff0c 下面是本人对常用对话框使用的小结 xff0c 希望对大家有所帮助 我们在 NET程序的开发过程中 xff0c 常常需要和用
  • 单链表的就地逆置(头插,就地,递归)

    http blog csdn net lycnjupt article details 47103433 https blog csdn net v xchen v article details 53067448 单链表的就地逆置是指辅助
  • Panads(四):数据清洗——对缺失值的处理

    文章目录 一 处理缺失值的四个函数二 使用1 1 数据样子1 2 处理 一 处理缺失值的四个函数 isnull函数 xff1a 检测是否是空值 xff0c 可用于df和series notnull函数 xff1a 检测是否是空值 xff0c
  • 单片机数字钟(调时,调时闪烁,万年历,年月日)超详细解析

    2019 07 13 单片机数字钟 xff08 调时 xff0c 调时闪烁 xff0c 万年历 xff0c 年月日 xff09 超详细解析 发表日期 xff1a 2019 07 13 单片机开发板 xff1a 巫妖王2 0 xff0c 使用
  • MATLAB轨迹规划 发给ROS中机器人实现仿真运动

    MATLAB轨迹规划 发给ROS中机器人实现仿真运动 现象如图所示 xff1a 0 matlab 与 ROS 通信 xff1a https blog csdn net qq 40569926 article details 11216287
  • 树莓派 Ubuntu mate 16.04使用VNC开启远程桌面

    1 安装 vncserver sudo apt span class token operator span get span class token operator span y install vnc4server 2 启动 vncs
  • js for in 循环出现bug

    这样使用for in循环时可能会有一种bug for let item in list 原因 xff1a for in循环会把某个类型的原型 prototype 中方法与属性给遍历出来 xff0c 所以这可能会导致代码中出现意外的错误 解决
  • 面试官:Spring中用了哪些设计模式?

    spring中常用的设计模式达到九种 xff0c 我们举例说明 以后再也不怕面试官问我 xff1a Spring中用了哪些设计模式了 1 简单工厂模式 又叫做静态工厂方法 xff08 StaticFactory Method xff09 模