当前位置: 首页 > web >正文

阶段技术问答题目

切记:每一个问题提供了参考答案,仅仅是一个提示,不要死记硬背,要转化成自己的理解。

  1. 在Web标准中指出,一个网页由几个部分组成,各自的职责是什么? 顺便说说常见的HTML标签及其作用。

网页由三个部分组成:

  • HTML:使用HTML定义定义网页的结构。
  • CSS:使用CSS来定义网页的样式。
  • JavaScript:使用JavaScript定义网页的动作和行为。

HTML常见的标签和作用:

  • <html>:文档根元素。
  • <head>:包含元信息,如标题、样式表链接等。
  • <body>:包含页面主体内容。
  • <p>:定义段落。
  • <a>:定义超链接。
  • <h1> - <h6> : 定义一级标题 - 六级标题。
  • <img>, <video> , <audio>: 定义图片、视频、音频。
  • <form>, <input>, <button>:定义表单和表单项。
  • <table> , <thead> , <tbody> , <tr> , <td> : 定义表格、表头、表格主体、行、单元格
  1. CSS的引入方式有几种,各自有什么区别? CSS中的元素选择器、ID选择器、类选择器的写法?这三个选择器的优先级是什么样的?

引入方式:

  • 行内样式:直接在HTML元素上使用style属性。如: <h1 style="color: red">Hello HTML</h1>。 仅针对于当前元素生效。
  • 内部样式:在<head>中使用<style>标签, 在<style> 标签中, 定义css样式。 仅针对当前页面的元素生效。
  • 外部样式:单独定义一个css文件, 然后通过<link>标签引入外部CSS文件。复用性更强,哪里需要就在那个页面引入。

选择器写法:

  • 元素选择器:element,如div
  • ID选择器:#id,如#example
  • 类选择器:.class,如.example

优先级:

  • ID选择器 > 类选择器 > 元素选择器。
  1. form表单提交时,使用GET和POST提交方式各自的特点是什么?有什么区别 ?
  • GET:参数附加在URL后面, 比如: http://localhost/emps?id=1&name=Tom; 适合简单查询操作; 安全性较低。 GET请求在浏览器中,请求参数大小有限制。
  • POST:数据放在HTTP消息体中发送;适合复杂或敏感数据提交;安全性较高。 请求大小没有限制。
  1. 在JS中事件监听的语法是什么样的?常见的事件类型有哪些,请详细说明?
  • 语法:事件源.addEventListener('事件类型', 事件触发的函数function);
  • 常见事件:
    • click:鼠标点击。
    • mouseenter, mouseleave:鼠标移入, 鼠标移出 。
    • keydown, keyup:键盘按下, 键盘抬起。
    • focus, blur:获取和失去焦点。
    • submit: 表单提交事件
  1. 什么是DOM,在JS中获取DOM对象的方式有哪些,之间的区别是什么,请详细说明?
  2. DOM简介:
    1. DOM(Document Object Model):文档对象模型,用于表示和操作文档结构,通过DOM操作就可以操作页面上的元素内容,元素样式等。
  1. 获取DOM对象方式:
    1. document.querySelector('selector'):获取匹配给定选择器的第一个元素。
    2. document.querySelectorAll('selector'):获取所有匹配选择器的元素集合。
  1. 聊一聊Vue中常用的指令有哪些,以及具体的作用? v-if 和 v-show指令的区别是什么?
  2. Vue指令:
    1. v-if:条件渲染,当表达式为false时元素不会被渲染; 为true时才渲染。
    2. v-show:条件渲染,始终渲染元素,但通过css样式来控制显示与隐藏。
  1. 区别:
    1. v-if根据条件的true/false,来决定是否渲染这个DOM元素。
    2. v-show始终渲染DOM元素,并通过CSS的display属性切换显示状态。
  1. Maven中有哪几类仓库,如果要在项目中引入一个依赖,依赖的查找顺序是什么样的? 什么是坐标,坐标由那几个部分组成。
  2. Maven仓库类型:
    1. 本地仓库。
    2. 远程仓库 (私服)。
    3. 中央仓库。
  1. 查找顺序(从上到下):
    1. 本地目录。
    2. 远程仓库 (私服)。
    3. 中央仓库。
  1. 坐标组成:
    1. 组织名(<groupId>)。
    2. 模块名(<artifactId>)。
    3. 版本号(<version>)。
  1. Maven的生命周期分为那几套? 我们核心关注的5个生命周期阶段是哪5个,具体的作用是什么?
  • 分为三套:清理(clean)、默认(default)、站点(site)。
  • 重点关注的5个阶段:
    • clean:清理上一次构建生成的文件
    • compile:编译项目的源代码
    • test:测试编译后的代码
    • package:将编译后的代码打包成可发布的格式,如 JAR、WAR 等
    • install:将打包好的代码安装到本地仓库,方便其他项目进行依赖管理
  1. 请聊聊在Junit单元测试中,常用的注解有哪些? 每个注解的作用是什么 ?
  • @Test:定义测试方法。
  • @BeforeEach:每个测试方法前执行。
  • @AfterEach:每个测试方法后执行。
  • @BeforeAll:整个测试类开始前执行一次。
  • @AfterAll:整个测试类结束后执行一次。
  • @ParameterizedTest: 参数化测试。
  1. Maven的依赖范围是做什么用的? 常见的取值有哪些? 如何设置依赖的作用范围?

