阶段技术问答题目
切记:每一个问题提供了参考答案,仅仅是一个提示,不要死记硬背,要转化成自己的理解。
- 在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>
: 定义表格、表头、表格主体、行、单元格
- 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选择器 > 类选择器 > 元素选择器。
- form表单提交时,使用GET和POST提交方式各自的特点是什么?有什么区别 ?
- GET:参数附加在URL后面, 比如: http://localhost/emps?id=1&name=Tom; 适合简单查询操作; 安全性较低。 GET请求在浏览器中,请求参数大小有限制。
- POST:数据放在HTTP消息体中发送;适合复杂或敏感数据提交;安全性较高。 请求大小没有限制。
- 在JS中事件监听的语法是什么样的?常见的事件类型有哪些,请详细说明?
- 语法:
事件源.addEventListener('事件类型', 事件触发的函数function);
- 常见事件:
-
click
:鼠标点击。mouseenter
,mouseleave
:鼠标移入, 鼠标移出 。keydown
,keyup
:键盘按下, 键盘抬起。focus
,blur
:获取和失去焦点。submit
: 表单提交事件
- 什么是DOM,在JS中获取DOM对象的方式有哪些,之间的区别是什么,请详细说明?
- DOM简介:
-
- DOM(Document Object Model):文档对象模型,用于表示和操作文档结构,通过DOM操作就可以操作页面上的元素内容,元素样式等。
- 获取DOM对象方式:
-
document.querySelector('selector')
:获取匹配给定选择器的第一个元素。document.querySelectorAll('selector')
:获取所有匹配选择器的元素集合。
- 聊一聊Vue中常用的指令有哪些,以及具体的作用? v-if 和 v-show指令的区别是什么?
- Vue指令:
-
v-if
:条件渲染,当表达式为false时元素不会被渲染; 为true时才渲染。v-show
:条件渲染,始终渲染元素,但通过css样式来控制显示与隐藏。
- 区别:
-
v-if
根据条件的true/false,来决定是否渲染这个DOM元素。v-show
始终渲染DOM元素,并通过CSS的display
属性切换显示状态。
- Maven中有哪几类仓库,如果要在项目中引入一个依赖,依赖的查找顺序是什么样的? 什么是坐标,坐标由那几个部分组成。
- Maven仓库类型:
-
- 本地仓库。
- 远程仓库 (私服)。
- 中央仓库。
- 查找顺序(从上到下):
-
- 本地目录。
- 远程仓库 (私服)。
- 中央仓库。
- 坐标组成:
-
- 组织名(
<groupId>
)。 - 模块名(
<artifactId>
)。 - 版本号(
<version>
)。
- 组织名(
- Maven的生命周期分为那几套? 我们核心关注的5个生命周期阶段是哪5个,具体的作用是什么?
- 分为三套:清理(clean)、默认(default)、站点(site)。
- 重点关注的5个阶段:
-
clean
:清理上一次构建生成的文件compile
:编译项目的源代码test
:测试编译后的代码package
:将编译后的代码打包成可发布的格式,如 JAR、WAR 等install
:将打包好的代码安装到本地仓库,方便其他项目进行依赖管理
- 请聊聊在Junit单元测试中,常用的注解有哪些? 每个注解的作用是什么 ?
@Test
:定义测试方法。@BeforeEach
:每个测试方法前执行。@AfterEach
:每个测试方法后执行。@BeforeAll
:整个测试类开始前执行一次。@AfterAll
:整个测试类结束后执行一次。@ParameterizedTest
: 参数化测试。
- Maven的依赖范围是做什么用的? 常见的取值有哪些? 如何设置依赖的作用范围?
Maven依赖范围,是用来控制我们所引入进来的依赖具体在什么地方生效,在哪些位置可以使用。
常见的取值:
compile
:编译阶段。主程序、测试程序、打包运行时均有效。test
:测试阶段。测试程序有效,主程序、打包运行时无效。provided
:已提供。主程序、测试程序可用,但是不参与打包。runtime
:运行时。运行时有效。
如何设置依赖的所用范围:可以通过标签 <scope>test</scope>
来设置。
- 什么是HTTP协议? HTTP协议具有什么样的特点,请详细说明?
HTTP协议: 超本文传输协议,规定了浏览器与服务器之间数据传输的规则。
特点:
- HTTP是基于TCP协议的,面向连接,安全的协议。
- HTTP协议是基于请求响应模型的,一次请求一次响应。
- HTTP协议是无状态的协议,每一次请求响应都是独立的,后一次请求并不会携带前一次请求的数据。
- HTTP协议中请求协议的数据格式 及 响应协议的数据格式, 请详细说明 ?
请求数据格式:
- 请求行:包括请求方式、请求路径、协议版本。
- 请求头:第二行开始,以key:value形式出现的键值对。
- 请求体:发送的数据体(POST, PUT请求)。 请求头和请求体之间有一个空行。
响应数据格式:
- 响应行:协议版本、状态码、状态消息。
- 响应头:第二行开始,以key:value形式出现的键值对。
- 响应体:服务器返回的数据体。响应头和响应体之间有一个空行。
- HTTP的状态码分为哪几类,分别表示什么意思 , 请详细说明? 请说出几个常见的状态码 及 含义?
分类:
- 1xx:响应中。
- 2xx:成功状态码。
- 3xx:重定向状态码。
- 4xx:客户端错误状态码。
- 5xx:服务器错误状态码。
常见状态码:
- 200 :成功。
- 401:未认证(未登录)。
- 404:客户端错误,请求路径找不到。
- 500:服务器端异常。
- 请按照你的理解说说什么是控制反转IOC (反转的是什么,反转之前什么样,反转之后什么样),以及什么依赖注入 DI? 【按自己的理解表述】
IOC:控制反转。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。
DI:依赖注入。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
- Spring中声明 Bean的注解有哪些,分别用在什么地方呢 ? 使用了这个注解声明bean,这个bean就一定会生效吗?
声明bean的注解:
@Component
:泛用组件。@Service
:业务逻辑组件。@Repository
:数据访问层组件。@Controller
:控制器组件。@Bean
: 加在方法上,spring会将方法的返回值, 声明为IOC容器的Bean。- 不一定,取决于组件扫描范围。 启动类上加的注解
@SpringBootApplication
具备组件扫描的作用,但默认扫描的是启动类所在包及其子包。
- 请详细描述 @ResponseBody 注解的作用? 我们在编写Controller类的代码时,为什么没有使用该注解呢 ?
作用:直接将controller的返回值,作为HTTP的响应体。如果返回值是一个对象或集合,会将其先转为json,再响应。
原因:因为我们在类上加了 @RestController,而@RestController 底层已经包含了 @ResponseBody 注解。 在类上加了这个注解,就相当于在类中的每一个方法上,都加上了这个注解。
- 请详细描述一下,什么是约束?常用的约束有哪些,对应的关键字是什么,各自的应用场景?
约束:是作用于表中字段上的规则,用来保证数据库表数据的一致性,完整性,正确性。
常见约束:
- 主键(PRIMARY KEY):唯一标识一行记录。
- 外键(FOREIGN KEY):在多表中,保证数据的一致性和完整性。
- 唯一(UNIQUE):列的值必须唯一。
- 非空(NOT NULL):列不能为空。
- 默认(DEFAULT):指定默认值。
- 请详细描述char与varchar的区别? 以及在设计表时,该如何选择?
MySQL中的 char
和 varchar
都是用于存储字符串的数据类型,但它们在存储方式和性能上有所不同。以下是它们的主要区别:
第一点呢,就是存储方式不同:
- char:定长字符串,长度是固定的,不管实际存储的字符串长度如何,都会占用固定长度的存储空间。如:char(10) 会始终占用10个字符的空间。
- varchar:变长字符串,长度不固定。占用的空间与实际存储的字段长度有关。 如:varchar(10) 表示最多可以存储10个字符,如果存储的字符串长度不足10,假设为5,只会占用5个字符空间。
第二点呢,就是性能不同:
- 对于char,由于其固定长度,操作会快些,但是会存储浪费磁盘空间的问题。
- 对于varchar,由于长度可变,操作时会相对慢一点,但是可以节省磁盘空间,尤其是存储的数据长度不固定时。
- DQL语句分组查询时,where,group by,having之间的执行顺序是什么样的? where 与having的区别是什么?
执行顺序:where
---> group by
----> having
where
与 having
的区别:
where
是在分组之前,对数据进行过滤,不符合条件的数据,不会参与分组。 where后面不能使用聚合函数。having
是在分组之后,对数据进行过滤。 having之后,可以使用聚合函数。
- Mybatis的映射配置文件定义的规范是什么 ? 项目开发中,你们的SQL是基于注解方式开发的还是XML映射配置文件开发的。
XML映射文件定义规范:
- XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)。
- XML映射文件的namespace属性为Mapper接口全限定名一致。
- XML映射文件中sql语句的id与Mapper 接口中的方法名一致,并保持返回类型一致。
使用Mybatis的注解,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句。
- Mybatis 中的 # 与 $ 的区别是什么 ?实际开发中推荐用哪个? 为什么 ?
#
:预编译处理,防止SQL注入,安全。【推荐】$
:字符串拼接,容易导致SQL注入,不安全。
- 请详细描述一下 @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路径中的动态部分。
- 使用细节:配合
{}
中的占位符使用。
- 请描述一下什么Rest风格的url,涉及到哪些请求方式,这几种情况方式分别描述什么操作?
- RESTful API使用URL来表示要操作的资源,使用HTTP请求方式来表示对资源的操作(增删改查)。
- 请求方式:
-
- GET:读取资源。
- POST:创建资源。
- PUT:更新资源。
- DELETE:删除资源。
- 请描述一下 @RequestBody 注解 与 @ResponseBody 注解的作用 ? 什么时候用 @ResponseBody , 什么时候用 @RequestBody?
@RequestBody
:将请求体中的json数据转换成Java对象。
-
- 应用场景:用于POST/PUT等方式。
@ResponseBody
:直接将controller的返回值,作为HTTP的响应体。如果返回值是一个对象或集合,会将其先转为json,再响应。
- 在数据库表结构设计时, 有哪几种多表关系 ? 在数据库中, 如何维护这层多表关系 ?
- 一对一:在任意一方定义一个外键,来关联另外一方的主键 ,并为外键字段添加一个唯一约束 。
- 一对多:在多的一方添加一个外键,来关联另外一方的主键 。
- 多对多:通过中间表来维护关系,中间表至少有两个外键来关键两方的主键。
- 请详细描述内连接和外连接的区别? 外连接中左外和右外的区别?
- 内连接:查询两张表交集部分的数据。
- 外连接:
-
- 左外连接:会查询返回所有左表中的数据,以及两张表交集部分的数据。
- 右外连接:会查询返回所有右表中的数据,以及两张表交集部分的数据。
- 请详细说明一下, 分页查询的原理 ? (从前端传递的参数 , 后端执行的SQL, 后端返回的数据层面来说明)
- 前端:传递页码
page
和 每页记录数pageSize
。 - 后端SQL:使用
LIMIT
和count
实现分页。 执行两条SQL,一条sql查询指定页码对应的结果列表; 一条sql统计符合条件的总记录数。 - 后端:返回的数据包括两项,总记录数 total,结果列表 rows(List集合)。
- 请说明什么是事务? 在数据库中如何控制事务,控制事务的SQL语句 ? 以及事务的四大特性 ?请详细聊聊在项目开发中,你们的事务是如何控制的 ?
事务:一系列操作要么全部成功,要么全部失败。
控制事务的SQL:
- 开启事务:start transaction; / begin;
- 提交事务:commit;
- 回顾事务:rollback;
四大特性:
- 原子性(Atomicity):事务是不可分割的最小单元,要么全部成功,要么全部失败。
- 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
- 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
事务控制:
- 项目开发中,控制事务,我们可以在业务方法上加上 @Transactional 注解即可。 @Transactional 可以加载 方法上、类上、接口上。 推荐加在方法上。
- 请描述Mybatis中动态SQL的使用场景 , 以及 <if> 标签 ,<where> 标签、<foreach> 标签、<set>标签 的具体作用 ?
<if>
:根据条件判断是否拼接对应的SQL片段 。<where>
:自动处理WHERE关键字 和 并且会自动去除第一个条件前面多余的 AND/OR。<set>
: 用在update语句中,用来替换set关键字,并且会自动去除更新字段后面多余的逗号。<foreach>
: 循环遍历。
-
- collection
- item
- sepearator
- open
- close
- 文件上传前端页面三要素是哪三个要素 ? 在spring框架中在服务端如何接收上传上来的文件 ?
前端三要素:
- 表单提交方式:POST
- 表单的enctype属性设置为
multipart/form-data
- 表单中需要一个文件上传的项:
<input type="file">
服务端接收上传的文件:
- MultipartFile file
- 在application.yml配置文件中配置的配置项,如何在bean对象中注入进来使用 (使用什么注解,两个注解之间的区别及应用场景)?
- 使用
@Value
注解或@ConfigurationProperties
注解。
-
@Value
:适用于单一配置项。@ConfigurationProperties
:适用于复杂的配置结构,便于复用。
- 你们项目中的异常是如何处理的? 如何定义一个全局异常处理器 ? 全局异常处理器中是否可以定义多个方法来捕获不同类型的异常 ?
项目中的异常,我们并没有try...catch。 而是定义了一个全局异常处理器,来捕获所有的异常,然后针对于不同类型的异常进行不同的处理。
全局异常处理器定义:
- 类上加的注解:
@RestControllerAdvice
- 方法上加的注解:
@ExceptionHandler
全局异常处理器中是可以定义多个方法来捕获不同类型的异常的。
- 介绍一下在MySQL数据库中你经常使用的函数 ,及其作用 ?
COUNT()
: 统计总数量。SUM()
: 求和。AVG()
: 平均值。MAX()
: 最大值。MIN()
: 最小值。now()
: 获取当前系统时间。if(...)
: 条件判断。ifnull(...)
: 判断null值的。case ... when ... then ... when ... then ... end
: 流程控制函数。
- 请描述一下cron表达式(
cron="5 10 1 * * ?"
)的含义? cron表达式中,常见的特殊符号的有哪些,每一个的含义请详细描述 。
cron: 5 10 1 * * ?
cron表达式:六位 / 七位 , 分别表示: 秒 分 时 日 月 周 年(可选)
上述表达式,表示:每一天的凌晨一点十分五秒执行一次。
特殊符号:
- * : 任意
- ? : 放弃指定
- / : 表示间隔周期
- - : 表示范围
- , : 表示枚举
- 会话跟踪技术Cookie 与 Session 各自的原理是什么 ? 各自有什么优缺点 ?
Cookie:
原理:
- Cookie 是一种客户端会话跟踪技术。
-
- 服务器通过 HTTP 响应头
Set-Cookie
将数据发送给浏览器,浏览器将其保存在本地。 - 当浏览器再次请求同一服务器时,它会在请求头
Cookie
中将Cookie
发送给服务器。
- 服务器通过 HTTP 响应头
优点:
- HTTP协议中支持的技术,提供了一个响应头
Set-Cookie
, 一个请求头Cookie
。
缺点:
- 安全性较低,用户可以随意操作/禁用。
- 移动端APP无法直接使用Cookie。
- Cookie不支持跨域操作。
Session:
- Session 是一种服务器端会话跟踪技术,用于存储用户会话所需的信息。底层是基于Cookie的。
-
- 服务器为每个会话分配一个唯一的 ID(Session ID),并将该 ID 通过 Cookie 的方式发送给客户端。
优点:
- 更安全,因为数据存储在服务器端。
缺点:
- Cookie的缺点。
- 集群环境下,无法直接使用Session。
- JWT令牌由哪几个部分组成,每一个部门都表示什么含义? 存储什么样的数据?
JWT 由三个部分组成,它们分别是:
- Header(头部)
-
- 表示令牌的类型和所使用的签名算法。
- 通常格式为
{ "typ": "JWT", "alg": "HS256" }
。
- Payload(负载)
-
- 通常存储令牌的默认信息,以及自定义的数据。原始数据格式为json,进行了Base64编码后就变成了jwt的第二部分。
- Signature(签名)
-
- 用于验证接收到的 JWT 未被篡改。
- 生成方式是将 Header、Payload 和一个密钥(通常是私钥或共享密钥)使用指定的算法(如 HMAC SHA-256)进行编码。
- 拦截器的拦截路径中,/* 与 /** 的区别是什么 ? 那 /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
。
- 过滤器 Filter 与 拦截器 Interceptor 之间的区别是什么 , 请详细描述 ?
接口规范不同:
- 过滤器Filter是JavaEE规范中提供的技术,要实现Filter接口。
- 拦截器Interceptor是Spring中提供的技术,要实现HandlerInterceptor接口。
拦截范围不同:
- 过滤器的拦截范围更大,它可以拦截Web服务器中所有的资源。
- 拦截器只能拦截Spring中的资源(主要是控制器中的方法)。
- 什么是AOP? 请按照自己的理解描述一下.
aop是面向切面编程,在spring中用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取成公共模块复用,降低耦合,一般像系统的公共日志记录,事务处理,权限的控制等都可以通过AOP来实现。
可能追问:你们项目中有没有使用到AOP?
这个很多地方都用到了,比如我们当时在后台管理系统中,就是使用aop来记录了系统的操作日志、以及权限控制。那就来说一下,记录日志的操作思路吧。
主要思路是这样的,使用aop中的环绕通知 加上 基于注解@annotation
的切点表达式来实现的。
- 首先,自定义了一个注解,比如叫 @Log,然后哪些操作需要记录日志,我们就在哪些方法上加上这个注解。
- 然后再定义一个切面类,通过环绕通知,来获取原始方法在运行的各项信息,比如:类信息、方法信息、注解、请求方式、请求参数、当前操作人、操作时间、返回值等信息,全部记录下来,保存在数据库中。
当时,我们主要记录的是一些核心业务模块的增删改的操作日志,主要便于数据追踪。
- SpringAOP中的常见的通知类型有哪些? 这些通知类型的执行时机?
Spring AOP 通知类型 | |
@Around | 环绕通知,此注解标注的通知方法在目标方法前、后都被执行 |
@Before | 前置通知,此注解标注的通知方法在目标方法前被执行 |
@After | 后置通知,此注解标注的通知方法在目标方法后被执行,无论是否有异常都会执行 |
@AfterReturning | 返回后通知,此注解标注的通知方法在目标方法后被执行,有异常不会执行 |
@AfterThrowing | 异常后通知,此注解标注的通知方法发生异常后执行 |
- 常见的切入点表达式的写法有哪几种 ? 具体的写法是什么样的请详细说明?
有两种,第一种:execution 基于方法的签名来匹配切入点方法。第二种,@annotation 基于注解的方式来匹配。
- execution写法:
execution(权限修饰符
?
返回值 包名.类名.
?
方法名(方法形参类型) throws 异常
?
)
-
- 可以省略的部分:权限修饰符、包名.类名、异常
- 特殊符号:
-
-
- * :单个独立的任意符号,可以匹配任意 返回值类型,包名,类名,方法名,单个任意类型形参。也可以匹配一部分方法名。
- ..:多个任意符号,可以在方法形参类型、包名位置出现。
-
- @annotation:是基于注解的方法匹配的。比如:
@annotation(com.itheima.anno.Log)
括号,里面写的是注解的全类名。
选择原则:优先选择 execution 切入点表达式,如果 execution 不好描述,可以使用 @annotation 方式。
- 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。
- 请描述一下@Bean注解的作用及使用细节?
@Bean 注解通常是用来声明第三方bean的,是作用在方法上,框架会自动将标识了@Bean注解的方法的返回值对象交给IOC容器管理,成为IOC容器的bean对象。
如果在声明这个bean的过程中,需要用到其他的bean对象,可以直接在方法形参中注入进来。
基于@Bean注解声明的bean对象,如果没有指定名字,默认是方法名。
- SpringBoot的自动配置的原理是什么 ? 请详细描述一下 。
嗯,好的,它是这样的。
其实SpringBoot自动配置的核心,是引导类上加的注解@SpringBootApplication
底层封装的一个注解,叫@EnableAutoConfiguration
,这个注解才是实现自动化配置的核心注解。
该注解底层通过@Import
注解导入对应的配置选择器,导入了一个ImportSelector接口的实现类。 而在这个类的内部呢,读取了该项目和该项目引用的Jar包中的classpath路径下META-INF/spring/XXxxxSpringAutoConfiguration.imports
文件中的所配置的类的全类名。
在这些配置类中基于 @Bean注解 所定义的Bean,会根据条件注解@Conditional
系列注解所指定的条件来决定是否需要将其导入到Spring容器中。
一般条件判断会有像@ConditionalOnClass
这样的注解,判断是否有对应的class文件,如果有则加载该类,把这个配置类的所有的Bean放入spring容器中使用。所以,在springboot项目中,项目一旦启动,在IOC容器中其实就已经配置好了一些bean,我们在项目中就可以直接使用了。
- 项目开发中, 有没有自定义过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直接使用了。
- 在maven项目的pom.xml中,在父工程中配置 <dependiencies> 与 <dependiencyManagement> 的区别是什么请详细描述 ?
- <dependencies>:直接引入依赖,如果在父工程中直接引入了依赖,那么子工程会自动将这些依赖继承下来。
- <dependencyManagement>:用于统一管理依赖的版本,通常用于多工程项目的父POM文件中,以便为所有子模块提供一致的依赖版本管理。
- 请简单聊聊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