Java 面试题之框架

1. Spring 是什么

Sping 是包含了众多工具方法的 IOC 容器,IOC是控制反转,说的是对象的创建和销毁的权利都交给 Spring 来管理了, 它本身又具备了存储对象和获取对象的能力. 

容器:字面意思,用来容纳某种物品的装置。

比如 List/Map -》数据存储容器;Tomcat -》web容器;

而 Spring 也是一个容器,Spring 是一个 IOC 容器:

那么 IOC 是什么呢

IOC 就是控制反转,也就是 Spring 是一个 控制反转 的容器。

控制反转:之前的控制权是在我,现在反转了,也就是我把控制权交给了框架,下次我再要使用对象的时候,只需要告诉框架,我要使用这个对象。所以现在这个对象的生命周期我就不在关注了。

IOC 优点:实现代码的解耦,

Spring IoC 容器最核心的功能:

将 Bean (对象) 存储到 Spring (容器) 中
将 Bean (对象) 从 Spring (容器) 中取出来 
Spring 的特点:轻量级、控制反转、AOP、声明式事务管理(注解或XML)、框架整合、测试支持。

2. 依赖注入和依赖查找的区别

区别:依赖注入是将依赖关系委托给容器,由容器来管理对象之间的依赖关系;

而依赖查找是由对象自己来查找它所依赖的对象,容器只负责管理对象的生命周期。

3. DI 和 IOC 的区别是什么

对于 Spring 容器来说:

IOC是一种思想:控制反转,定义了对象创建和依赖关系处理的方式;

DI是一种实现:依赖注入,实际提供对象依赖关系的注入功能;

4. ApplicationContext 和 BeanFactory 的区别

相同点:ApplicationContext 和 BeanFactory 效果是⼀样的, 都可以实现从容器中获取 bean,都提供了 getBean 的方法.

不同点:

从继承关系和功能方面来看: BeanFactory 提供了基础的访问容器的能力,

而 Application 属于 BeanFactory 的子类,它除了继承了 BeanFactory 的所有功能外,它还拥有独特的特性,还添加了对国际化支持,资源访问支持,以及事件传播等方面的支持.

从性能方面来看: Application 是一次加载并初始化所有的 Bean 对象(饿汉方式),

而 BeanFactory 是需要哪个才去加载哪个,所以更加的轻量(懒汉方式)

5. Sping 存储 Bean 对象的五大注解

  1. Controller 控制存储
  2. Service 服务存储
  3. Repository 仓库存储
  4. Configuration 配置存储
  5. Component 组件存储

6. Bean 对象的注入方式,以及有什么区别

  1. 属性注入:写法简单,所以日常使用频率最高,但只适用于IOC容器,通用性不好;
  2. 构造方法注入:从 Spring 3.4 后官方推荐的是构造方法注入,它可以注入不可变对象,并且能保证注入的对象一定是初始化过的,其通用性也更好。
  3. setter 注入:Spring 官方从3.4 之后就不推荐这种写法了,其通用性没构造方法注入通用;

7. @AutoWired 和 @Resource 的区别

相同点:都可以实现将一个对象注入到类中;

不同点:

出身不同:@Resource 来自于 JDK 中,@AutoWired 来自于 Spring 框架;

用法不同:@Resource 用于 属性注入/Setter 注入,@AutoWired 用于 属性注入/构造方法注入/Setter 注入;

支持的参数不同:@Resource 支持更多的参数设置 name/type....,而 @AutoWired 只支持 required 参数设置;

8. AutoWired 底层是如何实现的

Spring 中 @AutoWired 注解是通过 DI(依赖注入)实现的;

可以理解为,当 Spring 容器启动时,它会扫描应用程序中所有的 Bean,并将它们存储在一个 BeanFactory 中。当应用程序需要使用某个 Bean 时,Spring 容器会自动将该 Bean 注入到应用程序中。