Maven依赖范围,是用来控制我们所引入进来的依赖具体在什么地方生效,在哪些位置可以使用。

常见的取值:

  • compile:编译阶段。主程序、测试程序、打包运行时均有效。
  • test:测试阶段。测试程序有效,主程序、打包运行时无效。
  • provided:已提供。主程序、测试程序可用,但是不参与打包。
  • runtime:运行时。运行时有效。

如何设置依赖的所用范围:可以通过标签 <scope>test</scope> 来设置。

  1. 什么是HTTP协议? HTTP协议具有什么样的特点,请详细说明?

HTTP协议: 超本文传输协议,规定了浏览器与服务器之间数据传输的规则。

特点:

  • HTTP是基于TCP协议的,面向连接,安全的协议。
  • HTTP协议是基于请求响应模型的,一次请求一次响应。
  • HTTP协议是无状态的协议,每一次请求响应都是独立的,后一次请求并不会携带前一次请求的数据。
  1. HTTP协议中请求协议的数据格式 及 响应协议的数据格式, 请详细说明 ?

请求数据格式:

  • 请求行:包括请求方式、请求路径、协议版本。
  • 请求头:第二行开始,以key:value形式出现的键值对。
  • 请求体:发送的数据体(POST, PUT请求)。 请求头和请求体之间有一个空行。

响应数据格式:

  • 响应行:协议版本、状态码、状态消息。
  • 响应头:第二行开始,以key:value形式出现的键值对。
  • 响应体:服务器返回的数据体。响应头和响应体之间有一个空行。
  1. HTTP的状态码分为哪几类,分别表示什么意思 , 请详细说明? 请说出几个常见的状态码 及 含义?

分类:

  • 1xx:响应中。
  • 2xx:成功状态码。
  • 3xx:重定向状态码。
  • 4xx:客户端错误状态码。
  • 5xx:服务器错误状态码。

常见状态码:

  • 200 :成功。
  • 401:未认证(未登录)。
  • 404:客户端错误,请求路径找不到。
  • 500:服务器端异常。
  1. 请按照你的理解说说什么是控制反转IOC (反转的是什么,反转之前什么样,反转之后什么样),以及什么依赖注入 DI? 【按自己的理解表述】

IOC:控制反转。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。

DI:依赖注入。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。

  1. Spring中声明 Bean的注解有哪些,分别用在什么地方呢 ? 使用了这个注解声明bean,这个bean就一定会生效吗?

声明bean的注解:

  • @Component:泛用组件。
  • @Service:业务逻辑组件。
  • @Repository:数据访问层组件。
  • @Controller:控制器组件。
  • @Bean: 加在方法上,spring会将方法的返回值, 声明为IOC容器的Bean。
  • 不一定,取决于组件扫描范围。 启动类上加的注解 @SpringBootApplication 具备组件扫描的作用,但默认扫描的是启动类所在包及其子包。
  1. 请详细描述 @ResponseBody 注解的作用? 我们在编写Controller类的代码时,为什么没有使用该注解呢 ?

作用:直接将controller的返回值,作为HTTP的响应体。如果返回值是一个对象或集合,会将其先转为json,再响应。

