Spring(10. 面试问题简析)学习笔记

news2025/2/26 7:07:10

上一篇:9. Spring 底层原理

文章目录

  • 1. 对Spring的IOC机制的理解
  • 2. 对spring的AOP机制的理解
  • 3. 了解过cglib动态代理吗?他跟jdk动态代理的区别是什么?
  • 4. 能说说Spring中的Bean是线程安全的吗?
  • 5. Spring的事务实现原理是什么?能聊聊你对事务传播机制的理解么?
  • 6. 画一张图说说spring boot的核心框架?
  • 7. 画一张图说说spring的核心框架?
  • 8. Spring中使用了哪些设计模式
  • 9. 能说一说springMvc的核心架构么?

1. 对Spring的IOC机制的理解

  • IOC叫控制反转其目的就是为了降低程序的耦合性,这是一种设计思想。IOC 控制反转 意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。

    • 存在一个类 myServiceImpl 实现了 myService 接口,如果在代码中大量使用 new 的方式直接创建了一个 myServiceImpl 对象进行使用,那这些直接使用的地方就和 myServiceImpl 类直接耦合在一起了
    • 若此时不想使用 myServiceImpl ,想要换为 newMyServiceImpl (同样实现 myService),那就需要对所有直接使用的地方进行修改,并且需要重新测试
    • 如上述示例所说,如果代码中各个类完全耦合在一起,出现任何一点变动,都需要修改大量代码,非常复杂
    • 使用 IOC 机制后,实例都是由容器创建的,所以在修改的话,只需要修改注册到容器中的类即可
  • Spring 容器,根据 XML/注解的配置实例化 Bean 对象,然后再根据 XML/注解,对 Bean 之间的引用关系进行依赖注入,让类与类之间彻底解耦,维护代码的时候可以更加轻松
    在这里插入图片描述

  • 底层的核心技术就是反射。利用反射直接根据你的类去构建对应的对象。

  • 依赖注入(Dependency Injection,DI)由容器动态的将某个依赖关系注入到组件之中。

在这里插入图片描述

2. 对spring的AOP机制的理解

  • ​ AOP(Aspect-Oriented Programming:面向切面编程),能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。

  • AOP 使用场景 : 日志系统 、安全统一效验、事务

  • Spring AOP就是基于动态代理的,

  • 通过以下简单示例,简述基本原理:

    • 原先有这样一个方法:
      对这个方法的切面进行编程
    public class MyServiceAImpl implements MyServiceA{
    	public void doServiceA(){
    		……
    	}
    }
    
    • 动态代理后,会生成一个代理对象
      将原对象注入进来,并且重写方法,将切面中定义的操作加在方法中相应的位置
    public class ProxyMyServiceA implements MyServiceA{
    	privice MyServiceA myServiceA;
    	public void doServiceA(){
    		// 切面封装的方法
    
    		// 调用执行原本的方法
    		myServiceA.doServiceA();
    
    		// 切面封装的方法
    	}
    }
    
    • 调用 MyServiceA 的地方
      此时调用的地方注入的不再是原始的 MyServiceImpl ,而是代理对象 ProxyMyServiceA
    public class MyControllerA{
    	@Autowired
    	privice MyServiceA myServiceA;
    }
    

3. 了解过cglib动态代理吗?他跟jdk动态代理的区别是什么?

  • 动态代理:其实就是动态的创建一个代理类,并创建这个代理类的实例对象,在这个里面引用原来类的方法,然后所有方法的调用,都是先走代理类的对象,代理类负责做一些代码上的增强
  • Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理
  • JDK 动态代理:
    • 目标类实现了某个接口时使用
    • 生成一个代理类,这个代理类会实现和原视类同样的接口,然后通过反射来调用目标类中的代码,动态地将横切逻辑和业务编织在一起
  • CGLIB 动态代理:
    • 目标类没有实现任何接口时使用
    • 会在运行时动态的生成目标类的一个子类对象,然后覆盖其中特定方法并添加增强代码