再往下理解也可以说,DI 是通过 Java 反射机制实现的。具体来说,当 Spring 容器需要注入某个 Bean 时,它会使用 Java 反射机制来查找符合条件的 Bean,并将其注入到应用程序中。

所以说,@Autowired 注解是通过 DI 的方式,底层通过 Java 的反射机制来实现的。

9. Bean 将一个对象注入多次

  1. 精确的描述 Bean 的名称(将注入的名字写对)。
  2. 使用 @Resource 设置 name 的方式来重命名注入对象。
  3. 如果限定不能单独使用 @AutoWired,那就可以再加上使用 @Qualifier,来删选 Bean 对象。

10. Bean 有几种作用域

  1. singleton: 单例模式 (默认,每次请求取的是同一个对象)
  2. prototype: 原型模式 (多例模式,每次请求创建一个新的对象)
  3. request: 请求作用域 ( 表示在一次 HTTP 请求中只存在一个 Bean 实例。在同一个请求中,多次请求该 Bean 时都会返回同一个实例。不同的请求之间,该 Bean 的实例是相互独立的)
  4. session: 会话作用域 (表示在一个 HTTP Session 中只存在一个 Bean 实例。在同一个 Session 中,多次请求该 Bean 时都会返回同一个实例。不同的 Session 之间,该 Bean 的实例是相互独立的)
  5. application: 全局作用域 (表示在一个 ServletContext 中只存在一个 Bean 实例。该作用域只在 Spring ApplicationContext 上下文中有效)、
  6. websocket: HTTP WebSocket 作用域 (表示在一个 WebSocket 中只存在一个 Bean 实例。该作用域只在 Spring ApplicationContext 上下文中有效。)

使用 @Scope 标签来声明 Bean 的作用域,

11. Bean 的生命周期

  1. 实例化 Bean(给 Bean 对象分配内存空间)
  2. 设置属性(Bean 对象注入)
  3. Bean 初始化
  4. 使用 Bean
  5. 销毁 Bean

这个五个流程可以理解为:买房子-》装修-》买家电-》入住-》卖房

12. Spring 的执行流程

  1. 启动 Spring 容器
  2. 实例化 Bean (分配内存空间)
  3. 将 Bean 注册到 Spring 中 (存操作)
  4. 将 Bean 装配到需要的类中 (取操作)

13. Spring 和 SpringBoot 的区别

Spring 和 Spring Boot 的区别在于它们的目标和用途不同。

Spring 是一个轻量级的开源框架,它提供了一种简单的方式来构建企业级应用程序。

Spring Boot 就是Java脚手架,是 Spring 框架的延伸和扩展,它提供了一种快速构建应用程序的方式。

SpringBoot 框架的特点:

  1. 快速集成框架,SpringBoot 提供了启动添加依赖的功能;
  2. 内置运行容器,无需配置 Tomcat 等 Web 容器, 直接运行和部署程序;
  3. 快速部署项目,无需外部容器即可启动并运行项目;
  4. 可以完全抛弃繁琐的 XML, 使用注解和配置(yml 、properties)的方式进行开发;
  5. 支持更多的监控指标, 可以更好的了解项目的运行情况;

14. Spring MVC 是什么

MVC 是 Model View Controller 的缩写,也就是 模型-视图-控制器,它是一种设计模式。

MVC 是一种思想,而 Spring MVC 就是实现。

Spring MVC 是什么
Spring MVC 是一个 Web 框架
Spring MVC 是基于 Servlet API 构建的

15. Spring MVC中常使用的注解都有哪些

  1. @RequestMapping:路由映射,而且也可以指定一些参数比如 method、value,也可以使用其他的路由映射的注解:@PostMappring、@GetMapping

  2. @ResponseBody 返回一个非静态页面的数据

  3. @RestController = @ResponseBody + @Controller

  4. 后端参数重命名 @RequestParam(有些特殊情况下,前端传递的参数 key 和我们后端接收的 key 可以不一致,这样就可以在方法传参中使用 @RequestParam 进行参数重命名)

  5. 接收 JSON 格式的数据 @RequestBody(方法传参传过来的是JSON格式,这就可以使用注解 @RequestBody 进行接收)

  6.  从 URL 地址中获取参数 @PathVariable

  7. @Slf4j 日志

  8. @Data

