Java 面试题之框架

news2025/1/11 19:51:50

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

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

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

相关文章

通俗易懂的Python循环讲解

循环用于重复执行一些程序块。从上一讲的选择结构,我们已经看到了如何用缩进来表示程序块的隶属关系。循环也会用到类似的写法。 for循环 for循环需要预先设定好循环的次数(n),然后执行隶属于for的语句n次。 基本构造是 for 元素 in 序列: statemen…

RoketMQ主从搭建

vim /etc/hosts# IP与域名映射,端口看自己的#nameserver 192.168.126.132 rocketmq-nameserver1 192.168.126.133 rocketmq-nameserver2# 注意主从节点不在同一个主机上 #broker 192.168.126.132 rocketmq-master1 192.168.126.133 rocketmq-master2#broker 192.168…

网络通信.

1.物理层:网络通信的基础设施 运快递的公路 2.数据链路层 两个相邻的节点之间如何传输 两个集散点之间的传输 3.网络层 两个点之间的路径规划 物流公司规划快递的路径 4.传输层 两个点之间的通信(不考虑路径规划) 卖家发货 只考虑起点和终点 …

C++ 特殊类及单例模式

文章目录 1. 前言2. 不能被拷贝的类3. 不能被继承的类4. 只能在堆上创建对象的类5. 只能在栈上创建对象的类6. 只能创建一个对象的类(单例模式) 1. 前言 在实际场景中,我们在编写类的过程中总会遇到一些特殊情况,比如设计一个类不…

【Godot4.0】自定义A*寻路拓展类TileMapAStar2D及其使用

概述 Godot提供的AStar2D和AStarGrid2D基本可以解决所有2D的A*寻路问题: 前者提供了基础的A*寻路支持,但是需要手动处理很多内容后者针对基于方形图块的A*寻路,进行了很多自动化的工作,用起来十分简便。但是不使用于六边形、iso…

C++for语句(2)

11.乘方计算 给出一个整数a和一个正整数n&#xff08;-1000000<a<1000000,1<n<100000&#xff09;&#xff0c;求乘方&#xff0c;即乘方的结果。最终结果的绝对值不超过1000000。 输入 一行&#xff0c;包含两个整数a和n&#xff08;-1000000<a<1000000,1…

网站安全监测:守护网络空间的坚实防线

随着互联网技术的飞速发展和广泛应用&#xff0c;网站已成为企业、机构和个人展示形象、提供服务、传递信息的重要平台。然而&#xff0c;与此同时&#xff0c;网站也面临着日益严重的安全威胁。黑客攻击、数据泄露、恶意软件等安全问题频发&#xff0c;给网站运营者带来了巨大…

redis发布订阅与stream类型

发布订阅 redis发布订阅(pub/sub)是一种消息通信模式&#xff1b;发送者(pub)发送消息&#xff0c;订阅者(sub)接收消息。redis客户端可以订阅任意数量的频道。 基础命令&#xff1a; 语法 redis publish命令基本语法如下&#xff1a; redis 127.0.0.1:6379> PUBLISH ch…

若你有才能,最好能遇上识才之人,高俅发迹的故事很好诠释了千里马与伯乐的关系

若你有才能&#xff0c;最好能遇上识才之人&#xff0c;高俅发迹的故事很好诠释了千里马与伯乐的关系 其实&#xff0c;“千里马”和“伯乐”都是中国古代传说里的角色。伯乐是古代一个善于相马&#xff08;识别马的好坏&#xff09;的人&#xff0c;而“千里马”则是指一匹能跑…

解决:由于找不到xinput1_3.dll,无法继续执行代码问题的方法

xinput1_3.dll文件的丢失是一个常见的问题&#xff0c;它会导致一些游戏应用程序无法正常运行或出现错误。为了解决这个问题&#xff0c;我们可以采取多种方法。下面将介绍几种常用的xinput1_3.dll丢失的解决方法&#xff0c;通过采用合适的方法&#xff0c;我们可以轻松解决该…

