写在前面

记2024/6/3笔试

笔试题

  1. bootstrap.properties和application.properties的区别是什么

bootstrap.propertiesapplication.properties 都是 Spring Boot 中用于配置应用程序的文件,但它们有一些关键的区别:

  • 加载时机不同
  • bootstrap.properties 在应用程序的引导阶段加载,比 application.properties 先加载。这意味着 bootstrap.properties 中的配置可以覆盖 application.properties 中的配置。
  • application.properties 在 Spring 应用上下文创建之前加载。
  • 用途不同
  • bootstrap.properties 通常用于配置需要在引导阶段加载的属性,例如外部配置中心(如 Spring Cloud Config)的连接信息。
  • application.properties 用于配置应用程序的大部分设置。
  1. nacos的配置是否是实时生效的

Nacos 的配置是支持实时生效的。Nacos 通过以下机制实现配置的实时生效:

  • 长轮询机制:客户端会以长轮询的方式向 Nacos 服务器请求配置变更。当配置发生变化时,服务器会立即返回变更信息,客户端接收到变更信息后可以立即应用新配置。
  • 动态刷新:结合 Spring Cloud Alibaba Nacos 配置中心的使用,借助 Spring 的 @RefreshScope 注解,可以在配置变更时动态刷新 Spring Bean,使得新配置实时生效。
  1. springmvc的原理和执行流程

Spring MVC(Model-View-Controller)的执行流程如下:

  1. 接收请求:用户通过浏览器发送请求,Servlet 容器(如 Tomcat)接收请求。
  2. 分发请求:请求由 Servlet 容器转发给 DispatcherServlet(前端控制器)。
  3. HandlerMapping:DispatcherServlet 根据请求 URL 调用 HandlerMapping 来找到对应的处理器(Controller)。
  4. HandlerAdapter:DispatcherServlet 调用 HandlerAdapter 以适配处理器的执行。
  5. 处理请求:具体的处理器(Controller)执行逻辑处理,并返回一个 ModelAndView 对象。
  6. 视图解析:DispatcherServlet 使用 ViewResolver 将逻辑视图名解析为具体的 View(视图)。
  7. 渲染视图:View 渲染模型数据并生成最终的 HTML 响应。
  8. 返回响应:DispatcherServlet 将生成的 HTML 响应返回给 Servlet 容器,最终响应用户。

image-20240603201412912

  1. 微服务中是如何传递用户信息的

在微服务架构中,传递用户信息的常见方法包括:

  • JWT(JSON Web Token):客户端在初次认证成功后获取 JWT,并在每次请求时将其放在请求头中传递给微服务。微服务通过解析 JWT 验证用户身份。
  • Session:使用分布式 Session,将用户信息保存在 Redis 等缓存中,微服务通过 Session ID 获取用户信息。
  • API Gateway:在 API Gateway 中处理用户认证,并将用户信息通过请求头或上下文传递给后端微服务。
  • OAuth2:使用 OAuth2 授权框架,通过 Access Token 传递用户信息。
  1. mybatis:pagehelper和mybatisplus的分页的原理
  • PageHelper
  • PageHelper 是一个 MyBatis 的分页插件,通过拦截 SQL 执行,在 SQL 执行前增加分页语句(如 LIMIT 子句)。
  • 使用方法:在查询方法前调用 PageHelper.startPage(pageNum, pageSize) 来设置分页参数,然后执行查询。
  • MyBatis-Plus
  • MyBatis-Plus 提供了 Page 对象,通过分页查询方法将分页参数(如当前页码和每页大小)传递给 Mapper。
  • 使用方法:在 Mapper 方法中使用 IPage 参数,并在方法中传递 Page 对象来实现分页。
  1. #{} 和 ${}的区别
  • **#{}**:占位符方式,会使用预编译语句防止 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 安全性。

  1. 一道sql

  2. 一道二叉树的最大深度

  3. 项目中遇到的挑战和如何解决