4. 能说说Spring中的Bean是线程安全的吗?

  • Spring 容器中的 Bean 的 五种作用域,(绝大部分的时候,使用的都是单例的)

    • singleton : 单例,默认作用域,容器中只有一个 Bean 实例,单例的。
    • prototype : 原型,原型每次请求都会创建一个 新的bean实例。
    • request : 请求,每一次HTTP请求都会产生一个新的bean,该bean仅 在当前HTTP request内有效。
    • session : 会话,每一次HTTP请求都会产生一个新的bean, 该bean仅在当前HTTP session内有效。
    • global-session : 全局session作用域,仅仅在基于portlet的web应用中才有意义,Spring5已经没有了。Portlet是 能够生
  • Spring 中的 Bean 本身是线程不安全的,但是存在以下几种情况下,可以是线程安全的。

在这里插入图片描述

  • 如上图,Tomcat 会使用多个线程并发的去处理多个请求,这些线程并发的访问多个组件,因为大多使用的是单例的 Bean ,所以这些请求会访问到同一个实例对象中,如果在该对象中存在写操作,此时就是线程不安全的
  • 但是以下几种情况下,也可以是线程安全的
    • 不存在对内存数据的写操作
    • 通过各个组件的互相调用,最终访问到数据库
    • 代码中使用了线程安全的数据结构、方法

5. Spring的事务实现原理是什么?能聊聊你对事务传播机制的理解么?

  • 事务的实现原理:

    • 如果在方法上加了 @Transactional 注解
    • 此时 Spring 会采用 AOP 的思想拦截注解,在方法执行前开始事务,在方法执行完成后,根据执行结果来决定是回滚还是提交
  • 事务传播机制

    • 方法A 和 方法B 都使用了 @Transactional 注解,并且在 A 中调用了 B, 此时就涉及到事务的传播机制

    • 7 中事务的传播机制/级别

      支持当前事务的情况:

      1. TransactionDefinition.PROPAGATION_ REQUIRED:(默认使用)
        • 如果当前存在事务, 则加入该事务;(也即: 开启事务 -> 执行方法A -> 执行方法 B -> 提交/回滚 )
        • 如果当前没有事务,则创建一个新的事务。
      2. TransactionDefinition.PROPAGATION_ SUPPORTS:
        • 如果当前存在事务,则加入该事务;
        • 如果当前没有事务,则以非事务的方式继续运行。
      3. TransactionDefinition.PROPAGATION_ MANDATORY:
        • 如果当前存在事务,则加入该事务;
        • 如果当前没有事务,则抛出异常。(mandatory: 强制性)
      4. TransactionDefinition.PROPAGATION_ REQUIRES_ NEW:
        • 创建一个新的事务。
          在这里插入图片描述
      5. TransactionDefinition.PROPAGATION_ NOT_ SUPPORTED:
        • 以非事务方式运行
      6. TransactionDefinition.PROPAGATION_ NEVER:
        • 以非事务方式运行,如果当前存在事务,则抛出异常。:
      7. TransactionDefinition.PROPAGATION_ NESTED:
        • 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_ REQUIRED。
          在这里插入图片描述

6. 画一张图说说spring boot的核心框架?

  • Spring Boot 是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重xml的配置,提供了各种启动器,在运行过程中自定配置。
  • Spring Boot 启动时会启动内嵌的 Tomcat,并且将 Spring MVC、Mybatis …… 核心组件自动注入进容器。当需要使用到这些组件时,直接使用容器中的组件

7. 画一张图说说spring的核心框架?

在这里插入图片描述

  • 使用 BeanDefinitionReader 接口读取 Bean 的基本信息
  • 读取 Bean 的定义信息,在读取之前可以通过 BeanFactoryPostProcesser 修改一些 Bean 的定义信息
  • 对象工厂(BeanFactory)通过反射的方式获取 Bean 的实例化对象,在类实例化的过程中,可以自定义很多 BeanPostProcesser,来完整 Bean 的实例化,增强某些功能,这些就是 Spring 容器对象