原因:因为我们在类上加了 @RestController,而@RestController 底层已经包含了 @ResponseBody 注解。 在类上加了这个注解,就相当于在类中的每一个方法上,都加上了这个注解。

  1. 请详细描述一下,什么是约束?常用的约束有哪些,对应的关键字是什么,各自的应用场景?

约束:是作用于表中字段上的规则,用来保证数据库表数据的一致性,完整性,正确性。

常见约束:

  • 主键(PRIMARY KEY):唯一标识一行记录。
  • 外键(FOREIGN KEY):在多表中,保证数据的一致性和完整性。
  • 唯一(UNIQUE):列的值必须唯一。
  • 非空(NOT NULL):列不能为空。
  • 默认(DEFAULT):指定默认值。
  1. 请详细描述char与varchar的区别? 以及在设计表时,该如何选择?

MySQL中的 charvarchar 都是用于存储字符串的数据类型,但它们在存储方式和性能上有所不同。以下是它们的主要区别:

第一点呢,就是存储方式不同:

  • char:定长字符串,长度是固定的,不管实际存储的字符串长度如何,都会占用固定长度的存储空间。如:char(10) 会始终占用10个字符的空间。
  • varchar:变长字符串,长度不固定。占用的空间与实际存储的字段长度有关。 如:varchar(10) 表示最多可以存储10个字符,如果存储的字符串长度不足10,假设为5,只会占用5个字符空间。

第二点呢,就是性能不同:

  • 对于char,由于其固定长度,操作会快些,但是会存储浪费磁盘空间的问题。
  • 对于varchar,由于长度可变,操作时会相对慢一点,但是可以节省磁盘空间,尤其是存储的数据长度不固定时。
  1. DQL语句分组查询时,where,group by,having之间的执行顺序是什么样的? where 与having的区别是什么?

执行顺序:where ---> group by ----> having

wherehaving 的区别:

  • where 是在分组之前,对数据进行过滤,不符合条件的数据,不会参与分组。 where后面不能使用聚合函数。
  • having 是在分组之后,对数据进行过滤。 having之后,可以使用聚合函数。
  1. Mybatis的映射配置文件定义的规范是什么 ? 项目开发中,你们的SQL是基于注解方式开发的还是XML映射配置文件开发的。

XML映射文件定义规范:

  1. XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)。
  2. XML映射文件的namespace属性为Mapper接口全限定名一致。
  3. XML映射文件中sql语句的id与Mapper 接口中的方法名一致,并保持返回类型一致。

使用Mybatis的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句。

  1. Mybatis 中的 # 与 $ 的区别是什么 ?实际开发中推荐用哪个? 为什么 ?
  • #:预编译处理,防止SQL注入,安全。【推荐】
  • $:字符串拼接,容易导致SQL注入,不安全。
  1. 请详细描述一下 @RequestParam , @RequestBody , @PathVariable 注解的作用和应用场景 ?具体的使用细节也描述一下 ?
  • @RequestParam:用于绑定HTTP请求中的查询参数到方法参数上。
    • 场景1:前端传递参数名与controller方法形参不一致。
    • 场景2:设置controller方法参数的默认值。
    • 场景3:将前端传递的过个参数封装到一个List集合中。如: /emps?ids=1,2,3 ----> @RequestParam List<Integer> ids
  • @RequestBody:用于将HTTP请求体中的内容绑定到方法参数上。
    • 应用场景:将json格式的数据,封装到对象/集合中。
    • 使用细节:常用于POST / PUT等方式中。
  • @PathVariable:用于将URL路径中的参数绑定到方法参数上。
    • 应用场景:获取URL路径中的动态部分。
    • 使用细节:配合{}中的占位符使用。
  1. 请描述一下什么Rest风格的url,涉及到哪些请求方式,这几种情况方式分别描述什么操作?
  • RESTful API使用URL来表示要操作的资源,使用HTTP请求方式来表示对资源的操作(增删改查)。
  • 请求方式:
    • GET:读取资源。
    • POST:创建资源。
    • PUT:更新资源。
    • DELETE:删除资源。
  1. 请描述一下 @RequestBody 注解 与 @ResponseBody 注解的作用 ? 什么时候用 @ResponseBody , 什么时候用 @RequestBody?
  • @RequestBody:将请求体中的json数据转换成Java对象。
    • 应用场景:用于POST/PUT等方式。
  • @ResponseBody:直接将controller的返回值,作为HTTP的响应体。如果返回值是一个对象或集合,会将其先转为json,再响应。
  1. 在数据库表结构设计时, 有哪几种多表关系 ? 在数据库中, 如何维护这层多表关系 ?
  • 一对一:在任意一方定义一个外键,来关联另外一方的主键 ,并为外键字段添加一个唯一约束 。
  • 一对多:在多的一方添加一个外键,来关联另外一方的主键 。
  • 多对多:通过中间表来维护关系,中间表至少有两个外键来关键两方的主键。
  1. 请详细描述内连接和外连接的区别? 外连接中左外和右外的区别?
  • 内连接:查询两张表交集部分的数据。
  • 外连接:
    • 左外连接:会查询返回所有左表中的数据,以及两张表交集部分的数据。
    • 右外连接:会查询返回所有右表中的数据,以及两张表交集部分的数据。
  1. 请详细说明一下, 分页查询的原理 ? (从前端传递的参数 , 后端执行的SQL, 后端返回的数据层面来说明)
  • 前端:传递页码page 和 每页记录数 pageSize
  • 后端SQL:使用LIMITcount实现分页。 执行两条SQL,一条sql查询指定页码对应的结果列表; 一条sql统计符合条件的总记录数。
  • 后端:返回的数据包括两项,总记录数 total,结果列表 rows(List集合)。
  1. 请说明什么是事务? 在数据库中如何控制事务,控制事务的SQL语句 ? 以及事务的四大特性 ?请详细聊聊在项目开发中,你们的事务是如何控制的 ?

