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

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

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

相关文章

JavaScript练手小技巧:数字反转时钟

样式基于博主的这篇文章: CSS3技巧38:3D 翻转数字效果-CSDN博客 既然可以实现翻转数字了,肯定就可以跟 JS 相结合去完成一些数字展示效果。 比如,数字反转时钟。 为了方便,所有 HTML 数字根据时间动态生成。因此&a…

企业内部培训考试系统培训计划功能说明

培训计划是预设好的一套课程系列,包含课程和考试,分多个阶段,每完成一个阶段就会在学习地图上留下标记,让用户看到自己的努力成果,增强成就感,从而坚持完成课程。 企业内部培训考试系统中如何设置培训计划…

一起玩儿3D打印机——06 Marlin固件的配置(三)

摘要:本文介绍Marlin固件的配置方法 25. 启用EEPROM参数保存功能 #define EEPROM_SETTINGS 打开此功能,会将部分参数保存在打印机中,这样通过屏幕就可以进行调节,而无需重刷固件。 26. 启用板载SD卡支持 #define SDSUPPORT 如…

【QT+QGIS跨平台编译】之七十七:【QGIS_Gui跨平台编译】—【错误处理:字符串错误】

文章目录 一、字符串错误二、处理方法三、涉及到的文件一、字符串错误 常量中有换行符错误:(也有const char * 到 LPCWSTR 转换的错误) 二、处理方法 需要把对应的文档用记事本打开,另存为 “带有BOM的UTF-8” 三、涉及到的文件 src\gui\qgsadvanceddigitizingdockwidge…

WebServer -- 架构图 面试题(上)

目录 🎂前言 🌼流程图 && 架构图 1)什么是 WebServer 2)服务器基本框架 3)Reactor && Proactor 模式 4)同步 I/O 模拟Proactor模式(Linux) 5)主从…

C语言基础练习——Day10

目录 选择题 编程题 不用加减乘除做加法 找到所有数组中消失的数字 选择题 1、求函数返回值,传入-1,则在64位机器上函数返回 int func(int x) {int count 0;while (x){count;x x&(x - 1);//与运算}return count; } A 死循环B 64C 32D 16 答案&…

别急,先了解一下什么是REST API吧

1、先想一想Rest API的用途和场景 Rest API的常用场景:前后端分离,前端可多样化,还有与其他系统集成:RESTful API 可以与其他系统进行集成,例如第三方登录、支付和社交媒体平台等。 现在我们知道了如何使用 servlet …

redis 常见的异常

目录 一、缓存穿透 1、概念 解决方案 (1)布隆过滤器 (2)、缓存空对象 二、缓存雪崩 1、概念 解决方案 (1)redis高可用 (2)限流降级 (3)数据预热 一、缓存穿透 1、概念 缓…

仰卧起坐计数,YOLOV8POSE

仰卧起坐计数,YOLOV8POSE 通过计算膝盖、腰部、肩部的夹角,计算仰卧起坐的次数

分数相加减(C语言)

一、流程图&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;int fenmu 2;int result 1;int fuhao 1;//执行循环&#xff1b;while (fenmu < 100){//运算&#xff1b;fuhao (-1…

汽车电子与软件架构概述

汽车电子与软件架构概述 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师 (Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣扎,出门靠自己…

Sentinel篇:线程隔离和熔断降级

书接上回&#xff1a;微服务&#xff1a;Sentinel篇 3. 隔离和降级 限流是一种预防措施&#xff0c;虽然限流可以尽量避免因高并发而引起的服务故障&#xff0c;但服务还会因为其它原因而故障。 而要将这些故障控制在一定范围&#xff0c;避免雪崩&#xff0c;就要靠线程隔离…

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

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

Docker 哲学 - 容器操作

容器&#xff1a; 创建 停止 删除 强制删除&#xff08;正在运行&#xff09; run stop rm rm -f 列出本地容器&#xff1a; docker ps / docker container ls 镜像&#xff1a; search pull run &#xff1a; …

Orbit 使用指南 03 | 与刚体交互 | Isaac Sim | Omniverse

如是我闻&#xff1a; “在之前的指南中&#xff0c;我们讨论了独立脚本&#xff08; standalone script&#xff09;的基本工作原理以及如何在模拟器中生成不同的对象&#xff08;prims&#xff09;。在指南03中&#xff0c;我们将展示如何创建并与刚体进行交互。为此&#xf…

2024 年(第 12 届)“泰迪杯”数据挖掘挑战赛—— C 题:竞赛论文的辅助自动评阅完整思路与源代码分享

一、问题背景 近年来我国各领域各层次学科竞赛百花齐放&#xff0c;层出不穷&#xff0c;学生参与度也越来越高。随着参赛队伍的增 加&#xff0c;评阅论文的工作量急剧增加&#xff0c;这对评阅论文的人力要求也越来越大。因此引入机器辅助评阅成为竞赛主办方的现实需求。 在…

【解读】保障软件供应链安全:SBOM推荐实践指南(含指南获取链接)

2023年11底&#xff0c;美国NSA&#xff08;National Security Agency&#xff09;、CISA&#xff08;Cybersecurity and Infrastructure Security Agency&#xff09;等多个政府机构部门组成的ESF&#xff08;Enduring Security Framework&#xff0c;持久安全框架&#xff09…

数据结构试卷第九套

1.时间复杂度 2.树&#xff0c;森林&#xff0c;二叉树的转换 2.1树转二叉树 给所有的兄弟节点之间加一条连线&#xff1b;去线&#xff0c;只保留当前根节点与第一个叶子节点的连线&#xff0c;删除它与其他节点之间的连线&#xff1b;然后根据左孩子右兄弟进行调整&#xf…

JavaScript slice()方法详解

在 JavaScript 中&#xff0c;slice() 是一个常用的数组方法&#xff0c;用于从现有数组中提取一部分元素&#xff0c;然后返回一个新的数组。它是一个非常有用的工具&#xff0c;可以帮助你在不改变原始数组的情况下操作数组的子集。本文将介绍 slice() 的基本概念、使用方法、…

算法第二十九天-最长公共子序列

最长公共子序列 题目要求 解题思路 求这两个数组或者字符串的最长公共子序列问题&#xff0c;肯定要用到动态规划。 首先区分两个概念&#xff1a;子序列可以是不连续的&#xff1b;子数组&#xff08;子字符串&#xff09;是需要连续的&#xff1b;另外&#xff0c;动态规划…