8. Spring中使用了哪些设计模式

  1. 工厂设计模式 : 把一个对象的创建过程封装到一个工厂里
    • Spring 使用工厂模式通过 BeanFactor 创建 bean 对象。
    • Spring 本身就是一个大工厂,把所有的 Bean 实例都放在容器里,需要用到的时候,不用创建,直接去容器里获取就好
  2. 代理设计模式 : Spring AOP 功能的实现。通过动态代理增强切面
  3. 单例设计模式 : Spring 中的 Bean 默认都是单例的。
  4. 模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
  5. 包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
  6. 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
  7. 适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。

9. 能说一说springMvc的核心架构么?

在这里插入图片描述

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

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

相关文章

Leetcode-二叉树

1.中序-后序构建二叉树 106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode) 1. 首先根据后序(左右中)确定顶点元素; 2. 根据顶点元素划分中序序列; 3. 根据划分中序序列中-左子树的长度,进…

半小时学会HTML5

一、了解几个概念 1、HTML定义 HTML是(Hyper Text Markup Language)超文本标记语言,超文本包含:文字、图片、音频、视频、动画等。 2、W3C 是什么? W3C 即(World Wide Web Consortium) 万维…

【性能测试】常见适用场景以及策略

面对日益复杂的业务场景和不同的系统架构,前期的需求分析和准备工作,需要耗费很多的时间。而不同的测试策略,也对我们的测试结果是否符合预期目标至关重要。 这篇博客,聊聊我个人对常见的性能测试策略的理解,以及它们…

RK3399 Android 10 Camera2保存录像时缩略图获取为空

RK3399 Android 10相机录像保存时无法获取缩略预览图 先找到录像点击按钮 //点击快门按钮时可以通过log打印看到停止录像的流程onShutterButtonClick() //这里主要看停止的流程即stop true时会进入onStopVideoRecording方法 public void onShutterButtonClick() {Log.d(TAG…

【HAL库】BMP180气压传感器+STM32,hal库移植

BMP180气压传感器STM32 1 导入.c.h文件(不再赘述,详细见LED部分)2 Cubemx配置3 修改 .h 文件4 测试 将BMP180从标准库移植到HAL库。模拟IIC。 极简工程代码如下: https://github.com/wyfroom/HAL_BMP180 该份代码硬件配置&#x…

C++——深入探究函数重载

文章目录 概述函数重载函数重载的概念函数重载的细节 C支持函数重载的原理——名字修饰(name Mangling) 概述 本篇博客讲诉的是c函数重载是什么,以及了解其种的一些特征以及重载函数的意义,并且运用linux中的g编译器简单探究一下函数重载底层是如何实现的…

线性表之顺序表(增删查改)详解

🍕博客主页:️自信不孤单 🍬文章专栏:数据结构与算法 🍚代码仓库:破浪晓梦 🍭欢迎关注:欢迎大家点赞收藏关注 文章目录 🍉线性表🍒顺序表1. 概念及结构2. 接口…

数据库JDBC

数据库厂商提供一个程序来完成 API 的转换,对原生 API 封装再提供成JDBC 的形状。 这个程序叫数据库驱动包。 JAVA程序员要想对数据库开发, 就要导入对应的数据库驱动包,才能编写代码。 数据库驱动是让JDBC认识数据库API URL 计算机里的一…

MySQL安装与新用户的创建相关

一、MySQL安装 1. 官网下载mysql的ims包 MySQL :: Download MySQL Installer (Archived Versions) 下载好,双击运行。 2. 根据提示进行安装 这里选择手动安装的选项: 然后选择你安装的MySQL版本,这里是5.7 勾选自定义MySQL安装位置 下一…

教育大数据总体解决方案(7)

考勤查询 创客教室 为体现学校创新教育的成果,丰富学校创新实践活动,加强创新课程普及教育,把机器人创新教育作为学校的教育特色来体现,使学生通过理论与实践相结合的方法,进一步学习掌握机械、电子结构、信息技术、人…

让我们谈谈你对 ThreadLocal 的理解