事务:一系列操作要么全部成功,要么全部失败。

控制事务的SQL:

  • 开启事务:start transaction; / begin;
  • 提交事务:commit;
  • 回顾事务:rollback;

四大特性:

  • 原子性(Atomicity):事务是不可分割的最小单元,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。

事务控制:

  • 项目开发中,控制事务,我们可以在业务方法上加上 @Transactional 注解即可。 @Transactional 可以加载 方法上、类上、接口上。 推荐加在方法上。
  1. 请描述Mybatis中动态SQL的使用场景 , 以及 <if> 标签 ,<where> 标签、<foreach> 标签、<set>标签 的具体作用 ?
  • <if>:根据条件判断是否拼接对应的SQL片段 。
  • <where>:自动处理WHERE关键字 和 并且会自动去除第一个条件前面多余的 AND/OR。
  • <set>: 用在update语句中,用来替换set关键字,并且会自动去除更新字段后面多余的逗号。
  • <foreach>: 循环遍历。
    • collection
    • item
    • sepearator
    • open
    • close
  1. 文件上传前端页面三要素是哪三个要素 ? 在spring框架中在服务端如何接收上传上来的文件 ?

前端三要素:

  • 表单提交方式:POST
  • 表单的enctype属性设置为 multipart/form-data
  • 表单中需要一个文件上传的项: <input type="file">

服务端接收上传的文件:

  • MultipartFile file
  1. 在application.yml配置文件中配置的配置项,如何在bean对象中注入进来使用 (使用什么注解,两个注解之间的区别及应用场景)?
  • 使用@Value注解或@ConfigurationProperties注解。
    • @Value:适用于单一配置项。
    • @ConfigurationProperties:适用于复杂的配置结构,便于复用。
  1. 你们项目中的异常是如何处理的? 如何定义一个全局异常处理器 ? 全局异常处理器中是否可以定义多个方法来捕获不同类型的异常 ?

项目中的异常,我们并没有try...catch。 而是定义了一个全局异常处理器,来捕获所有的异常,然后针对于不同类型的异常进行不同的处理。

全局异常处理器定义:

  • 类上加的注解:@RestControllerAdvice
  • 方法上加的注解:@ExceptionHandler

全局异常处理器中是可以定义多个方法来捕获不同类型的异常的。

  1. 介绍一下在MySQL数据库中你经常使用的函数 ,及其作用 ?
  • COUNT(): 统计总数量。
  • SUM(): 求和。
  • AVG(): 平均值。
  • MAX(): 最大值。
  • MIN(): 最小值。
  • now(): 获取当前系统时间。
  • if(...): 条件判断。
  • ifnull(...): 判断null值的。
  • case ... when ... then ... when ... then ... end : 流程控制函数。
  1. 请描述一下cron表达式(cron="5 10 1 * * ?")的含义? cron表达式中,常见的特殊符号的有哪些,每一个的含义请详细描述 。