.......

16. MyBatis 是什么

简单来说 MyBatis 框架简化了重复写 JDBC 的过程,可以更加方便的去操作数据库;

  1. MyBatis 是一款优秀的持久层框架
  2. MyBatis 也是一个 ORM (Object Relational Mapping)框架,即对象关系映射
  3. 它支持自定义 SQL、存储过程以及高级映射
  4. MyBatis 去除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作
  5. MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录

一般 ORM 框架会将数据库模型的每张表都映射为一个 Java 类,也就是说使用 MyBatis 可以像操作对象一样来操作数据库中的表,可以实现对象和数据库表之间的转换

  1. 数据库表 ——》 映射为 类
  2. 记录(行数据) ——》映射为 对象
  3. 字段 ——》 映射为 对象的数据

17. Mybatis 的交互流程

  1. 前端通过 ajax 将请求发送到后端 controller 控制器这一层;
  2. controller 控制器这一层主要的工作就是验证参数的合法性,参数校验完成后,将数据发送给 service 服务器这一层;
  3. service 这一层主要是负责业务逻辑处理,管理接口,处理完成后将数据发送给 mapper 层;
  4. mapper 持久层 主要的工作就是负责和数据库交互,执行CRUD的操作,这里主要有两个 InterFace 进行声明,XML 进行实现,然后通过 @Mapper 注解将 Interface 和 xml 进行关联,从而执行sql语句;
  5. sql 语句执行完成后,将结果返回给 service 服务层,服务层再将结果返回给控制器,最终控制层将结果进行处理后返回给前端。

18. #{} 和 ${} 的区别

  1. 定义不同:#{} 预处理;而 ${} 是直接替换;
  2. 使用不同:#{} 适用于所有类型的参数匹配;但 ${} 只适用于数值类型(如果传的是字符串类型,$直接替换就会导致字符串没有带双引号);
  3. 安全性不同:#{} 性能高,并且没有安全性问题;但 ${} 存在 SQL 注入的安全问题;

19. 动态 SQL 是什么

动态 SQL 是指可以根据不同的参数信息来动态拼接的不确定的 SQL 叫做动态 SQL,动态 SQL 是 MyBatis 的强大特性之一

所以像这种情况就可以使用动态 sql中的if 去判断,这个字段是否为null,如果不为null就拼接到 sql 上,比传统sql语句更加的方便;

其他的动态 sql 标签还有

  1. if :判断当前字段是否为 null,如果不为 null 就拼接到 sql 上;
  2. trim:去除 SQL 语句前面或后面多余的某个字符
  3. where :实现查询中的 where 替换
  4. set :进行修改操作时,配合 if 来处理非必传参数的,它的特点是会自动去除最后一个英文逗号
  5. foreach:对集合进行循环;

20. 查询操作时,如果数据库中的字段和对象的属性名不一致时,如果解决

如果数据库字段名称和程序中属性名相同时,可以使用默认的 resultType。

如果不一致的话,需要使用 resultMap,进行返回字典映射;

这里需要区别主键映射和普通映射的写法是不同的;

21. Spring AOP 是什么

AOP 是一种面向切面编程的思想,通过引入横切关注点,将其与核心业务逻辑分离,并以模块化的方式管理,通俗的说就是,AOP 是对某一类事情的集中处理。

比如以前每个页面都需要去判断用户登录的情况,而现在使用AOP后,只需要在某一处进行判断处理,那么其他页面就不需要单独重复去写用户登录校验的情况了。

所以AOP的优点就是将关注点横切从应用程序的核心业务中分离出来,更好的实现模块化和复用。