介绍 ThreadLocal 从 JDK1.2 开始,ThreadLocal 是一个被用来存储线程本地变量的类。在 ThreadLocal 中的变量在线程之间是独立的。当多个线程访问 ThreadLocal 中的变量,它们事实上访问的是自己当前线程在内存中的变量,这能确保这些变量是线…

基于鲸鱼算法的极限学习机(ELM)回归预测-附代码

基于鲸鱼算法的极限学习机(ELM)回归预测 文章目录 基于鲸鱼算法的极限学习机(ELM)回归预测1.极限学习机原理概述2.ELM学习算法3.回归问题数据处理4.基于鲸鱼算法优化的ELM5.测试结果6.参考文献7.Matlab代码 摘要:本文利用鲸鱼算法对极限学习机进行优化,并…

kettle——数据清洗(数据表——>转换——>数据表)

目录 1、表输入 ①点击“新建”选项,新建数据库 ②选择“获取SQL” ③选择表a ④注意:字段只显示了5个,而一共有6个字段,money字段需要手动添加 2、转换 ①打开java 控件,设置变量 3、表输出 ①连接表b ②映…

【Redis7】Redis7 复制(重点:复制原理)

【大家好,我是爱干饭的猿,本文重点介绍Redis7 复制。 后续会继续分享Redis7和其他重要知识点总结,如果喜欢这篇文章,点个赞👍,关注一下吧】 上一篇文章:《【Redis7】Redis7 事务&管道&…

Git入门指南(手把手教学)

Git入门指南 一、什么是Git二、Git的安装下载三、git的简单实践1.创建git仓库2.Windows上生成公钥以绑定GitHub仓库3.写一个Helloworld 四、帮助学习的网站 一、什么是Git Git是一种分布式版本控制系统,它是由Linus Torvalds为了管理Linux内核开发而开发的。与中心化…

项目第四天

解决了路变墙 墙变路的问题 void onechange(ExMessage* msg) {if (msg->message WM_LBUTTONDOWN && msg->x > 50 && msg->x < 410 && msg->y > 50 && msg->y < 410){//printf("鼠标位置&#xff1a;x&#…

Vue.js中class与style的增强绑定

目录 一、v-bind绑定class属性 &#xff08;1&#xff09;绑定class样式&#xff0c;字符串写法 &#xff08;2&#xff09;绑定class样式&#xff0c;数组写法 &#xff08;3&#xff09;绑定class样式&#xff0c;对象写法 二、v-bind绑定内联样式style &#xff08;1&…

【CSS3】CSS3 属性选择器 ( CSS3 简介 | 属性选择器 | 属性选择器权重 )

文章目录 一、CSS3 简介二、CSS3 属性选择器权重三、CSS3 属性选择器 一、CSS3 简介 CSS3 是在 CSS2 基础上进行扩展后的样式 ; 在 移动端 对 CSS3 的支持 要比 PC 端支持的更好 , 建议在移动端开发时 , 多使用 CSS3 ; PC 端老版本浏览器不支持 CSS3 , 尤其是 IE 9 及以下的版…

【Linux 裸机篇(五)】I.MX6ULL BSP工程管理下的 Makefile编写、链接脚本

目录 一、BSP 工程二、Makefile三、链接脚本 一、BSP 工程 文件夹描述bsp存放驱动文件imx6ul存放跟芯片有关的文件&#xff0c;比如 NXP 官方的 SDK库文件obj存放编译生成的.o 文件project存放 start.S 和 main.c 文件&#xff0c;也就是应用文件 二、Makefile 1 CROSS_COMPI…

ESP32设备驱动-BMA400加速度传感器驱动

BMA400加速度传感器驱动 文章目录 BMA400加速度传感器驱动1、BMA400介绍2、硬件准备3、软件准备4、驱动实现1、BMA400介绍 BMA400 是第一款真正的超低功耗加速度传感器,不会影响性能。 BMA400 具有 12 位数字分辨率、连续测量和定义的可选带宽以及超低功耗,允许对三个垂直轴…