cron: 5 10 1 * * ?

cron表达式:六位 / 七位 , 分别表示: 秒 分 时 日 月 周 年(可选)

上述表达式,表示:每一天的凌晨一点十分五秒执行一次。

特殊符号:

  • * : 任意
  • ? : 放弃指定
  • / : 表示间隔周期
  • - : 表示范围
  • , : 表示枚举
  1. 会话跟踪技术Cookie 与 Session 各自的原理是什么 ? 各自有什么优缺点 ?

Cookie:

原理:

  • Cookie 是一种客户端会话跟踪技术。
    • 服务器通过 HTTP 响应头 Set-Cookie 将数据发送给浏览器,浏览器将其保存在本地。
    • 当浏览器再次请求同一服务器时,它会在请求头 Cookie 中将 Cookie 发送给服务器。

优点:

  • HTTP协议中支持的技术,提供了一个响应头 Set-Cookie, 一个请求头 Cookie

缺点:

  • 安全性较低,用户可以随意操作/禁用。
  • 移动端APP无法直接使用Cookie。
  • Cookie不支持跨域操作。

Session:

  • Session 是一种服务器端会话跟踪技术,用于存储用户会话所需的信息。底层是基于Cookie的。
    • 服务器为每个会话分配一个唯一的 ID(Session ID),并将该 ID 通过 Cookie 的方式发送给客户端。

优点:

  • 更安全,因为数据存储在服务器端。

缺点:

  • Cookie的缺点。
  • 集群环境下,无法直接使用Session。
  1. JWT令牌由哪几个部分组成,每一个部门都表示什么含义? 存储什么样的数据?

