海鹚科技笔试
写在前面
记2024/6/3笔试
笔试题
- bootstrap.properties和application.properties的区别是什么
bootstrap.properties
和application.properties
都是 Spring Boot 中用于配置应用程序的文件,但它们有一些关键的区别:
- 加载时机不同:
bootstrap.properties
在应用程序的引导阶段加载,比application.properties
先加载。这意味着bootstrap.properties
中的配置可以覆盖application.properties
中的配置。application.properties
在 Spring 应用上下文创建之前加载。- 用途不同:
bootstrap.properties
通常用于配置需要在引导阶段加载的属性,例如外部配置中心(如 Spring Cloud Config)的连接信息。application.properties
用于配置应用程序的大部分设置。
- nacos的配置是否是实时生效的
Nacos 的配置是支持实时生效的。Nacos 通过以下机制实现配置的实时生效:
- 长轮询机制:客户端会以长轮询的方式向 Nacos 服务器请求配置变更。当配置发生变化时,服务器会立即返回变更信息,客户端接收到变更信息后可以立即应用新配置。
- 动态刷新:结合 Spring Cloud Alibaba Nacos 配置中心的使用,借助 Spring 的
@RefreshScope
注解,可以在配置变更时动态刷新 Spring Bean,使得新配置实时生效。
- springmvc的原理和执行流程
Spring MVC(Model-View-Controller)的执行流程如下:
- 接收请求:用户通过浏览器发送请求,Servlet 容器(如 Tomcat)接收请求。
- 分发请求:请求由 Servlet 容器转发给 DispatcherServlet(前端控制器)。
- HandlerMapping:DispatcherServlet 根据请求 URL 调用 HandlerMapping 来找到对应的处理器(Controller)。
- HandlerAdapter:DispatcherServlet 调用 HandlerAdapter 以适配处理器的执行。
- 处理请求:具体的处理器(Controller)执行逻辑处理,并返回一个 ModelAndView 对象。
- 视图解析:DispatcherServlet 使用 ViewResolver 将逻辑视图名解析为具体的 View(视图)。
- 渲染视图:View 渲染模型数据并生成最终的 HTML 响应。
- 返回响应:DispatcherServlet 将生成的 HTML 响应返回给 Servlet 容器,最终响应用户。
- 微服务中是如何传递用户信息的
在微服务架构中,传递用户信息的常见方法包括:
- JWT(JSON Web Token):客户端在初次认证成功后获取 JWT,并在每次请求时将其放在请求头中传递给微服务。微服务通过解析 JWT 验证用户身份。
- Session:使用分布式 Session,将用户信息保存在 Redis 等缓存中,微服务通过 Session ID 获取用户信息。
- API Gateway:在 API Gateway 中处理用户认证,并将用户信息通过请求头或上下文传递给后端微服务。
- OAuth2:使用 OAuth2 授权框架,通过 Access Token 传递用户信息。
- mybatis:pagehelper和mybatisplus的分页的原理
- PageHelper:
- PageHelper 是一个 MyBatis 的分页插件,通过拦截 SQL 执行,在 SQL 执行前增加分页语句(如 LIMIT 子句)。
- 使用方法:在查询方法前调用
PageHelper.startPage(pageNum, pageSize)
来设置分页参数,然后执行查询。- MyBatis-Plus:
- MyBatis-Plus 提供了
Page
对象,通过分页查询方法将分页参数(如当前页码和每页大小)传递给 Mapper。- 使用方法:在 Mapper 方法中使用
IPage
参数,并在方法中传递Page
对象来实现分页。
- #{} 和 ${}的区别
- **
#{}
**:占位符方式,会使用预编译语句防止 SQL 注入。使用#{}
时,MyBatis 会在 SQL 语句中生成占位符?
,并在执行前将参数安全地设置到 SQL 语句中。
1 SELECT * FROM users WHERE name = #{name}等效于:
1 SELECT * FROM users WHERE name = ?
- **
${}
**:拼接方式,会直接将参数值拼接到 SQL 语句中,不会防止 SQL 注入风险。使用${}
时,MyBatis 会将参数的值直接拼接到 SQL 语句中。
1 SELECT * FROM users WHERE name = ${name}如果
name
的值是 “John”,则等效于:
1 SELECT * FROM users WHERE name = 'John'使用
${}
时要特别小心,避免 SQL 注入攻击。通常建议使用#{}
来保证 SQL 安全性。
一道sql
一道二叉树的最大深度
项目中遇到的挑战和如何解决
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 PlanB's Blog!