所以基于这种特点,AOP可以将通用的功能比如日志记录、登录校验、数据返回等等封转成切面,然后在需要的地方进行重用,从而提高代码的可维护性和可重用性

22. Spring AOP 的实现原理

http://t.csdnimg.cn/bjEEk

23. Spring AOP 的应用有哪些,拦截器如何实现

http://t.csdnimg.cn/QJnlv

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣题目训练(22)

2024年2月15日力扣题目训练 2024年2月15日力扣题目训练563. 二叉树的坡度637. 二叉树的层平均值643. 子数组最大平均数 I304. 二维区域和检索 - 矩阵不可变154. 寻找旋转排序数组中的最小值 II 2024年2月15日力扣题目训练 2024年2月15日第二十二天编程训练,今天主要…

高并发缓存策略大揭秘:面试必备的缓存更新模式解析

在高并发场景中,缓存能抵挡大量数据库查询,减少数据库压力,对于缓存更新通常有以下几种模式可以选择: cache aside read/write through write behind caching cache aside模式 Cache-aside模式是一种常用的用于管理缓存的模…

【linux深入剖析】操作系统与用户之间的接口:自定义简易shell制作全过程

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 1.shell2.自定义shell的准…

如何遍历map

小王学习录 前言遍历map集合1. 使用for-each循环遍历 entrySet()2. 使用迭代器遍历 entrySet()3. 通过 keySet() 遍历4. 使用迭代器遍历 keySet()5. 仅遍历 values() 如果只关心map中的值而不关心键,可以遍历 values():6. 使用流(Streams)进行遍历 总结 …

typeorm导致nestjs通过@Query接收的参数为undefined

依赖版本如下,发现引入typeorm后导致接收不到Query参数,解决办法是将 TypeOrmModule导入语句放到前面就可以了

MT3004·找四边形

题目&#xff1a; 样例输入 4 12 1 2 1 3 1 4 2 1 2 3 2 4 3 1 3 2 3 4 4 1 4 2 4 3 样例输出 12 数据范围 算法设计 涉及的算法 枚举和图论基础 采用邻接矩阵g[N]来存储图&#xff0c;其中vector<ll> g[N]是建立了一个二维的vector 来用sum记录每个点 i 到达点 j…

java集合框架——Map集合概述

前言&#xff1a; 之前接触了单列合集&#xff0c;现在又接触了双列合集。整理下心得&#xff0c;打好基础&#xff0c;daydayup&#xff01;&#xff01; Map集合 Map集合称为双列集合&#xff0c;也被称为“键值对集合”。格式&#xff1a;{key1value1,key2value2...}&#…

网络学习:邻居发现协议NDP

目录 前言&#xff1a; 一、报文内容 二、地址解析----NS/NA 目标的被请求组播IP地址 邻居不可达性检测&#xff1a; 重复地址检测 路由器发现 地址自动配置 默认路由器优先级和路由信息发现 重定向 前言&#xff1a; 邻居发现协议NDP&#xff08;Neighbor Discovery…

MySQL数据库实现增删改查基础操作

准备工作 安装mysql8.0 (安装时一定要记住用户名和密码)安装数据库可视化视图工具Navicat 请注意⚠️⚠️⚠️⚠️ a. 编程类所有软件不要安装在中文目录下 b. Navicat破解版下载安装教程&#xff1a;&#xff08;由于文章审核提示版权问题&#xff0c;链接不方便给出&#xff…

虚拟内存相关知识汇总(程序重定位)

前置知识&#xff1a; Windows的内存可以被分为两个层面&#xff1a;物理内存和虚拟内存。其中&#xff0c;物理内存非常复杂&#xff0c;需要进入到Windows内核级别ring0才能看到。通常在用户模式下&#xff0c;用调试器看到的内存地址都是虚拟地址。 1.虚拟内存的定义 虚拟…

PCIE问题定位000:PCIe需要的定位手段