跳绳计数,YOLOV8POSE

跳绳计数&#xff0c;YOLOV8POSE 通过计算腰部跟最初位置的上下波动&#xff0c;计算跳绳的次数

Redis数据结构对象之字符串对象

字符串对象 字符串对象的编码可以是int、raw或者embstr 如果一个字符串对象保存的是整数值&#xff0c;并且这个整数值可以用long类型来表示&#xff0c;那么字符串对象会将整数值保存在字符串对象结构的ptr属性里面(将void *转换成long)&#xff0c;并且将字符串对象的编码设…

zookeeper快速入门四:在java客户端中操作zookeeper

系列文章&#xff1a; zookeeper快速入门一&#xff1a;zookeeper安装与启动-CSDN博客 zookeeper快速入门二&#xff1a;zookeeper基本概念-CSDN博客 zookeeper快速入门三&#xff1a;zookeeper的基本操作 先启动zookeeper服务端。 在maven引入zookeeper依赖。 <depende…

代码算法训练营day10 | 232.用栈实现队列、225. 用队列实现栈

day10: 232.用栈实现队列225. 用队列实现栈 232.用栈实现队列 题目链接 状态&#xff1a; 文档&#xff1a;programmercarl.com 思路&#xff1a; 用栈实现队列。要先明白两者的区别。 栈&#xff1a;单开门&#xff0c;先进后出&#xff0c;只有一端能进出。 队列&#xff1a;…

【晴问算法】入门篇—贪心算法—区间不相交问题

题目描述 给定n个开区间&#xff0c;从中选择尽可能多的开区间&#xff0c;使得这些开区间两两没有交集。 输入描述 输出描述 输出一个整数&#xff0c;表示最多选择的开区间个数。 样例1输入 4 1 3 2 4 3 5 6 7 输出 3 解释 最多选择(1,3)、(3,5)、(6,7)三个区间&#xff0c;它…

从零到一构建短链接系统(三)

1.根据数据库表&#xff0c;利用在线网站https://jully.top/generator/ 根据数据库Info自动生成代码 2.在entity中创建UserDO Data TableName("t_user") public class UserDO { /** * id */ private Long id; /** * 用户名 */ private String username; /** * 密码…

图解Kafka架构学习笔记(一)

本文参考尚硅谷大数据技术之Kafka。 消息队列 &#xff08;1&#xff09;点对点模式&#xff08;一对一&#xff0c;消费者主动拉取数据&#xff0c;消息收到后消息清除&#xff09; 点对点模型通常是一个基于拉取或者轮询的消息传送模型&#xff0c;这种模型从队列中请求信息…

[嵌入式系统-40]:龙芯1B 开发学习套件 -10-PMON启动过程start.S详解

目录 一、龙芯向量表与启动程序的入口&#xff08;复位向量&#xff09; 1.1 复位向量&#xff1a; 1.2 代码执行流程 1.3 计算机的南桥 VS 北桥 二、PMON代码执行流程 三、Start.S详解 3.1 CPU初始化时所需要的宏定义 &#xff08;1&#xff09;与CPU相关的一些宏定义…

node.js快速入门-day03

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大二在校生 &#x1f921; 个人主页&#xff1a;坠入暮云间x &#x1f43c;座右铭&#xff1a;给自己一个梦想&#xff0c;给世界一个惊喜。 &#x1f385;**学习目标: 坚持每一次的学习打卡 文章目录 web服务器创建…

brpc之ResourcePool

简介 ResourcePool用于管理资源&#xff0c;负责资源的分配以及回收 结构 BlockGroup&#xff1a;资源池中包含多个BlockGroup&#xff0c;最多65536个 Block&#xff1a;一个BlockGroup中包含多个Block&#xff0c;最多(1<<16)个&#xff1b;1个Block中包含BLOCK_NITE…