JWT 由三个部分组成,它们分别是:

  1. Header(头部)
    1. 表示令牌的类型和所使用的签名算法。
    2. 通常格式为 { "typ": "JWT", "alg": "HS256" }
  1. Payload(负载)
    1. 通常存储令牌的默认信息,以及自定义的数据。原始数据格式为json,进行了Base64编码后就变成了jwt的第二部分。
  1. Signature(签名)
    1. 用于验证接收到的 JWT 未被篡改。
    2. 生成方式是将 Header、Payload 和一个密钥(通常是私钥或共享密钥)使用指定的算法(如 HMAC SHA-256)进行编码。
  1. 拦截器的拦截路径中,/* 与 /** 的区别是什么 ? 那 /emps/* 与 /emps/** 的区别又是什么呢 ?
  • /*:只能匹配一级路径,比如:/login/home。不能匹配多级路径,比如:/emps/1/students/1/0
  • /**:匹配任意级路径,比如:/login/home,也可以匹配 /emps/1/students/1/0
  • /emps/*:只会拦截 /emps 目录下的一级路径,如 /emps/profile/emps/info
  • /emps/**:会拦截所有以 /emps 开始的路径,无论这些路径有多深。例如 /emps/profile/emps/user/123/emps/admin/settings
  1. 过滤器 Filter 与 拦截器 Interceptor 之间的区别是什么 , 请详细描述 ?

接口规范不同:

  • 过滤器Filter是JavaEE规范中提供的技术,要实现Filter接口。
  • 拦截器Interceptor是Spring中提供的技术,要实现HandlerInterceptor接口。

拦截范围不同:

  • 过滤器的拦截范围更大,它可以拦截Web服务器中所有的资源。
  • 拦截器只能拦截Spring中的资源(主要是控制器中的方法)。
  1. 什么是AOP? 请按照自己的理解描述一下.

aop是面向切面编程,在spring中用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取成公共模块复用,降低耦合,一般像系统的公共日志记录,事务处理,权限的控制等都可以通过AOP来实现。

可能追问:你们项目中有没有使用到AOP?

这个很多地方都用到了,比如我们当时在后台管理系统中,就是使用aop来记录了系统的操作日志、以及权限控制。那就来说一下,记录日志的操作思路吧。

主要思路是这样的,使用aop中的环绕通知 加上 基于注解@annotation 的切点表达式来实现的。

  • 首先,自定义了一个注解,比如叫 @Log,然后哪些操作需要记录日志,我们就在哪些方法上加上这个注解。
  • 然后再定义一个切面类,通过环绕通知,来获取原始方法在运行的各项信息,比如:类信息、方法信息、注解、请求方式、请求参数、当前操作人、操作时间、返回值等信息,全部记录下来,保存在数据库中。

当时,我们主要记录的是一些核心业务模块的增删改的操作日志,主要便于数据追踪。

  1. SpringAOP中的常见的通知类型有哪些? 这些通知类型的执行时机?

Spring AOP 通知类型

@Around

环绕通知,此注解标注的通知方法在目标方法前、后都被执行

@Before

前置通知,此注解标注的通知方法在目标方法前被执行

@After

后置通知,此注解标注的通知方法在目标方法后被执行,无论是否有异常都会执行

@AfterReturning

返回后通知,此注解标注的通知方法在目标方法后被执行,有异常不会执行

@AfterThrowing

异常后通知,此注解标注的通知方法发生异常后执行

  1. 常见的切入点表达式的写法有哪几种 ? 具体的写法是什么样的请详细说明?

有两种,第一种:execution 基于方法的签名来匹配切入点方法。第二种,@annotation 基于注解的方式来匹配。

  • execution写法: execution(权限修饰符? 返回值 包名.类名.?方法名(方法形参类型) throws 异常?)
    • 可以省略的部分:权限修饰符、包名.类名、异常
    • 特殊符号:
      • * :单个独立的任意符号,可以匹配任意 返回值类型,包名,类名,方法名,单个任意类型形参。也可以匹配一部分方法名。
      • ..:多个任意符号,可以在方法形参类型、包名位置出现。
  • @annotation:是基于注解的方法匹配的。比如: @annotation(com.itheima.anno.Log) 括号,里面写的是注解的全类名。

选择原则:优先选择 execution 切入点表达式,如果 execution 不好描述,可以使用 @annotation 方式。

  1. Spring容器中的bean默认的作用域是什么? 那这个bean是什么时候创建的? 作用域常见的取值有哪些? 如何配置bean的作用域 ?
  • Spring 容器中的bean默认是单例的 (singleton)。

什么时候创建:

  • 如果是单例的bean,默认是Spring容器启动的时候,就完成bean的初始化操作,那这是默认情况,我们可以通过 @Lazy 注解来延迟bean的初始化,延迟到第一次使用的时候。
  • 而如果是非单例的bean(也就是prototype),则是在每次使用这个bean的时候,都会重新实例化一个新的bean。

Spring Bean的作用域可以通过 @Scope 注解来设置。常见的取值如下:

  • singleton :这种bean范围是默认的,这种范围确保不管接受到多少个请求,每个容器中同一个名称的bean只有一个实例,也就是单例的 。
  • prototype :这种范围,表示非单例的。也就是说每一次用到的bean都是一个新的 。

虽然,bean作用域可以设置这些值,但是在项目开发中,绝大部分的bean都不会添加这个 @Scope 注解,也就是说默认都是用的是单例的bean。

  1. 请描述一下@Bean注解的作用及使用细节?

@Bean 注解通常是用来声明第三方bean的,是作用在方法上,框架会自动将标识了@Bean注解的方法的返回值对象交给IOC容器管理,成为IOC容器的bean对象。

如果在声明这个bean的过程中,需要用到其他的bean对象,可以直接在方法形参中注入进来。

基于@Bean注解声明的bean对象,如果没有指定名字,默认是方法名。

  1. SpringBoot的自动配置的原理是什么 ? 请详细描述一下 。

嗯,好的,它是这样的。

其实SpringBoot自动配置的核心,是引导类上加的注解@SpringBootApplication 底层封装的一个注解,叫@EnableAutoConfiguration,这个注解才是实现自动化配置的核心注解。

该注解底层通过@Import注解导入对应的配置选择器,导入了一个ImportSelector接口的实现类。 而在这个类的内部呢,读取了该项目和该项目引用的Jar包中的classpath路径下META-INF/spring/XXxxxSpringAutoConfiguration.imports文件中的所配置的类的全类名。

在这些配置类中基于 @Bean注解 所定义的Bean,会根据条件注解@Conditional系列注解所指定的条件来决定是否需要将其导入到Spring容器中。

一般条件判断会有像@ConditionalOnClass这样的注解,判断是否有对应的class文件,如果有则加载该类,把这个配置类的所有的Bean放入spring容器中使用。所以,在springboot项目中,项目一旦启动,在IOC容器中其实就已经配置好了一些bean,我们在项目中就可以直接使用了。

  1. 项目开发中, 有没有自定义过starter ? 简单聊一下自定义starter的步骤 ?

嗯,这个我知道,之前在项目中,我们封装过的,像阿里云OSS操作的starter。

  • 首先,先说模块哈,自定义starter,我们通常会定义两个maven模块。
    • 一个是:xxx-spring-boot-starter ,这个模块主要负责管理依赖,最后项目中引入的就是这个模块。
    • 另一个是:xxx-spring-boot-autoconfigure,这个模块负责自动配置功能,所有的自动配置的核心代码,都定义在这个模块中。并在在starter模块中,还要引入autoconfigure这个模块的依赖。
  • 然后再来说核心的autoconfigure模块的实现。
    • 第一步呢,就是要根据具体的需求,编写自动配置类。 基于@Configuration注解定义配置类,然后使用@Bean注解来声明bean,可以通过@Conditional系列的注解,根据条件决定是否声明这个bean。
    • 第二步,如果是SpringBoot3.x版本,则需要在新的配置文件,META-INF/spring/xxxx.SpringAutoConfiguration.imports文件中配置自动配置类的全类名。

基本上,就这么两块儿。定义好了之后,在各个项目中,就可以引入对应的starter直接使用了。

  1. 在maven项目的pom.xml中,在父工程中配置 <dependiencies> 与 <dependiencyManagement> 的区别是什么请详细描述 ?
  • <dependencies>:直接引入依赖,如果在父工程中直接引入了依赖,那么子工程会自动将这些依赖继承下来。
  • <dependencyManagement>:用于统一管理依赖的版本,通常用于多工程项目的父POM文件中,以便为所有子模块提供一致的依赖版本管理。
  1. 请简单聊聊SpringBoot项目开发中, 你经常使用的一些注解?

额,这个就很多很多了。 我就分为这么几类,说一下吧。

第一类是:声明bean,有@Component@Service@Repository@Controller

第二类是:依赖注入相关的,有@Autowired@Qualifier@Resourse

第三类是:Controller层接收请求响应数据的 @RequestMapping@RequestBody@RequestParam@PathVariable

第三类是:设置作用域 @Scope

第四类是:spring配置相关的,比如@Configuration@ComponentScan@Bean

第五类是:跟aop相关做增强的注解 @Aspect@Before@After@Around@AfterReturning@AfterThrowing@Pointcut

http://www.xdnf.cn/news/12347.html

相关文章:

  • 执行什么命令可以让内存使用率达到80%
  • STM32寄存器访问位宽确实存在16位和32位的混合情况但地址上一定要4字节对齐
  • 智慧照明:集中控制器、单双灯控制器与智慧灯杆网关的高效协同
  • 轻松掌控硬件接口:LuatIO可视化工具,物联网开发的“效率加速器”!
  • PS如何傻瓜式扣图、图片编辑、图片合成
  • 2025.5.28【33OJ NOI 模拟赛 T3】字符串(AC自动机, 字符串后缀结构)
  • [蓝桥杯]耐摔指数
  • World of Warcraft [Vault of Archavon][Reins of the Grand Black War Mammoth]
  • 导航路径优化(一)——平滑
  • Docker MCP 目录和工具包简介:使用 MCP 为 AI 代理提供支持的简单安全方法
  • Java 中比较两个 long 类型变量大小的方法
  • 从Gartner报告看Atlassian在生成式AI领域的创新路径与实践价值
  • Compose Multiplatform 实现自定义的系统托盘,解决托盘乱码问题
  • 电路设计基础-3
  • C# 委托UI控件更新例子,何时需要使用委托
  • leetcode1519. 子树中标签相同的节点数- medium
  • Python文件读取漏洞深度解析与防护指南
  • P10909 [蓝桥杯 2024 国 B] 立定跳远
  • 《涨停28式》速读笔记
  • 数据分析Agent构建
  • Word文档重新打开后标题自动缩进的解决方法
  • 基于eclipse进行Birt报表开发
  • 亲测解决grad can be implicitly created only for scalar outputs
  • 不同类型的语义相似度损失函数(SentenceTransformerLoss)
  • windows环境Google-sparsehash安装
  • Python语法进阶篇 --- 封装、继承、多态
  • ObservableRecipient与ObservableObject
  • 基于rpc框架Dubbo实现的微服务转发实战
  • Android实现轮播图
  • Vue---vue使用AOS(滚动动画)库