1、PCIe debug环境说明 本文将以PCIe EP用户逻辑举例&#xff0c;描述PCIe可以添加哪些定位手段。 如图所示&#xff0c;PCIe IP作为endpoint与RC对接&#xff0c;用户实现了应用逻辑&#xff0c;与PCIe IP进行交互&#xff0c;交互信号中data格式为TLP报文格式&#xff0c;且…

Linux_基础指令(一)

目录 1、ls指令 1.1 ls -l 1.2 ls -a 1.3 ls -i 2、pwd指令 3、cd指令 3.1 路径的概念 3.1.1 绝对路径 3.1.2 相对路径 3.2 cd ~ 3.3 cd - 4、touch指令 5、mkdir指令 6、删除系列的指指令 6.1 rmdir 6.2 rm 7、man指令 8、cp指令 9、move指令 结…

【智能算法】斑鬣狗优化算法(SHO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过。 3.代码实现4.参考文献 1.背景 2017年&#xff0c;Dhiman等人受到斑鬣狗自然狩猎行为启发&#xff0c;提出了斑鬣狗优化算法(Spotted Hyena Optimizer, SHO)。 2.算法原理 2.1算法思想 SHO将斑鬣狗狩猎行为分为围捕-狩猎-进攻三…

多线程JUC 第2季 wait和notify唤醒机制

一 wait和notify的区别与相同 1.1 wait和notify的作用 1) 使用wait()、notify()和notifyAII()时需要先对调用对象加锁。否则直接调用的话会抛出 IllegalMonitorStateExceptiona。 2) 调用wait()方法后&#xff0c;线程状态。由RUNNING变为WAITING&#xff0c;并将当前线程放置…

wordpress子比主题7.6美化插件及新手零基础搭建教程源码下载

版权申请&#xff1a;本文A5资源网原创&#xff0c;经原创作者允许转载许可声明。下载地址http://a5.org.cn/a5_ziyuan/39172.html 本源码由网友在某宝二十几元购买&#xff0c;现分享给大家。下图为源码文件及演示图&#xff0c;安装教程比较详细新手零基础就可搭建 子比主…

NeRF——基于神经辐射场的三维场景重建和理解

概述 三维重建是一种将物理世界中的实体转换为数字模型的计算机技术。其基本概念是通过对物理世界中的物体或场景进行扫描或拍摄&#xff0c;并使用计算机算法将其转换为三维数字模型。抽象意义上的三维模型指的是&#xff1a;形状和外观的组合&#xff0c;并且可以渲染成不同…

【Redis知识点总结】(四)——如何保证缓存与数据库中的数据一致性

Redis知识点总结&#xff08;四&#xff09;——如何保证缓存与数据库中的数据一致性 更新缓存删除缓存先删除缓存后更新数据库先更新数据库后删除缓存 使用canal总结 面试会经常遇到这种问题&#xff1a;你们如何保证缓存与数据库中的数据一致性&#xff1f;或者是&#xff1a…

小白必看的Python基础之函数篇

函数最重要的目的是方便我们重复使用相同的一段程序。 将一些操作隶属于一个函数&#xff0c;以后你想实现相同的操作的时候&#xff0c;只用调用函数名就可以&#xff0c;而不需要重复敲所有的语句。 函数的定义 首先&#xff0c;我们要定义一个函数, 以说明这个函数的功能…

把软件加入开机自启动

注意这个方法最佳效果是适用于打开软件后,关闭窗口不会停止服务 例如 nginx 1.把nginx的快捷方式放到如图所示的文件夹下 C:\Users\KIA_27\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup 注意KIA_27应改为你自己的用户名

从政府工作报告探计算机行业发展——探索计算机行业发展蓝图

目录 前言 一、政策导向与行业发展 &#xff08;一&#xff09;政策导向的影响 &#xff08;二&#xff09;企业如何把握政策机遇推动创新发展 二、技术创新与产业升级 三、数字经济与数字化转型 四、国际合作与竞争态势 五、行业人才培养与科技创新 &#xff08;一&a…