<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>面试题 on 洛克里亚的五度 博客</title>
    <link>https://lv-blog.pages.dev/tags/%E9%9D%A2%E8%AF%95%E9%A2%98/</link>
    <description>Recent content in 面试题 on 洛克里亚的五度 博客</description>
    <generator>Hugo</generator>
    <language>zh</language>
    <lastBuildDate>Wed, 15 Jul 2026 00:46:10 +0800</lastBuildDate>
    <atom:link href="https://lv-blog.pages.dev/tags/%E9%9D%A2%E8%AF%95%E9%A2%98/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Flutter 相关面试题整理</title>
      <link>https://lv-blog.pages.dev/posts/programming/frontend/flutter-interview-questions/</link>
      <pubDate>Wed, 15 Jul 2026 00:46:10 +0800</pubDate>
      <guid>https://lv-blog.pages.dev/posts/programming/frontend/flutter-interview-questions/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;从互联网整理而来&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;一dart-基础&#34;&gt;一、Dart 基础&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Dart 的数据类型有哪些？&lt;/li&gt;
&lt;li&gt;var、final、const 的区别&lt;/li&gt;
&lt;li&gt;Dart 中 null safety 是什么，如何使用？&lt;/li&gt;
&lt;li&gt;late 关键字作用与使用场景&lt;/li&gt;
&lt;li&gt;Dart 函数可选参数、命名参数、位置参数区别&lt;/li&gt;
&lt;li&gt;箭头函数适用范围&lt;/li&gt;
&lt;li&gt;Dart 异步：Future、async/await 原理&lt;/li&gt;
&lt;li&gt;Stream 与 Future 区别，StreamController 使用&lt;/li&gt;
&lt;li&gt;sync*、async*、yield、yield each 作用&lt;/li&gt;
&lt;li&gt;Dart 类中 extends、implements、mixin 区别&lt;/li&gt;
&lt;li&gt;mixin 有什么限制，能否构造函数传参&lt;/li&gt;
&lt;li&gt;抽象类与接口区别&lt;/li&gt;
&lt;li&gt;泛型 T、?T、T?、required T 区别&lt;/li&gt;
&lt;li&gt;Dart 单例几种实现方式&lt;/li&gt;
&lt;li&gt;工厂构造函数 factory 作用&lt;/li&gt;
&lt;li&gt;常量构造函数使用条件&lt;/li&gt;
&lt;li&gt;级联运算符 .. 原理&lt;/li&gt;
&lt;li&gt;空值操作符 ?.、??、??= 用法&lt;/li&gt;
&lt;li&gt;Dart 枚举进阶用法，能否自定义属性方法&lt;/li&gt;
&lt;li&gt;Isolate 是什么，和线程区别，通信方式&lt;/li&gt;
&lt;li&gt;Isolate 共享内存吗，数据传递限制&lt;/li&gt;
&lt;li&gt;Zone 作用是什么&lt;/li&gt;
&lt;li&gt;Dart 垃圾回收机制&lt;/li&gt;
&lt;li&gt;函数一等公民体现在哪里&lt;/li&gt;
&lt;li&gt;typedef 作用与场景&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;二flutter-框架核心原理&#34;&gt;二、Flutter 框架核心原理&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Flutter 三棵树：Widget、Element、RenderTree 关系&lt;/li&gt;
&lt;li&gt;StatelessWidget 和 StatefulWidget 底层差异&lt;/li&gt;
&lt;li&gt;State 生命周期完整流程&lt;/li&gt;
&lt;li&gt;initState、didChangeDependencies、build、didUpdateWidget、dispose 执行时机&lt;/li&gt;
&lt;li&gt;setState 底层更新机制&lt;/li&gt;
&lt;li&gt;Widget 为什么是不可变的 immutable&lt;/li&gt;
&lt;li&gt;Element 作用，Element 复用逻辑&lt;/li&gt;
&lt;li&gt;RenderObject 职责是什么&lt;/li&gt;
&lt;li&gt;Key 的作用，几种 Key 区别（ValueKey、ObjectKey、UniqueKey、GlobalKey）&lt;/li&gt;
&lt;li&gt;GlobalKey 使用场景与隐患&lt;/li&gt;
&lt;li&gt;LocalKey 解决什么问题&lt;/li&gt;
&lt;li&gt;Widget 重建流程，哪些情况会触发重建&lt;/li&gt;
&lt;li&gt;什么是 const Widget，好处是什么&lt;/li&gt;
&lt;li&gt;Flutter 渲染流程：布局、绘制、合成步骤&lt;/li&gt;
&lt;li&gt;布局约束流程：Constraints 传递规则&lt;/li&gt;
&lt;li&gt;父布局约束如何限制子控件尺寸&lt;/li&gt;
&lt;li&gt;RepaintBoundary 作用，何时使用&lt;/li&gt;
&lt;li&gt;Layer 树作用，缓存机制&lt;/li&gt;
&lt;li&gt;Flutter 与原生 Android/iOS 渲染区别&lt;/li&gt;
&lt;li&gt;Skia 引擎作用&lt;/li&gt;
&lt;li&gt;Impeller 渲染引擎对比 Skia 优势&lt;/li&gt;
&lt;li&gt;Flutter 绘制原理，Canvas、Paint 流程&lt;/li&gt;
&lt;li&gt;PipelineOwner 作用&lt;/li&gt;
&lt;li&gt;WidgetsBinding、SchedulerBinding 职责&lt;/li&gt;
&lt;li&gt;帧调度流程：Vsync、帧回调执行顺序&lt;/li&gt;
&lt;li&gt;transientCallbacks、persistentCallbacks、postFrameCallbacks 区别&lt;/li&gt;
&lt;li&gt;Flutter 热重载原理，热重启区别&lt;/li&gt;
&lt;li&gt;编译模式：debug/profile/release 差异&lt;/li&gt;
&lt;li&gt;AOT、JIT 编译区别&lt;/li&gt;
&lt;li&gt;Flutter 页面路由底层实现原理&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;三布局--基础组件&#34;&gt;三、布局 &amp;amp; 基础组件&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Row Column Flex 布局区别，主轴交叉轴概念&lt;/li&gt;
&lt;li&gt;MainAxisAlignment、CrossAxisAlignment 所有枚举值含义&lt;/li&gt;
&lt;li&gt;Expanded、Flexible 区别，flex 参数作用&lt;/li&gt;
&lt;li&gt;Stack、Positioned 布局规则&lt;/li&gt;
&lt;li&gt;Align、Center 底层关系&lt;/li&gt;
&lt;li&gt;Padding、Container 内部结构&lt;/li&gt;
&lt;li&gt;Container 嵌套过多有什么性能问题&lt;/li&gt;
&lt;li&gt;SizedBox、ConstrainedBox、UnconstrainedBox 用途&lt;/li&gt;
&lt;li&gt;AspectRatio、FittedBox 缩放逻辑&lt;/li&gt;
&lt;li&gt;Wrap 自动换行实现原理&lt;/li&gt;
&lt;li&gt;ListView 几种构造方式区别（默认、builder、separated）&lt;/li&gt;
&lt;li&gt;ListView.builder 高性能原理，复用机制&lt;/li&gt;
&lt;li&gt;ListView 滚动复用失效场景&lt;/li&gt;
&lt;li&gt;GridView 使用与性能优化&lt;/li&gt;
&lt;li&gt;SingleChildScrollView 嵌套 ListView 报错解决方案&lt;/li&gt;
&lt;li&gt;CustomScrollView、Sliver 体系是什么&lt;/li&gt;
&lt;li&gt;SliverList、SliverGrid、SliverAppBar、SliverToBoxAdapter 使用场景&lt;/li&gt;
&lt;li&gt;SliverPersistentHeader 固定吸顶实现&lt;/li&gt;
&lt;li&gt;CustomScrollView 滚动统一原理&lt;/li&gt;
&lt;li&gt;Table、DataTable 布局特性&lt;/li&gt;
&lt;li&gt;IntrinsicHeight、IntrinsicWidth 性能损耗原因&lt;/li&gt;
&lt;li&gt;LayoutBuilder 获取父布局约束场景&lt;/li&gt;
&lt;li&gt;MediaQuery 获取设备信息，MediaQuery.of(context) 刷新机制&lt;/li&gt;
&lt;li&gt;LayoutId、MultiChildLayout 自定义布局&lt;/li&gt;
&lt;li&gt;Flow 高性能流式布局适用场景&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;四状态管理&#34;&gt;四、状态管理&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;State 自身状态管理优缺点&lt;/li&gt;
&lt;li&gt;InheritedWidget 底层原理，数据传递逻辑&lt;/li&gt;
&lt;li&gt;InheritedModel 对比 InheritedWidget 优势&lt;/li&gt;
&lt;li&gt;Provider 整套库实现原理（ChangeNotifierProvider、Consumer、Selector）&lt;/li&gt;
&lt;li&gt;Selector 为什么能精准局部刷新&lt;/li&gt;
&lt;li&gt;ChangeNotifier 通知更新机制&lt;/li&gt;
&lt;li&gt;StateProvider、FutureProvider、StreamProvider 区别&lt;/li&gt;
&lt;li&gt;Riverpod 对比 Provider 改进点&lt;/li&gt;
&lt;li&gt;Riverpod 全局状态、自动 dispose、无 context 优势&lt;/li&gt;
&lt;li&gt;StateNotifier、AsyncNotifier 使用场景&lt;/li&gt;
&lt;li&gt;Bloc 核心概念：Event、State、Bloc/Cubit&lt;/li&gt;
&lt;li&gt;Cubit 与 Bloc 区别&lt;/li&gt;
&lt;li&gt;BlocProvider、BlocConsumer、BlocBuilder、BlocListener 分工&lt;/li&gt;
&lt;li&gt;Bloc 状态单一数据源优势&lt;/li&gt;
&lt;li&gt;GetX 状态管理原理，GetController 生命周期&lt;/li&gt;
&lt;li&gt;GetX 全局路由、依赖注入实现&lt;/li&gt;
&lt;li&gt;GetX 优缺点，存在什么性能隐患&lt;/li&gt;
&lt;li&gt;Redux 在 Flutter 中使用逻辑&lt;/li&gt;
&lt;li&gt;MobX 响应式原理，Observable、Action、Reaction&lt;/li&gt;
&lt;li&gt;大型项目如何选型状态管理方案&lt;/li&gt;
&lt;li&gt;跨页面共享状态几种实现方式对比&lt;/li&gt;
&lt;li&gt;状态持久化配合状态管理怎么做&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;五路由--导航&#34;&gt;五、路由 &amp;amp; 导航&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Navigator 1.0 路由栈管理原理&lt;/li&gt;
&lt;li&gt;MaterialPageRoute、CupertinoPageRoute 区别&lt;/li&gt;
&lt;li&gt;PageRouteBuilder 自定义转场动画&lt;/li&gt;
&lt;li&gt;Navigator push/pop/pushReplacement/popUntil 逻辑&lt;/li&gt;
&lt;li&gt;路由传参几种方式&lt;/li&gt;
&lt;li&gt;Navigator 2.0 核心组件：Router、RouteInformationParser、RouterDelegate&lt;/li&gt;
&lt;li&gt;Navigator 2.0 完整路由流程&lt;/li&gt;
&lt;li&gt;GoRouter 框架底层封装逻辑&lt;/li&gt;
&lt;li&gt;GoRouter 嵌套路由、路由守卫、参数获取&lt;/li&gt;
&lt;li&gt;路由栈持久化、页面状态保存方案&lt;/li&gt;
&lt;li&gt;底部导航多 Tab 页面状态保持实现&lt;/li&gt;
&lt;li&gt;路由拦截、登录鉴权统一处理&lt;/li&gt;
&lt;li&gt;原生页面与 Flutter 页面互相跳转路由处理&lt;/li&gt;
&lt;li&gt;页面返回监听 WillPopScope、PopScope&lt;/li&gt;
&lt;li&gt;深度链接 deep link 适配方案&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;六动画&#34;&gt;六、动画&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Flutter 动画核心类：Animation、AnimationController、CurvedAnimation&lt;/li&gt;
&lt;li&gt;AnimationController vsync 作用，为什么需要 TickerProvider&lt;/li&gt;
&lt;li&gt;SingleTickerProviderStateMixin、TickerProviderStateMixin 区别&lt;/li&gt;
&lt;li&gt;Tween、Animatable 差值计算原理&lt;/li&gt;
&lt;li&gt;显式动画与隐式动画区别&lt;/li&gt;
&lt;li&gt;AnimatedContainer、AnimatedOpacity 等隐式动画底层&lt;/li&gt;
&lt;li&gt;Hero 共享元素动画实现原理&lt;/li&gt;
&lt;li&gt;PageRoute 共享 Hero 流程&lt;/li&gt;
&lt;li&gt;CustomAnimation 自定义动画组件&lt;/li&gt;
&lt;li&gt;交错动画 Interval 使用&lt;/li&gt;
&lt;li&gt;动画性能优化，避免重建&lt;/li&gt;
&lt;li&gt;Lottie 动画集成原理，性能注意点&lt;/li&gt;
&lt;li&gt;循环动画、反向动画实现&lt;/li&gt;
&lt;li&gt;动画暂停、恢复、释放资源处理&lt;/li&gt;
&lt;li&gt;自定义路由转场动画&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;七网络--本地存储&#34;&gt;七、网络 &amp;amp; 本地存储&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;dio 库封装思路，拦截器使用&lt;/li&gt;
&lt;li&gt;dio 统一请求头、错误处理、token 自动刷新&lt;/li&gt;
&lt;li&gt;取消请求 CancelToken 使用场景&lt;/li&gt;
&lt;li&gt;并发请求、超时处理&lt;/li&gt;
&lt;li&gt;Json 序列化反序列化几种方式（手动、json_serializable）&lt;/li&gt;
&lt;li&gt;fromJson/toJson 生成流程&lt;/li&gt;
&lt;li&gt;Freezed 数据模型优势&lt;/li&gt;
&lt;li&gt;http 库与 dio 对比&lt;/li&gt;
&lt;li&gt;WebSocket 在 Flutter 中使用，重连机制&lt;/li&gt;
&lt;li&gt;shared_preferences 底层存储原理&lt;/li&gt;
&lt;li&gt;Hive 本地数据库优势，Box 使用&lt;/li&gt;
&lt;li&gt;Hive 加密、大数据存储优化&lt;/li&gt;
&lt;li&gt;sqflite 数据库操作，事务使用&lt;/li&gt;
&lt;li&gt;Isolate 中操作数据库注意事项&lt;/li&gt;
&lt;li&gt;文件读写 path_provider 获取路径&lt;/li&gt;
&lt;li&gt;图片缓存 cached_network_image 实现逻辑&lt;/li&gt;
&lt;li&gt;网络请求缓存策略设计&lt;/li&gt;
&lt;li&gt;接口统一异常捕获封装方案&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;八原生交互-methodchannel&#34;&gt;八、原生交互 MethodChannel&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;MethodChannel、BasicMessageChannel、EventChannel 三者区别&lt;/li&gt;
&lt;li&gt;MethodChannel 双向通信完整流程&lt;/li&gt;
&lt;li&gt;Flutter 调用 Android 原生代码步骤&lt;/li&gt;
&lt;li&gt;Flutter 调用 iOS OC/Swift 步骤&lt;/li&gt;
&lt;li&gt;原生主动推送数据给 Flutter 使用哪个 Channel&lt;/li&gt;
&lt;li&gt;传参类型限制，复杂对象传递方案&lt;/li&gt;
&lt;li&gt;多页面 Channel 单例管理&lt;/li&gt;
&lt;li&gt;PlatformView 嵌入原生 View（Android View、iOS UIView）&lt;/li&gt;
&lt;li&gt;PlatformView 性能问题与优化&lt;/li&gt;
&lt;li&gt;原生页面跳转 Flutter 传参&lt;/li&gt;
&lt;li&gt;权限通过原生通道申请方案&lt;/li&gt;
&lt;li&gt;混合栈开发：flutterBoost 原理&lt;/li&gt;
&lt;li&gt;flutterBoost 页面生命周期同步问题&lt;/li&gt;
&lt;li&gt;原生资源与 Flutter 资源冲突处理&lt;/li&gt;
&lt;li&gt;通信通道内存泄漏如何避免&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;九性能优化专项&#34;&gt;九、性能优化专项&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Widget 重建常见诱因与规避手段&lt;/li&gt;
&lt;li&gt;const 构造优化原理&lt;/li&gt;
&lt;li&gt;Key 不合理使用导致的性能问题&lt;/li&gt;
&lt;li&gt;ListView 长列表优化方案&lt;/li&gt;
&lt;li&gt;图片加载优化：尺寸、缓存、压缩&lt;/li&gt;
&lt;li&gt;RepaintBoundary 拆分重绘区域场景&lt;/li&gt;
&lt;li&gt;减少 Layer 树层级优化&lt;/li&gt;
&lt;li&gt;避免使用 Intrinsic 系列控件原因&lt;/li&gt;
&lt;li&gt;动画卡顿排查思路&lt;/li&gt;
&lt;li&gt;DevTools 工具使用：性能面板、内存、Widget 检查&lt;/li&gt;
&lt;li&gt;内存泄漏常见场景（Timer、Stream、Channel、Animation）&lt;/li&gt;
&lt;li&gt;大图片、大量对象内存释放方案&lt;/li&gt;
&lt;li&gt;Isolate 处理耗时计算优化 UI&lt;/li&gt;
&lt;li&gt;build 方法避免耗时操作&lt;/li&gt;
&lt;li&gt;布局嵌套过深优化手段&lt;/li&gt;
&lt;li&gt;页面 dispose 资源释放规范&lt;/li&gt;
&lt;li&gt;Profile 模式性能排查要点&lt;/li&gt;
&lt;li&gt;启动速度优化（包体积、懒加载、预加载）&lt;/li&gt;
&lt;li&gt;Flutter 包体积优化方案&lt;/li&gt;
&lt;li&gt;滑动卡顿完整排查流程&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十图片手势输入弹窗组件&#34;&gt;十、图片、手势、输入、弹窗组件&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Image 几种构造：AssetImage、NetworkImage、FileImage、MemoryImage&lt;/li&gt;
&lt;li&gt;ImageProvider 缓存机制&lt;/li&gt;
&lt;li&gt;Image.network 缓存缺陷，cached_network_image 弥补方案&lt;/li&gt;
&lt;li&gt;DecorationImage、FadeInImage 使用&lt;/li&gt;
&lt;li&gt;GestureDetector 手势识别原理，多手势冲突&lt;/li&gt;
&lt;li&gt;Listener 底层原始手势与 GestureDetector 区别&lt;/li&gt;
&lt;li&gt;手势竞争、手势忽略场景&lt;/li&gt;
&lt;li&gt;InkWell 水波纹实现原理，必须嵌套 Material&lt;/li&gt;
&lt;li&gt;TextField 控制器 TextEditingController 使用&lt;/li&gt;
&lt;li&gt;TextField 输入监听、格式化、光标控制&lt;/li&gt;
&lt;li&gt;表单 Form、GlobalKey&lt;FormState&gt; 校验逻辑&lt;/li&gt;
&lt;li&gt;ModalRoute、showDialog、showBottomSheet 弹窗原理&lt;/li&gt;
&lt;li&gt;弹窗状态共享问题解决方案&lt;/li&gt;
&lt;li&gt;Draggable、LongPressDraggable 拖拽实现&lt;/li&gt;
&lt;li&gt;Transform 变换不改变布局约束特性&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十一项目工程--打包适配&#34;&gt;十一、项目工程 &amp;amp; 打包适配&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;pubspec.yaml 各字段含义，依赖版本约束&lt;/li&gt;
&lt;li&gt;本地依赖、Git 依赖、远程依赖配置&lt;/li&gt;
&lt;li&gt;pub 依赖冲突解决方法&lt;/li&gt;
&lt;li&gt;Flutter 多环境配置（开发/测试/生产）&lt;/li&gt;
&lt;li&gt;Flavor 多渠道打包 Android &amp;amp; iOS&lt;/li&gt;
&lt;li&gt;Android 打包 keystore 配置，iOS 证书配置&lt;/li&gt;
&lt;li&gt;AndroidManifest、Info.plist 权限适配&lt;/li&gt;
&lt;li&gt;屏幕适配方案：媒体查询、比例、flutter_screenutil&lt;/li&gt;
&lt;li&gt;深色模式适配实现&lt;/li&gt;
&lt;li&gt;多语言国际化 intl 库使用&lt;/li&gt;
&lt;li&gt;App 图标、启动页配置&lt;/li&gt;
&lt;li&gt;Flutter 插件开发流程&lt;/li&gt;
&lt;li&gt;平台区分代码编写（dart.io、Platform 判断）&lt;/li&gt;
&lt;li&gt;混合开发项目目录结构&lt;/li&gt;
&lt;li&gt;CI/CD 自动打包脚本思路&lt;/li&gt;
&lt;li&gt;版本号管理升级方案&lt;/li&gt;
&lt;li&gt;第三方插件兼容问题处理&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十二进阶底层--疑难场景&#34;&gt;十二、进阶底层 &amp;amp; 疑难场景&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;WidgetsApp、MaterialApp、CupertinoApp 内部结构&lt;/li&gt;
&lt;li&gt;ThemeData 主题分发原理，局部主题覆盖&lt;/li&gt;
&lt;li&gt;Navigator 上下文与页面上下文区别&lt;/li&gt;
&lt;li&gt;context 获取上层 Widget 原理，BuildContext 分类&lt;/li&gt;
&lt;li&gt;State 保存在 Element 中，Widget 重建 State 不销毁条件&lt;/li&gt;
&lt;li&gt;Offstage、Visibility 控件隐藏区别&lt;/li&gt;
&lt;li&gt;AbsorbPointer、IgnorePointer 拦截手势差异&lt;/li&gt;
&lt;li&gt;Clip 裁剪控件：ClipRect、ClipRRect、ClipOval 性能&lt;/li&gt;
&lt;li&gt;BackdropFilter 模糊控件性能损耗原因&lt;/li&gt;
&lt;li&gt;RenderBox 自定义控件完整流程&lt;/li&gt;
&lt;li&gt;自定义 RenderObject 实现步骤&lt;/li&gt;
&lt;li&gt;自定义 MultiChildRenderObjectWidget&lt;/li&gt;
&lt;li&gt;ScrollController 监听滚动、滚动定位&lt;/li&gt;
&lt;li&gt;ScrollPhysics 滚动回弹、阻尼自定义&lt;/li&gt;
&lt;li&gt;监听应用前后台切换 AppLifecycleState&lt;/li&gt;
&lt;li&gt;截屏、屏幕亮度、震动原生能力实现&lt;/li&gt;
&lt;li&gt;WebView 插件使用与通信&lt;/li&gt;
&lt;li&gt;Flutter Web 编译差异，平台兼容问题&lt;/li&gt;
&lt;li&gt;Flutter Windows/macOS/Linux 桌面端适配要点&lt;/li&gt;
&lt;li&gt;如何实现全局捕获异常&lt;/li&gt;
&lt;li&gt;Timer、StreamSubscription 忘记取消的内存泄漏&lt;/li&gt;
&lt;li&gt;列表 item 点击状态保存方案&lt;/li&gt;
&lt;li&gt;异步并发竞态条件问题处理&lt;/li&gt;
&lt;li&gt;图片大量加载 OOM 解决方案&lt;/li&gt;
&lt;li&gt;原生弹窗遮挡 Flutter 页面问题&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十三综合项目面试问答题&#34;&gt;十三、综合项目面试问答题&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;讲一下你项目整体架构分层&lt;/li&gt;
&lt;li&gt;项目状态管理选型原因&lt;/li&gt;
&lt;li&gt;长列表卡顿怎么优化的&lt;/li&gt;
&lt;li&gt;多页面共享登录状态如何实现&lt;/li&gt;
&lt;li&gt;token 过期统一拦截处理方案&lt;/li&gt;
&lt;li&gt;项目混合栈开发遇到哪些坑&lt;/li&gt;
&lt;li&gt;图片缓存、网络缓存怎么设计&lt;/li&gt;
&lt;li&gt;全局网络加载弹窗、错误页封装思路&lt;/li&gt;
&lt;li&gt;项目通用业务组件封装思路&lt;/li&gt;
&lt;li&gt;线上卡顿、崩溃排查处理经验&lt;/li&gt;
&lt;li&gt;如何实现页面无网络重试逻辑&lt;/li&gt;
&lt;li&gt;复杂表单页面状态管理方案&lt;/li&gt;
&lt;li&gt;项目包体积优化做了哪些操作&lt;/li&gt;
&lt;li&gt;多渠道、多环境配置实现&lt;/li&gt;
&lt;li&gt;封装通用 Dio 请求库完整思路&lt;/li&gt;
&lt;/ol&gt;</description>
    </item>
    <item>
      <title>MyBatis 相关面试题整理</title>
      <link>https://lv-blog.pages.dev/posts/programming/for-interview/mybatis-interview-questions/</link>
      <pubDate>Wed, 15 Jul 2026 00:46:10 +0800</pubDate>
      <guid>https://lv-blog.pages.dev/posts/programming/for-interview/mybatis-interview-questions/</guid>
      <description>&lt;h2 id=&#34;mybatis-执行流程&#34;&gt;Mybatis 执行流程&lt;/h2&gt;
&lt;p&gt;mybatis-config.xml (总规)
↓
SqlSessionFactory (总管)
↓
SqlSession (服务员) —— 包含所有执行方法
↓
Executor (大管家) —— 优先查缓存（一级/二级）
↓
MappedStatement (菜谱) —— 持有SQL、参数映射、结果映射
↓
输入参数映射 (备菜) → JDBC执行 → 输出结果映射 (装盘)
↓
返回POJO/集合 (上菜)&lt;/p&gt;
&lt;h2 id=&#34;mybatis-是否支持延迟加载&#34;&gt;Mybatis 是否支持延迟加载&lt;/h2&gt;
&lt;p&gt;支持，默认不开启&lt;/p&gt;
&lt;p&gt;collection fecthType=&amp;ldquo;lazy&amp;rdquo;&lt;/p&gt;
&lt;p&gt;mybatis配置文件延迟加载 lazyLoadingEnabled&lt;/p&gt;
&lt;p&gt;延迟加载的原理&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;CGLIB创建目标对象的代理对象&lt;/li&gt;
&lt;li&gt;调用目标方法 getOrderList&lt;/li&gt;
&lt;li&gt;调用对象 invoke 方法&lt;/li&gt;
&lt;li&gt;判断 orderList 是否为空&lt;/li&gt;
&lt;li&gt;为空，执行SQL&lt;/li&gt;
&lt;li&gt;不为空获取结果&lt;/li&gt;
&lt;li&gt;封装 orderList&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;mybatis-的一级缓存-二级缓存-用过吗&#34;&gt;Mybatis 的一级缓存 二级缓存 用过吗&lt;/h2&gt;
&lt;p&gt;本地缓存 - 基于 PerpetualCache 本质是一个 HashMap
一级缓存 - 作用域是 session 级别
二级缓存 - 作用域是namespace 和 mapper的作用域，不依赖于 session
二级缓存默认关闭
settings name=&amp;ldquo;cacheEnabled&amp;rdquo; value=&amp;ldquo;true&amp;rdquo;
当某个作用域进行了增删改操作，该作用域下的所有select的缓存将被clear&lt;/p&gt;</description>
    </item>
    <item>
      <title>React 相关面试题整理</title>
      <link>https://lv-blog.pages.dev/posts/programming/frontend/react-interview-questions/</link>
      <pubDate>Wed, 15 Jul 2026 00:46:10 +0800</pubDate>
      <guid>https://lv-blog.pages.dev/posts/programming/frontend/react-interview-questions/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;从互联网整理而来&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;一js-基础前置&#34;&gt;一、JS 基础前置&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;原型与原型链&lt;/li&gt;
&lt;li&gt;闭包、闭包引发的内存泄漏场景&lt;/li&gt;
&lt;li&gt;同步异步、宏任务微任务执行顺序&lt;/li&gt;
&lt;li&gt;Promise 状态、静态方法、链式调用&lt;/li&gt;
&lt;li&gt;async/await 原理&lt;/li&gt;
&lt;li&gt;深浅拷贝实现与区别&lt;/li&gt;
&lt;li&gt;this 指向五种场景&lt;/li&gt;
&lt;li&gt;箭头函数与普通函数差异&lt;/li&gt;
&lt;li&gt;ES6 解构、展开运算符、剩余参数&lt;/li&gt;
&lt;li&gt;var / let / const 区别&lt;/li&gt;
&lt;li&gt;CommonJS 与 ES Module 差异&lt;/li&gt;
&lt;li&gt;TypeScript 接口、泛型、交叉类型、联合类型&lt;/li&gt;
&lt;li&gt;EventLoop 完整执行流程&lt;/li&gt;
&lt;li&gt;防抖节流实现原理&lt;/li&gt;
&lt;li&gt;纯函数定义与特性&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;二react-基础核心概念&#34;&gt;二、React 基础核心概念&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;React 设计思想与核心理念&lt;/li&gt;
&lt;li&gt;虚拟 DOM 是什么，作用与优势&lt;/li&gt;
&lt;li&gt;JSX 语法本质，编译产物&lt;/li&gt;
&lt;li&gt;JSX 中 {} 可放入哪些内容，不能放什么&lt;/li&gt;
&lt;li&gt;React 元素与组件区别&lt;/li&gt;
&lt;li&gt;函数组件与类组件区别&lt;/li&gt;
&lt;li&gt;纯组件 PureComponent 原理&lt;/li&gt;
&lt;li&gt;React 单向数据流含义&lt;/li&gt;
&lt;li&gt;props 只读特性，为什么不能直接修改&lt;/li&gt;
&lt;li&gt;props.children 有哪些类型&lt;/li&gt;
&lt;li&gt;key 的作用，为什么不能用 index 做 key&lt;/li&gt;
&lt;li&gt;React 列表渲染注意事项&lt;/li&gt;
&lt;li&gt;className 代替 class、htmlFor 代替 for 原因&lt;/li&gt;
&lt;li&gt;React 事件绑定与原生 DOM 事件差异&lt;/li&gt;
&lt;li&gt;合成事件原理、事件委托机制&lt;/li&gt;
&lt;li&gt;阻止合成事件冒泡几种方式&lt;/li&gt;
&lt;li&gt;dangerouslySetInnerHTML 使用场景与风险&lt;/li&gt;
&lt;li&gt;React 为什么不直接操作 DOM&lt;/li&gt;
&lt;li&gt;Fragment 作用，短语法 &amp;lt;&amp;gt;&lt;/li&gt;
&lt;li&gt;React 严格模式 StrictMode 作用&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;三类组件生命周期class-component&#34;&gt;三、类组件生命周期（Class Component）&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;类组件完整生命周期分哪三个阶段&lt;/li&gt;
&lt;li&gt;constructor 执行时机与作用&lt;/li&gt;
&lt;li&gt;static getDerivedStateFromProps 执行时机与用途&lt;/li&gt;
&lt;li&gt;shouldComponentUpdate 返回值作用&lt;/li&gt;
&lt;li&gt;render 执行规则，禁止在其中修改 state&lt;/li&gt;
&lt;li&gt;componentDidMount 执行时机、常用场景&lt;/li&gt;
&lt;li&gt;getSnapshotBeforeUpdate 触发时机、返回值用途&lt;/li&gt;
&lt;li&gt;componentDidUpdate 参数含义，依赖判断写法&lt;/li&gt;
&lt;li&gt;componentWillUnmount 清理资源场景&lt;/li&gt;
&lt;li&gt;废弃生命周期函数有哪些，为什么废弃&lt;/li&gt;
&lt;li&gt;props 变化触发的生命周期流程&lt;/li&gt;
&lt;li&gt;setState 同步还是异步，底层批量更新逻辑&lt;/li&gt;
&lt;li&gt;setState 两种传参形式（对象/函数）区别&lt;/li&gt;
&lt;li&gt;多次连续 setState 合并规则&lt;/li&gt;
&lt;li&gt;如何在 setState 后拿到最新 state&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;四hooks-全套react168&#34;&gt;四、Hooks 全套（React16.8+）&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Hook 诞生背景，解决类组件什么痛点&lt;/li&gt;
&lt;li&gt;Hook 使用两条硬性规则&lt;/li&gt;
&lt;li&gt;useState 底层原理，为何数组解构不受顺序影响&lt;/li&gt;
&lt;li&gt;useState 传入函数初始化的优势&lt;/li&gt;
&lt;li&gt;useEffect 作用，依赖数组含义&lt;/li&gt;
&lt;li&gt;useEffect 模拟生命周期分别怎么写&lt;/li&gt;
&lt;li&gt;useEffect 返回清理函数执行时机&lt;/li&gt;
&lt;li&gt;依赖数组漏传变量引发的闭包陷阱&lt;/li&gt;
&lt;li&gt;useLayoutEffect 和 useEffect 执行顺序、区别&lt;/li&gt;
&lt;li&gt;useMemo 缓存计算值，解决什么问题&lt;/li&gt;
&lt;li&gt;useCallback 缓存函数，搭配子组件使用场景&lt;/li&gt;
&lt;li&gt;useMemo 与 useCallback 性能误区&lt;/li&gt;
&lt;li&gt;useRef 存储DOM、存储可变数据两种用法&lt;/li&gt;
&lt;li&gt;ref 传递 forwardRef 使用场景&lt;/li&gt;
&lt;li&gt;useImperativeHandle 作用&lt;/li&gt;
&lt;li&gt;useContext 跨层级传值，使用缺陷&lt;/li&gt;
&lt;li&gt;useReducer 适用场景，和 useState 对比&lt;/li&gt;
&lt;li&gt;useReducer 简单实现思路&lt;/li&gt;
&lt;li&gt;useId 作用，解决什么问题&lt;/li&gt;
&lt;li&gt;useTransition 区分紧急/非紧急更新&lt;/li&gt;
&lt;li&gt;useDeferredValue 延迟计算值&lt;/li&gt;
&lt;li&gt;useSyncExternalStore 订阅外部数据源&lt;/li&gt;
&lt;li&gt;useDebugValue 自定义Hook调试展示&lt;/li&gt;
&lt;li&gt;自定义 Hook 封装规范，复用逻辑思路&lt;/li&gt;
&lt;li&gt;Hook 闭包陷阱完整成因与解决方案&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;五react18-新特性&#34;&gt;五、React18 新特性&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;React18 并发渲染 Concurrent Mode 含义&lt;/li&gt;
&lt;li&gt;自动批处理更新范围变化&lt;/li&gt;
&lt;li&gt;createRoot 替换 legacy root 差异&lt;/li&gt;
&lt;li&gt;Suspense 服务端/客户端用法&lt;/li&gt;
&lt;li&gt;Transitions API 解决场景&lt;/li&gt;
&lt;li&gt;自动插入批处理，异步回调内也合并更新&lt;/li&gt;
&lt;li&gt;useTransition 与 useDeferredValue 区别&lt;/li&gt;
&lt;li&gt;服务端组件 RSC 基础概念&lt;/li&gt;
&lt;li&gt;StrictMode 双重渲染机制目的&lt;/li&gt;
&lt;li&gt;批量更新边界，何时不会合并state更新&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;六diff-算法与渲染更新&#34;&gt;六、Diff 算法与渲染更新&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;React Diff 三大策略&lt;/li&gt;
&lt;li&gt;同层比较，不跨层级对比原因&lt;/li&gt;
&lt;li&gt;无key、index key、唯一key三种场景对比&lt;/li&gt;
&lt;li&gt;节点删除、新增、移动判断逻辑&lt;/li&gt;
&lt;li&gt;文本节点、组件节点 Diff 区别&lt;/li&gt;
&lt;li&gt;列表 Diff 优化逻辑&lt;/li&gt;
&lt;li&gt;什么情况下组件会重新渲染&lt;/li&gt;
&lt;li&gt;如何避免不必要的重渲染&lt;/li&gt;
&lt;li&gt;memo、useMemo、useCallback 配合使用完整逻辑&lt;/li&gt;
&lt;li&gt;渲染流程：render → 生成VNode → Diff → 真实DOM更新&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;七组件通信方案&#34;&gt;七、组件通信方案&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;父子组件 props 传值、回调传方法&lt;/li&gt;
&lt;li&gt;多层级透传 props 缺点&lt;/li&gt;
&lt;li&gt;Context API 跨层级通信优缺点&lt;/li&gt;
&lt;li&gt;Context 配合 useReducer 简易状态管理&lt;/li&gt;
&lt;li&gt;父访问子组件实例 ref&lt;/li&gt;
&lt;li&gt;子调用父方法回调函数&lt;/li&gt;
&lt;li&gt;兄弟组件通信几种方案&lt;/li&gt;
&lt;li&gt;全局事件总线实现与缺陷&lt;/li&gt;
&lt;li&gt;跨页面全局状态管理方案对比&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;八状态管理-redux--redux-toolkit--zustand&#34;&gt;八、状态管理 Redux / Redux Toolkit / Zustand&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Redux 三大核心原则&lt;/li&gt;
&lt;li&gt;Redux 五大核心概念：Store、Action、Reducer、Dispatch、State&lt;/li&gt;
&lt;li&gt;Reducer 必须纯函数要求&lt;/li&gt;
&lt;li&gt;Action plain object 规范，为什么不能异步&lt;/li&gt;
&lt;li&gt;中间件 middleware 作用，执行流程&lt;/li&gt;
&lt;li&gt;redux-thunk 异步处理原理&lt;/li&gt;
&lt;li&gt;redux-saga 对比 thunk 优势&lt;/li&gt;
&lt;li&gt;combineReducers 拆分模块原理&lt;/li&gt;
&lt;li&gt;react-redux 核心 API Provider、connect&lt;/li&gt;
&lt;li&gt;mapStateToProps、mapDispatchToProps 作用&lt;/li&gt;
&lt;li&gt;useSelector、useDispatch Hook 用法&lt;/li&gt;
&lt;li&gt;Redux 数据单向流动完整流程&lt;/li&gt;
&lt;li&gt;Redux Toolkit 解决原生Redux哪些痛点&lt;/li&gt;
&lt;li&gt;createSlice 内置 reducer、action 生成&lt;/li&gt;
&lt;li&gt;RTK 内置immer 实现可变写法原理&lt;/li&gt;
&lt;li&gt;RTK Query 接口缓存、请求管理&lt;/li&gt;
&lt;li&gt;Zustand 轻量状态库对比Redux优势&lt;/li&gt;
&lt;li&gt;状态持久化 redux-persist 流程&lt;/li&gt;
&lt;li&gt;大型项目状态库选型思路&lt;/li&gt;
&lt;li&gt;多组件共享全局状态最佳实践&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;九react-router-v6&#34;&gt;九、React Router v6&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;v5 与 v6 核心改动差异&lt;/li&gt;
&lt;li&gt;createBrowserRouter 路由配置方式&lt;/li&gt;
&lt;li&gt;BrowserRouter、HashRouter、MemoryRouter 区别&lt;/li&gt;
&lt;li&gt;Routes 替代 Switch 作用&lt;/li&gt;
&lt;li&gt;Route element 传组件写法&lt;/li&gt;
&lt;li&gt;useNavigate 替代 useHistory&lt;/li&gt;
&lt;li&gt;路由传参 params、search、state 三种方式&lt;/li&gt;
&lt;li&gt;useParams、useSearchParams 使用&lt;/li&gt;
&lt;li&gt;嵌套路由 Outlet 占位原理&lt;/li&gt;
&lt;li&gt;index 索引路由作用&lt;/li&gt;
&lt;li&gt;Link、NavLink 区别&lt;/li&gt;
&lt;li&gt;路由守卫鉴权封装方案&lt;/li&gt;
&lt;li&gt;路由懒加载 + Suspense 配置&lt;/li&gt;
&lt;li&gt;useLocation 获取路由信息&lt;/li&gt;
&lt;li&gt;动态路由、路由拦截封装&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十表单处理&#34;&gt;十、表单处理&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;受控组件与非受控组件定义、区别&lt;/li&gt;
&lt;li&gt;受控组件完整实现思路&lt;/li&gt;
&lt;li&gt;非受控组件通过 ref 获取值场景&lt;/li&gt;
&lt;li&gt;多表单项统一封装受控逻辑&lt;/li&gt;
&lt;li&gt;第三方表单库 Formik / React Hook Form 对比&lt;/li&gt;
&lt;li&gt;React Hook Form 非受控高性能原理&lt;/li&gt;
&lt;li&gt;表单校验方案：原生、yup、zod&lt;/li&gt;
&lt;li&gt;表单批量重置、回填数据处理&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十一样式方案&#34;&gt;十一、样式方案&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;inline 内联样式优缺点&lt;/li&gt;
&lt;li&gt;CSS Modules 样式隔离原理&lt;/li&gt;
&lt;li&gt;styled-components CSS-in-JS 原理&lt;/li&gt;
&lt;li&gt;emotion 与 styled-components 对比&lt;/li&gt;
&lt;li&gt;tailwindcss 在React项目使用优势&lt;/li&gt;
&lt;li&gt;动态样式几种实现方式&lt;/li&gt;
&lt;li&gt;全局样式污染解决方案&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十二工程化构建&#34;&gt;十二、工程化构建&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Create React App 底层 webpack 配置&lt;/li&gt;
&lt;li&gt;Vite 构建React项目优势，esbuild预构建&lt;/li&gt;
&lt;li&gt;vite.config.js 常用配置项&lt;/li&gt;
&lt;li&gt;webpack 处理jsx、ts-loader流程&lt;/li&gt;
&lt;li&gt;babel 转换 JSX、polyfill 原理&lt;/li&gt;
&lt;li&gt;.env 环境变量区分开发/测试/生产&lt;/li&gt;
&lt;li&gt;跨域代理 proxy 配置&lt;/li&gt;
&lt;li&gt;路由懒加载分包代码分割&lt;/li&gt;
&lt;li&gt;Tree-Shaking 生效条件&lt;/li&gt;
&lt;li&gt;打包体积优化手段&lt;/li&gt;
&lt;li&gt;第三方组件库按需引入配置&lt;/li&gt;
&lt;li&gt;unplugin-auto-import 自动导入hooks&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十三网络请求封装&#34;&gt;十三、网络请求封装&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;axios 请求拦截、响应拦截封装&lt;/li&gt;
&lt;li&gt;全局 loading、统一错误处理&lt;/li&gt;
&lt;li&gt;token 过期无感刷新实现逻辑&lt;/li&gt;
&lt;li&gt;重复请求取消方案 CancelToken&lt;/li&gt;
&lt;li&gt;请求并发处理&lt;/li&gt;
&lt;li&gt;封装自定义请求Hook&lt;/li&gt;
&lt;li&gt;SWR / React Query 数据请求缓存库原理&lt;/li&gt;
&lt;li&gt;React Query 自动重请求、缓存失效策略&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十四性能优化专题&#34;&gt;十四、性能优化专题&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;组件无效重渲染全部诱因&lt;/li&gt;
&lt;li&gt;memo 缓存函数组件条件&lt;/li&gt;
&lt;li&gt;useCallback 缓存函数使用场景&lt;/li&gt;
&lt;li&gt;useMemo 缓存计算结果适用场景&lt;/li&gt;
&lt;li&gt;列表渲染优化策略&lt;/li&gt;
&lt;li&gt;虚拟列表 react-window / react-virtualized 原理&lt;/li&gt;
&lt;li&gt;图片懒加载实现&lt;/li&gt;
&lt;li&gt;路由懒加载分包优化首屏&lt;/li&gt;
&lt;li&gt;大组件拆分、状态下沉优化&lt;/li&gt;
&lt;li&gt;避免在render内创建函数/对象&lt;/li&gt;
&lt;li&gt;React DevTools Profiler 排查卡顿&lt;/li&gt;
&lt;li&gt;减少Context频繁更新范围&lt;/li&gt;
&lt;li&gt;定时器、订阅事件组件卸载清理&lt;/li&gt;
&lt;li&gt;打包体积压缩：gzip、剔除无用依赖&lt;/li&gt;
&lt;li&gt;并发更新优化用户交互体验&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十五进阶底层原理&#34;&gt;十五、进阶底层原理&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Fiber 架构解决旧架构什么问题&lt;/li&gt;
&lt;li&gt;Fiber 节点结构、任务拆分机制&lt;/li&gt;
&lt;li&gt;协调阶段、提交阶段分工&lt;/li&gt;
&lt;li&gt;可中断、可恢复、可优先级调度原理&lt;/li&gt;
&lt;li&gt;调和过程完整流程&lt;/li&gt;
&lt;li&gt;批量更新实现机制&lt;/li&gt;
&lt;li&gt;合成事件系统底层池化机制&lt;/li&gt;
&lt;li&gt;React 事务机制&lt;/li&gt;
&lt;li&gt;Portal 传送门实现原理，事件冒泡特点&lt;/li&gt;
&lt;li&gt;ErrorBoundary 错误捕获范围，无法捕获哪些错误&lt;/li&gt;
&lt;li&gt;React 服务端渲染 SSR 流程&lt;/li&gt;
&lt;li&gt;Next.js 与 CRA 区别，SSR/SSG/ISR 概念&lt;/li&gt;
&lt;li&gt;Hydrate 水合作用，水合不匹配成因&lt;/li&gt;
&lt;li&gt;RSC React Server Components 运行机制&lt;/li&gt;
&lt;li&gt;微前端中 React 应用隔离方案&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十六项目实战场景题&#34;&gt;十六、项目实战场景题&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;项目目录分层架构设计&lt;/li&gt;
&lt;li&gt;状态管理选型理由&lt;/li&gt;
&lt;li&gt;大型表单封装思路&lt;/li&gt;
&lt;li&gt;页面按钮、接口权限控制实现&lt;/li&gt;
&lt;li&gt;首屏加载缓慢优化方案&lt;/li&gt;
&lt;li&gt;列表大量数据渲染卡顿解决&lt;/li&gt;
&lt;li&gt;全局弹窗、消息提示封装&lt;/li&gt;
&lt;li&gt;路由鉴权、未登录跳转逻辑&lt;/li&gt;
&lt;li&gt;组件复用抽离自定义Hook规范&lt;/li&gt;
&lt;li&gt;线上报错捕获监控方案&lt;/li&gt;
&lt;li&gt;多环境变量、多渠道打包配置&lt;/li&gt;
&lt;li&gt;防抖节流在搜索框场景实现&lt;/li&gt;
&lt;li&gt;页面返回保留表单状态实现&lt;/li&gt;
&lt;li&gt;重复提交接口拦截处理&lt;/li&gt;
&lt;li&gt;React 项目迁移 TS 改造思路&lt;/li&gt;
&lt;/ol&gt;</description>
    </item>
    <item>
      <title>Redis 相关面试题整理</title>
      <link>https://lv-blog.pages.dev/posts/programming/for-interview/redis-interview-questions/</link>
      <pubDate>Wed, 15 Jul 2026 00:46:10 +0800</pubDate>
      <guid>https://lv-blog.pages.dev/posts/programming/for-interview/redis-interview-questions/</guid>
      <description>&lt;h2 id=&#34;你的项目的哪些场景使用了-redis&#34;&gt;你的项目的哪些场景使用了 redis&lt;/h2&gt;
&lt;h2 id=&#34;如果发生了缓存击穿穿透雪崩如何解决&#34;&gt;如果发生了缓存击穿、穿透、雪崩如何解决&lt;/h2&gt;
&lt;h2 id=&#34;redis-作为缓存-mysql的数据如何与redis进行同步&#34;&gt;redis 作为缓存， mysql的数据如何与redis进行同步？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;先介绍业务，看看业务符合什么场景&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;一致性较高场景&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;双写一致
&lt;ul&gt;
&lt;li&gt;读&lt;/li&gt;
&lt;li&gt;写 | 延迟双删&lt;/li&gt;
&lt;li&gt;分布式锁
&lt;ul&gt;
&lt;li&gt;读多写少
&lt;ul&gt;
&lt;li&gt;共享锁&lt;/li&gt;
&lt;li&gt;排它锁&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;允许延迟一致&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;介绍一下你的异步方案&#34;&gt;介绍一下你的异步方案&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;允许延时一致的业务，采用异步通知
&lt;ul&gt;
&lt;li&gt;MQ消息中间件&lt;/li&gt;
&lt;li&gt;Canal中间件&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;强一致性（Redisson读写锁）
&lt;ul&gt;
&lt;li&gt;共享锁
&lt;ul&gt;
&lt;li&gt;阻塞写操作&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;排它锁
&lt;ul&gt;
&lt;li&gt;阻塞读和写操作&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;redis作为缓存数据的持久化是怎么做的&#34;&gt;Redis作为缓存，数据的持久化是怎么做的？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;RDB
&lt;ul&gt;
&lt;li&gt;save&lt;/li&gt;
&lt;li&gt;bgsave&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;AOF&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;rdb-的执行原理&#34;&gt;RDB 的执行原理？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;fork主进程得到子进程&lt;/li&gt;
&lt;li&gt;子进程共享主进程的内存数据（复制页表）&lt;/li&gt;
&lt;li&gt;copy-on-write&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;aof-的执行原理&#34;&gt;AOF 的执行原理&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;配置项&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;always&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;everysec&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;no&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重写触发&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;bgrewriteaof&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;rdb-和-aof-对比&#34;&gt;RDB 和 AOF 对比&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;持久化方式&lt;/li&gt;
&lt;li&gt;数据完整性&lt;/li&gt;
&lt;li&gt;文件大小&lt;/li&gt;
&lt;li&gt;宕机恢复速度&lt;/li&gt;
&lt;li&gt;数据恢复优先级&lt;/li&gt;
&lt;li&gt;系统资源占用&lt;/li&gt;
&lt;li&gt;使用场景&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;redis-的key过期了会立即删除吗&#34;&gt;redis 的key过期了会立即删除吗&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;惰性删除&lt;/li&gt;
&lt;li&gt;定期删除
&lt;ul&gt;
&lt;li&gt;SLOW（10hz）&lt;/li&gt;
&lt;li&gt;FAST&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Redis的过期策略：惰性删除+定期删除 配合使用&lt;/p&gt;
&lt;h2 id=&#34;redis-数据淘汰策略&#34;&gt;Redis 数据淘汰策略&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;noeviction&lt;/li&gt;
&lt;li&gt;volatile-ttl&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;allkeys-random&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;volatile-random&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;allkeys-lru&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;volatile-lru&lt;/li&gt;
&lt;li&gt;allkeys-lfu&lt;/li&gt;
&lt;li&gt;volatile-lfu&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;数据库有1000万数据redis只能缓存20万如何保证redis中的数据都是热点数据&#34;&gt;数据库有1000万数据，redis只能缓存20万，如何保证redis中的数据都是热点数据？&lt;/h2&gt;
&lt;p&gt;使用 allkeys-lru&lt;/p&gt;</description>
    </item>
    <item>
      <title>Vue 相关面试题整理</title>
      <link>https://lv-blog.pages.dev/posts/programming/frontend/vue-interview-questions/</link>
      <pubDate>Wed, 15 Jul 2026 00:46:10 +0800</pubDate>
      <guid>https://lv-blog.pages.dev/posts/programming/frontend/vue-interview-questions/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;从互联网整理而来&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;一jsts-前置基础&#34;&gt;一、JS/TS 前置基础&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;var、let、const 区别&lt;/li&gt;
&lt;li&gt;原型、原型链原理&lt;/li&gt;
&lt;li&gt;闭包概念、使用场景、内存泄漏风险&lt;/li&gt;
&lt;li&gt;同步异步、宏任务微任务执行顺序&lt;/li&gt;
&lt;li&gt;Promise 三种状态、链式调用、静态方法&lt;/li&gt;
&lt;li&gt;async/await 底层原理&lt;/li&gt;
&lt;li&gt;数组常用遍历方法差异&lt;/li&gt;
&lt;li&gt;深浅拷贝实现与区别&lt;/li&gt;
&lt;li&gt;Object.defineProperty 与 Proxy 对比&lt;/li&gt;
&lt;li&gt;Reflect 对象作用&lt;/li&gt;
&lt;li&gt;箭头函数与普通函数区别&lt;/li&gt;
&lt;li&gt;解构赋值、展开运算符&lt;/li&gt;
&lt;li&gt;ES6 模块 import/export 与 CommonJS 区别&lt;/li&gt;
&lt;li&gt;TypeScript 泛型、接口、类型推导&lt;/li&gt;
&lt;li&gt;EventLoop 完整执行流程&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;二vue2-基础核心&#34;&gt;二、Vue2 基础核心&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Vue 双向绑定底层原理&lt;/li&gt;
&lt;li&gt;Object.defineProperty 如何监听对象、数组变化&lt;/li&gt;
&lt;li&gt;Vue2 数组重写了哪些方法，为什么不能监听下标修改&lt;/li&gt;
&lt;li&gt;Dep、Watcher、Observer 三者关系&lt;/li&gt;
&lt;li&gt;什么是响应式依赖收集、派发更新&lt;/li&gt;
&lt;li&gt;数据劫持流程完整过程&lt;/li&gt;
&lt;li&gt;computed 和 watch 区别&lt;/li&gt;
&lt;li&gt;computed 缓存实现原理&lt;/li&gt;
&lt;li&gt;methods、computed、watch 使用场景区分&lt;/li&gt;
&lt;li&gt;Vue 生命周期全部钩子及执行时机&lt;/li&gt;
&lt;li&gt;created、mounted、updated、destroyed 使用场景&lt;/li&gt;
&lt;li&gt;父子组件生命周期执行顺序&lt;/li&gt;
&lt;li&gt;v-if 和 v-show 底层区别与性能差异&lt;/li&gt;
&lt;li&gt;v-for 绑定 key 的作用，key 不能用 index 的原因&lt;/li&gt;
&lt;li&gt;v-if 和 v-for 同时使用的优先级与问题&lt;/li&gt;
&lt;li&gt;v-model 底层语法糖实现&lt;/li&gt;
&lt;li&gt;修饰符 .lazy .number .trim 原理&lt;/li&gt;
&lt;li&gt;指令自定义实现，钩子函数有哪些&lt;/li&gt;
&lt;li&gt;过滤器 filter 使用场景，Vue3 废弃原因&lt;/li&gt;
&lt;li&gt;插值表达式、v-text、v-html 区别&lt;/li&gt;
&lt;li&gt;Vue 模板编译流程&lt;/li&gt;
&lt;li&gt;render 函数与 template 关系&lt;/li&gt;
&lt;li&gt;VNode 虚拟 DOM 结构作用&lt;/li&gt;
&lt;li&gt;Diff 算法执行流程&lt;/li&gt;
&lt;li&gt;Vue2 Diff 同层比较、key 作用、头尾指针优化&lt;/li&gt;
&lt;li&gt;patch 函数更新逻辑&lt;/li&gt;
&lt;li&gt;nextTick 原理，微任务/宏任务降级策略&lt;/li&gt;
&lt;li&gt;$nextTick 使用场景&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;三vue2-组件通信&#34;&gt;三、Vue2 组件通信&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;父子组件 props 传递规则，单向数据流&lt;/li&gt;
&lt;li&gt;props 类型校验、默认值、必填配置&lt;/li&gt;
&lt;li&gt;$emit 子传父实现&lt;/li&gt;
&lt;li&gt;.sync 修饰符作用，Vue3 移除原因&lt;/li&gt;
&lt;li&gt;$parent、$children、$refs 获取组件/元素&lt;/li&gt;
&lt;li&gt;provide / inject 使用场景与响应式缺陷&lt;/li&gt;
&lt;li&gt;EventBus 事件总线实现、内存泄漏问题&lt;/li&gt;
&lt;li&gt;Vuex 全局状态通信完整流程&lt;/li&gt;
&lt;li&gt;$attrs、$listeners 跨层级透传&lt;/li&gt;
&lt;li&gt;跨页面、多层级组件通信方案对比&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;四vuex-状态管理&#34;&gt;四、Vuex 状态管理&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Vuex 五大核心概念 state、getters、mutations、actions、modules&lt;/li&gt;
&lt;li&gt;mutations 必须同步、actions 异步原因&lt;/li&gt;
&lt;li&gt;commit 和 dispatch 区别&lt;/li&gt;
&lt;li&gt;getters 缓存特性&lt;/li&gt;
&lt;li&gt;modules 模块划分，命名空间 namespaced&lt;/li&gt;
&lt;li&gt;辅助函数 mapState/mapGetters/mapMutations/mapActions 使用&lt;/li&gt;
&lt;li&gt;Vuex 持久化存储方案&lt;/li&gt;
&lt;li&gt;Vuex 严格模式 strict 作用&lt;/li&gt;
&lt;li&gt;多个组件同时修改同一 state 数据流&lt;/li&gt;
&lt;li&gt;Vuex 底层响应式原理&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;五vue-router-23&#34;&gt;五、Vue Router 2/3&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;SPA 单页面路由实现原理&lt;/li&gt;
&lt;li&gt;hash 模式与 history 模式底层区别&lt;/li&gt;
&lt;li&gt;history 模式后端 nginx 配置问题&lt;/li&gt;
&lt;li&gt;路由导航守卫分类：全局、路由独享、组件内&lt;/li&gt;
&lt;li&gt;导航守卫执行完整顺序&lt;/li&gt;
&lt;li&gt;$route 和 $router 区别&lt;/li&gt;
&lt;li&gt;路由传参 params 和 query 差异&lt;/li&gt;
&lt;li&gt;params 刷新丢失参数解决方案&lt;/li&gt;
&lt;li&gt;动态路由匹配、路由嵌套&lt;/li&gt;
&lt;li&gt;路由懒加载实现与分包&lt;/li&gt;
&lt;li&gt;addRoutes、addRoute 动态添加路由&lt;/li&gt;
&lt;li&gt;路由元信息 meta 使用场景&lt;/li&gt;
&lt;li&gt;路由缓存 keep-alive 原理&lt;/li&gt;
&lt;li&gt;include/exclude/max 参数作用&lt;/li&gt;
&lt;li&gt;activated、deactivated 生命周期钩子&lt;/li&gt;
&lt;li&gt;路由跳转 push、replace、go 区别&lt;/li&gt;
&lt;li&gt;登录鉴权全局路由拦截实现&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;六vue2-进阶知识点&#34;&gt;六、Vue2 进阶知识点&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;keep-alive 缓存组件底层逻辑&lt;/li&gt;
&lt;li&gt;异步组件、组件懒加载&lt;/li&gt;
&lt;li&gt;组件递归实现菜单、树形结构&lt;/li&gt;
&lt;li&gt;$once、$off、$on 事件方法&lt;/li&gt;
&lt;li&gt;插槽分类：默认插槽、具名插槽、作用域插槽&lt;/li&gt;
&lt;li&gt;作用域插槽数据传递原理&lt;/li&gt;
&lt;li&gt;v-once 指令作用&lt;/li&gt;
&lt;li&gt;Vue 模板编译生成 AST 抽象语法树&lt;/li&gt;
&lt;li&gt;异步更新队列机制&lt;/li&gt;
&lt;li&gt;页面大量数据渲染卡顿优化方案&lt;/li&gt;
&lt;li&gt;Object.freeze 冻结数据对响应式的影响&lt;/li&gt;
&lt;li&gt;$set 原理，什么场景必须使用&lt;/li&gt;
&lt;li&gt;Vue2 响应式存在的缺陷&lt;/li&gt;
&lt;li&gt;全局过滤器、全局指令、全局组件注册&lt;/li&gt;
&lt;li&gt;mixin 混入原理、合并规则、冲突问题&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;七vue3-核心升级composition-api&#34;&gt;七、Vue3 核心升级（Composition API）&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Vue3 相比 Vue2 性能提升点&lt;/li&gt;
&lt;li&gt;Vue3 响应式改用 Proxy 优势&lt;/li&gt;
&lt;li&gt;Proxy 对比 Object.defineProperty 解决了哪些痛点&lt;/li&gt;
&lt;li&gt;Reflect 配合 Proxy 的作用&lt;/li&gt;
&lt;li&gt;reactive、ref 区别与底层实现&lt;/li&gt;
&lt;li&gt;ref 为什么基础类型需要包裹对象&lt;/li&gt;
&lt;li&gt;toRef、toRefs 使用场景，解决的问题&lt;/li&gt;
&lt;li&gt;computed 在 setup 中使用方式&lt;/li&gt;
&lt;li&gt;watch、watchEffect 区别&lt;/li&gt;
&lt;li&gt;watch 监听对象、数组深度监听配置&lt;/li&gt;
&lt;li&gt;setup 执行时机，this 指向问题&lt;/li&gt;
&lt;li&gt;setup 参数 props、context 内容&lt;/li&gt;
&lt;li&gt;Composition API 对比 Options API 优势&lt;/li&gt;
&lt;li&gt;script setup 语法糖带来的变化&lt;/li&gt;
&lt;li&gt;script setup 中 defineProps、defineEmits、defineExpose&lt;/li&gt;
&lt;li&gt;生命周期钩子组合式写法 onMounted/onUpdated 等&lt;/li&gt;
&lt;li&gt;getCurrentInstance 获取组件实例&lt;/li&gt;
&lt;li&gt;provide / inject 在 Vue3 中如何实现响应式&lt;/li&gt;
&lt;li&gt;自定义 hooks 封装思路，复用逻辑&lt;/li&gt;
&lt;li&gt;Vue3 生命周期完整列表，与 Vue2 对应关系&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;八vue3-模板编译diff-优化&#34;&gt;八、Vue3 模板、编译、Diff 优化&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Vue3 模板编译优化：PatchFlags 标记&lt;/li&gt;
&lt;li&gt;静态提升原理，减少 VNode 创建开销&lt;/li&gt;
&lt;li&gt;缓存内联事件处理函数&lt;/li&gt;
&lt;li&gt;Vue3 Diff 算法优化：最长递增子序列&lt;/li&gt;
&lt;li&gt;Diff 对比流程相比 Vue2 改进点&lt;/li&gt;
&lt;li&gt;Fragment 根节点多标签支持原理&lt;/li&gt;
&lt;li&gt;Teleport 传送门组件底层实现&lt;/li&gt;
&lt;li&gt;Suspense 异步组件加载处理&lt;/li&gt;
&lt;li&gt;v-model 在 Vue3 语法变更，多 v-model 实现&lt;/li&gt;
&lt;li&gt;.v-model 修饰符自定义处理&lt;/li&gt;
&lt;li&gt;插槽 v-slot 简写语法变化&lt;/li&gt;
&lt;li&gt;Vue3 移除 filter 过滤器替代方案&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;九piniavue3-状态管理&#34;&gt;九、Pinia（Vue3 状态管理）&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Pinia 相比 Vuex 的优势&lt;/li&gt;
&lt;li&gt;Pinia 核心概念 state、getters、actions&lt;/li&gt;
&lt;li&gt;Pinia 支持同步异步，不再区分 mutations&lt;/li&gt;
&lt;li&gt;defineStore 定义仓库，id 作用&lt;/li&gt;
&lt;li&gt;直接修改 state 与 $patch 批量更新区别&lt;/li&gt;
&lt;li&gt;$reset、$subscribe、$onAction 使用场景&lt;/li&gt;
&lt;li&gt;Pinia 模块化拆分，无需命名空间&lt;/li&gt;
&lt;li&gt;Pinia 持久化插件使用&lt;/li&gt;
&lt;li&gt;setup 语法下使用 Pinia&lt;/li&gt;
&lt;li&gt;多个仓库互相调用数据方法&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十vue-router-4vue3&#34;&gt;十、Vue Router 4（Vue3）&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;createRouter、createWebHashHistory、createWebHistory&lt;/li&gt;
&lt;li&gt;RouterView、RouterLink v-slot 插槽用法&lt;/li&gt;
&lt;li&gt;useRoute、useRouter 组合式 API 获取路由实例&lt;/li&gt;
&lt;li&gt;动态路由 addRoute 替换 addRoutes&lt;/li&gt;
&lt;li&gt;路由守卫组合式写法&lt;/li&gt;
&lt;li&gt;路由缓存与 Suspense 配合&lt;/li&gt;
&lt;li&gt;路由元类型 TS 类型提示处理&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十一vue3-高级特性&#34;&gt;十一、Vue3 高级特性&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;watchPostEffect、watchSyncEffect 区别&lt;/li&gt;
&lt;li&gt;shallowRef、shallowReactive 浅层响应式作用&lt;/li&gt;
&lt;li&gt;readonly、shallowReadonly 只读代理&lt;/li&gt;
&lt;li&gt;customRef 自定义响应式引用&lt;/li&gt;
&lt;li&gt;effectScope 作用域收集副作用&lt;/li&gt;
&lt;li&gt;defineCustomElement 构建原生 webComponent&lt;/li&gt;
&lt;li&gt;Vue3 全局 API 变更 createApp 替代 new Vue()&lt;/li&gt;
&lt;li&gt;app.config 全局配置项&lt;/li&gt;
&lt;li&gt;全局组件、指令、插件注册方式变化&lt;/li&gt;
&lt;li&gt;Transition、TransitionGroup 动画组件原理&lt;/li&gt;
&lt;li&gt;v-memo 缓存 VNode 优化渲染&lt;/li&gt;
&lt;li&gt;异步 setup 函数配合 Suspense&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十二工程化--构建工具&#34;&gt;十二、工程化 &amp;amp; 构建工具&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Vue CLI 与 Vite 底层构建区别&lt;/li&gt;
&lt;li&gt;Vite 冷启动快的原理，esbuild 预构建&lt;/li&gt;
&lt;li&gt;Vite 热更新 HMR 实现机制&lt;/li&gt;
&lt;li&gt;vite.config.js 常用配置&lt;/li&gt;
&lt;li&gt;webpack 打包 Vue 文件流程 vue-loader&lt;/li&gt;
&lt;li&gt;.vue SFC 单文件组件解析过程&lt;/li&gt;
&lt;li&gt;scoped 样式隔离原理，深度选择器 /deep/ ::v-deep :deep()&lt;/li&gt;
&lt;li&gt;CSS Module 使用方式&lt;/li&gt;
&lt;li&gt;环境变量 .env 文件区分开发测试生产&lt;/li&gt;
&lt;li&gt;跨域代理 proxy 配置&lt;/li&gt;
&lt;li&gt;打包体积优化方案&lt;/li&gt;
&lt;li&gt;分包、懒加载、gzip 压缩配置&lt;/li&gt;
&lt;li&gt;TS 在 Vue 项目中配置声明文件&lt;/li&gt;
&lt;li&gt;第三方 UI 库按需引入配置&lt;/li&gt;
&lt;li&gt;全局自动导入组件、API 插件 unplugin-auto-import&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十三网络请求与封装&#34;&gt;十三、网络请求与封装&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;axios 拦截器请求、响应封装思路&lt;/li&gt;
&lt;li&gt;请求 loading、统一错误处理封装&lt;/li&gt;
&lt;li&gt;token 过期自动刷新逻辑&lt;/li&gt;
&lt;li&gt;请求取消、重复请求拦截方案&lt;/li&gt;
&lt;li&gt;并发请求处理&lt;/li&gt;
&lt;li&gt;接口数据统一格式化处理&lt;/li&gt;
&lt;li&gt;封装请求 hooks 适配 Vue3&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十四性能优化专项&#34;&gt;十四、性能优化专项&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;减少不必要组件渲染手段&lt;/li&gt;
&lt;li&gt;v-once、v-memo 使用场景&lt;/li&gt;
&lt;li&gt;长列表虚拟滚动实现原理&lt;/li&gt;
&lt;li&gt;响应式数据避免不必要监听&lt;/li&gt;
&lt;li&gt;computed 缓存减少重复计算&lt;/li&gt;
&lt;li&gt;图片懒加载方案&lt;/li&gt;
&lt;li&gt;路由懒加载分包优化&lt;/li&gt;
&lt;li&gt;keep-alive 合理缓存减少重复请求&lt;/li&gt;
&lt;li&gt;避免频繁触发 watch&lt;/li&gt;
&lt;li&gt;大列表数据冻结 Object.freeze&lt;/li&gt;
&lt;li&gt;减少 DOM 操作，合理使用虚拟 DOM&lt;/li&gt;
&lt;li&gt;打包体积优化：Tree-Shaking、剔除无用依赖&lt;/li&gt;
&lt;li&gt;Vite/Webpack 构建速度优化&lt;/li&gt;
&lt;li&gt;内存泄漏常见场景：定时器、事件监听、未销毁订阅&lt;/li&gt;
&lt;li&gt;Chrome Performance 面板排查页面卡顿&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十五混合插件拓展开发&#34;&gt;十五、混合、插件、拓展开发&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Vue2 mixin 缺陷，Vue3 用 hooks 替代原因&lt;/li&gt;
&lt;li&gt;Vue 插件开发完整结构 install 方法&lt;/li&gt;
&lt;li&gt;全局自定义指令完整开发&lt;/li&gt;
&lt;li&gt;封装业务通用组件规范&lt;/li&gt;
&lt;li&gt;二次封装 Element Plus / Ant Design Vue&lt;/li&gt;
&lt;li&gt;封装全局弹窗、消息提示组件&lt;/li&gt;
&lt;li&gt;自定义全局权限指令 v-permission&lt;/li&gt;
&lt;li&gt;页面权限、按钮权限实现方案&lt;/li&gt;
&lt;li&gt;全局错误捕获 errorHandler&lt;/li&gt;
&lt;li&gt;埋点、全局请求监控插件封装&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十六项目实战场景问答题&#34;&gt;十六、项目实战场景问答题&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;项目整体架构分层设计&lt;/li&gt;
&lt;li&gt;Vue2 升级 Vue3 迁移改造遇到的问题&lt;/li&gt;
&lt;li&gt;大型项目状态管理选型 Vuex / Pinia 理由&lt;/li&gt;
&lt;li&gt;复杂树形菜单、表格组件封装思路&lt;/li&gt;
&lt;li&gt;表单校验全局统一封装方案&lt;/li&gt;
&lt;li&gt;页面权限控制完整实现流程&lt;/li&gt;
&lt;li&gt;多环境配置、多渠道打包处理&lt;/li&gt;
&lt;li&gt;首屏加载速度优化做了哪些处理&lt;/li&gt;
&lt;li&gt;路由鉴权、未登录拦截逻辑&lt;/li&gt;
&lt;li&gt;列表大量数据渲染卡顿如何解决&lt;/li&gt;
&lt;li&gt;项目打包体积过大优化方案&lt;/li&gt;
&lt;li&gt;页面缓存、返回保留表单状态实现&lt;/li&gt;
&lt;li&gt;接口并发冲突、重复提交拦截&lt;/li&gt;
&lt;li&gt;移动端适配方案 vw/vh、rem&lt;/li&gt;
&lt;li&gt;线上报错监控、异常捕获方案&lt;/li&gt;
&lt;/ol&gt;</description>
    </item>
    <item>
      <title>微信小程序 相关面试题整理</title>
      <link>https://lv-blog.pages.dev/posts/programming/frontend/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E7%9B%B8%E5%85%B3%E9%9D%A2%E8%AF%95%E9%A2%98/</link>
      <pubDate>Wed, 15 Jul 2026 00:46:10 +0800</pubDate>
      <guid>https://lv-blog.pages.dev/posts/programming/frontend/%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E7%9B%B8%E5%85%B3%E9%9D%A2%E8%AF%95%E9%A2%98/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;从互联网整理而来&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;一基础概念与运行机制&#34;&gt;一、基础概念与运行机制&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;小程序与H5、App的核心区别&lt;/li&gt;
&lt;li&gt;小程序双线程模型分别是什么，各自职责&lt;/li&gt;
&lt;li&gt;逻辑层与视图层通信方式&lt;/li&gt;
&lt;li&gt;小程序渲染流程完整过程&lt;/li&gt;
&lt;li&gt;小程序启动流程（冷启动、热启动）&lt;/li&gt;
&lt;li&gt;冷启动和热启动的差异&lt;/li&gt;
&lt;li&gt;小程序分包加载机制概念&lt;/li&gt;
&lt;li&gt;主包与分包限制规则&lt;/li&gt;
&lt;li&gt;独立分包和普通分包区别&lt;/li&gt;
&lt;li&gt;小程序的生命周期分类（应用、页面、组件）&lt;/li&gt;
&lt;li&gt;小程序页面栈规则，最多存放多少页面&lt;/li&gt;
&lt;li&gt;小程序登录流程整体逻辑&lt;/li&gt;
&lt;li&gt;微信授权两种类型区别（基础授权、隐私授权）&lt;/li&gt;
&lt;li&gt;小程序原生宿主环境提供哪些能力&lt;/li&gt;
&lt;li&gt;小程序更新机制，静默更新与主动更新&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;二文件结构与配置&#34;&gt;二、文件结构与配置&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;小程序四种核心文件作用（json/wxml/wxss/js）&lt;/li&gt;
&lt;li&gt;app.json 全局配置常用字段&lt;/li&gt;
&lt;li&gt;page.json 页面配置优先级与app.json关系&lt;/li&gt;
&lt;li&gt;sitemap.json 作用&lt;/li&gt;
&lt;li&gt;project.config.json 用途&lt;/li&gt;
&lt;li&gt;app.js 全局App实例生命周期&lt;/li&gt;
&lt;li&gt;页面js Page构造器生命周期&lt;/li&gt;
&lt;li&gt;组件js Component构造器生命周期&lt;/li&gt;
&lt;li&gt;usingComponents 引入组件配置&lt;/li&gt;
&lt;li&gt;全局样式app.wxss和页面wxss权重规则&lt;/li&gt;
&lt;li&gt;wxss与css差异，特有特性&lt;/li&gt;
&lt;li&gt;rpx单位换算规则，适配原理&lt;/li&gt;
&lt;li&gt;小程序支持的选择器有哪些，不支持哪些&lt;/li&gt;
&lt;li&gt;图片、静态资源本地与线上引入规则&lt;/li&gt;
&lt;li&gt;分包配置subpackages字段参数含义&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;三wxml-模板语法&#34;&gt;三、WXML 模板语法&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;WXML数据绑定语法规则&lt;/li&gt;
&lt;li&gt;插值表达式支持哪些运算&lt;/li&gt;
&lt;li&gt;wx:if、wx:elif、wx:else 条件渲染&lt;/li&gt;
&lt;li&gt;hidden属性与wx:if性能差异&lt;/li&gt;
&lt;li&gt;wx:for列表渲染，wx:key作用&lt;/li&gt;
&lt;li&gt;wx:key使用规范，禁止index的场景&lt;/li&gt;
&lt;li&gt;block标签作用，是否生成真实节点&lt;/li&gt;
&lt;li&gt;模板template定义与引入，数据传递&lt;/li&gt;
&lt;li&gt;wxs脚本作用，运行环境限制&lt;/li&gt;
&lt;li&gt;wxs与js的区别，能否调用小程序API&lt;/li&gt;
&lt;li&gt;事件绑定bind、catch、capture-bind区别&lt;/li&gt;
&lt;li&gt;mut-bind互斥事件作用&lt;/li&gt;
&lt;li&gt;事件传参几种实现方式&lt;/li&gt;
&lt;li&gt;数据双向绑定model语法&lt;/li&gt;
&lt;li&gt;标签属性布尔值绑定规则&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;四组件系统原生自定义组件&#34;&gt;四、组件系统（原生+自定义组件）&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;小程序自定义组件创建完整结构&lt;/li&gt;
&lt;li&gt;Component中properties传参配置规则&lt;/li&gt;
&lt;li&gt;properties三种数据监听方式&lt;/li&gt;
&lt;li&gt;data、properties、observers执行顺序&lt;/li&gt;
&lt;li&gt;observers监听对象、数组深层变化写法&lt;/li&gt;
&lt;li&gt;组件生命周期完整钩子&lt;/li&gt;
&lt;li&gt;lifetimes与pageLifetimes区别&lt;/li&gt;
&lt;li&gt;组件插槽slot，具名插槽使用&lt;/li&gt;
&lt;li&gt;组件父子通信方式&lt;/li&gt;
&lt;li&gt;triggerEvent触发自定义事件传参&lt;/li&gt;
&lt;li&gt;selectComponent、selectAllComponents获取子组件&lt;/li&gt;
&lt;li&gt;behaviors复用逻辑，合并规则&lt;/li&gt;
&lt;li&gt;原生内置常用容器、表单、媒体组件&lt;/li&gt;
&lt;li&gt;scroll-view滚动注意事项&lt;/li&gt;
&lt;li&gt;movable-area、movable-view实现拖拽原理&lt;/li&gt;
&lt;li&gt;canvas新旧版本差异，2d画布使用&lt;/li&gt;
&lt;li&gt;web-view嵌入H5通信方案&lt;/li&gt;
&lt;li&gt;cover-view、cover-image使用限制场景&lt;/li&gt;
&lt;li&gt;自定义组件样式隔离options配置&lt;/li&gt;
&lt;li&gt;组件pureDataPattern作用&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;五数据管理与渲染更新&#34;&gt;五、数据管理与渲染更新&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;setData底层更新原理&lt;/li&gt;
&lt;li&gt;setData频繁调用性能问题&lt;/li&gt;
&lt;li&gt;setData单次数据大小限制&lt;/li&gt;
&lt;li&gt;局部更新数据简写写法&lt;/li&gt;
&lt;li&gt;直接修改this.data不调用setData为什么不更新视图&lt;/li&gt;
&lt;li&gt;复杂对象、数组更新setData写法&lt;/li&gt;
&lt;li&gt;全局数据共享几种方案&lt;/li&gt;
&lt;li&gt;getApp()全局变量优缺点&lt;/li&gt;
&lt;li&gt;globalData跨页面同步更新缺陷&lt;/li&gt;
&lt;li&gt;数据本地持久化storage存储限制&lt;/li&gt;
&lt;li&gt;wx.setStorage同步异步API区别&lt;/li&gt;
&lt;li&gt;storage大数据存储优化方案&lt;/li&gt;
&lt;li&gt;页面间数据传递方式对比&lt;/li&gt;
&lt;li&gt;页面栈取上一页实例方法&lt;/li&gt;
&lt;li&gt;大数据列表渲染卡顿优化思路&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;六路由与页面跳转&#34;&gt;六、路由与页面跳转&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;五种路由API区别（navigateTo/redirectTo/reLaunch/switchTab/navigateBack）&lt;/li&gt;
&lt;li&gt;switchTab跳转限制条件&lt;/li&gt;
&lt;li&gt;navigateTo无法跳tab页面解决方案&lt;/li&gt;
&lt;li&gt;路由传参两种方式，长参数丢失问题&lt;/li&gt;
&lt;li&gt;页面返回监听onUnload、onShow触发时机&lt;/li&gt;
&lt;li&gt;获取当前页面栈方法getCurrentPages()&lt;/li&gt;
&lt;li&gt;路由拦截统一封装思路&lt;/li&gt;
&lt;li&gt;tabBar配置规则，自定义tabBar实现&lt;/li&gt;
&lt;li&gt;自定义tabBar踩坑点&lt;/li&gt;
&lt;li&gt;页面跳转后保留表单状态方案&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;七网络请求与后端交互&#34;&gt;七、网络请求与后端交互&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;wx.request请求基础配置&lt;/li&gt;
&lt;li&gt;request合法域名校验规则，开发环境规避&lt;/li&gt;
&lt;li&gt;小程序请求携带cookie机制&lt;/li&gt;
&lt;li&gt;请求header统一封装token思路&lt;/li&gt;
&lt;li&gt;拦截器封装wx.request方案&lt;/li&gt;
&lt;li&gt;并发请求、请求超时处理&lt;/li&gt;
&lt;li&gt;文件上传wx.uploadFile参数配置&lt;/li&gt;
&lt;li&gt;文件下载wx.downloadFile使用场景&lt;/li&gt;
&lt;li&gt;websocket实时通信完整流程&lt;/li&gt;
&lt;li&gt;socket断线重连实现逻辑&lt;/li&gt;
&lt;li&gt;接口返回加密数据解密处理&lt;/li&gt;
&lt;li&gt;批量请求统一捕获异常&lt;/li&gt;
&lt;li&gt;小程序不支持跨域的根本原因&lt;/li&gt;
&lt;li&gt;上传图片压缩、裁剪处理&lt;/li&gt;
&lt;li&gt;上传进度监听API&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;八登录授权用户信息&#34;&gt;八、登录、授权、用户信息&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;wx.login获取code作用&lt;/li&gt;
&lt;li&gt;code换取openid完整流程&lt;/li&gt;
&lt;li&gt;openid、unionid区别与生成规则&lt;/li&gt;
&lt;li&gt;隐私保护新规下获取用户头像昵称方案&lt;/li&gt;
&lt;li&gt;getUserInfo接口废弃替代方案&lt;/li&gt;
&lt;li&gt;手机号一键登录流程&lt;/li&gt;
&lt;li&gt;授权scope各权限含义&lt;/li&gt;
&lt;li&gt;用户拒绝授权后重新引导授权逻辑&lt;/li&gt;
&lt;li&gt;登录态session_key过期处理&lt;/li&gt;
&lt;li&gt;第三方登录、关联账号实现&lt;/li&gt;
&lt;li&gt;登录状态持久化存储方案&lt;/li&gt;
&lt;li&gt;多端打通unionid获取条件&lt;/li&gt;
&lt;li&gt;隐私协议弹窗实现规范&lt;/li&gt;
&lt;li&gt;小程序订阅消息下发流程&lt;/li&gt;
&lt;li&gt;模板消息与订阅消息区别&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;九媒体图片地图设备api&#34;&gt;九、媒体、图片、地图、设备API&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;wx.chooseMedia选择图片视频参数&lt;/li&gt;
&lt;li&gt;图片预览wx.previewImage使用&lt;/li&gt;
&lt;li&gt;图片本地缓存方案&lt;/li&gt;
&lt;li&gt;录音、播放音频API使用&lt;/li&gt;
&lt;li&gt;video视频播放常见问题&lt;/li&gt;
&lt;li&gt;map地图组件标记、覆盖物绘制&lt;/li&gt;
&lt;li&gt;获取当前定位wx.getLocation权限配置&lt;/li&gt;
&lt;li&gt;后台持续定位配置要求&lt;/li&gt;
&lt;li&gt;设备信息、系统API获取&lt;/li&gt;
&lt;li&gt;振动、剪贴板、屏幕亮度API&lt;/li&gt;
&lt;li&gt;扫码wx.scanCode场景&lt;/li&gt;
&lt;li&gt;蓝牙BLE设备连接流程&lt;/li&gt;
&lt;li&gt;NFC基础使用场景&lt;/li&gt;
&lt;li&gt;相机camera组件适配&lt;/li&gt;
&lt;li&gt;文件管理FileSystemManager读写文件&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十性能优化专项&#34;&gt;十、性能优化专项&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;setData性能优化手段&lt;/li&gt;
&lt;li&gt;长列表渲染优化方案&lt;/li&gt;
&lt;li&gt;虚拟列表实现思路&lt;/li&gt;
&lt;li&gt;分包加载优化首屏速度&lt;/li&gt;
&lt;li&gt;图片懒加载处理&lt;/li&gt;
&lt;li&gt;减少页面、组件层级嵌套&lt;/li&gt;
&lt;li&gt;wxss样式体积压缩优化&lt;/li&gt;
&lt;li&gt;分包预加载preloadRule配置&lt;/li&gt;
&lt;li&gt;避免频繁创建定时器、监听事件&lt;/li&gt;
&lt;li&gt;页面卸载清除所有订阅、定时器&lt;/li&gt;
&lt;li&gt;包体积超限优化方案&lt;/li&gt;
&lt;li&gt;开发者工具性能面板排查卡顿&lt;/li&gt;
&lt;li&gt;避免在onShow频繁请求接口&lt;/li&gt;
&lt;li&gt;图片资源压缩、webp适配&lt;/li&gt;
&lt;li&gt;减少observers深层监听开销&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十一适配兼容多端&#34;&gt;十一、适配、兼容、多端&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;rpx、px、rem转换关系&lt;/li&gt;
&lt;li&gt;刘海屏、安全区适配css写法&lt;/li&gt;
&lt;li&gt;深色模式适配配置&lt;/li&gt;
&lt;li&gt;不同微信版本API兼容处理&lt;/li&gt;
&lt;li&gt;caniuse判断接口是否可用&lt;/li&gt;
&lt;li&gt;小程序转H5、转uni-app差异&lt;/li&gt;
&lt;li&gt;平板、PC端小程序适配要点&lt;/li&gt;
&lt;li&gt;低版本微信兼容降级方案&lt;/li&gt;
&lt;li&gt;字体、图片多设备适配&lt;/li&gt;
&lt;li&gt;自定义导航栏适配胶囊按钮&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十二工程化第三方框架&#34;&gt;十二、工程化、第三方框架&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;原生小程序、uni-app、Taro区别&lt;/li&gt;
&lt;li&gt;Taro编译原理，多端适配逻辑&lt;/li&gt;
&lt;li&gt;uni-app分包、条件编译写法&lt;/li&gt;
&lt;li&gt;小程序npm依赖使用规则&lt;/li&gt;
&lt;li&gt;按需引入UI组件库优化&lt;/li&gt;
&lt;li&gt;工程化打包、环境变量区分&lt;/li&gt;
&lt;li&gt;多环境请求域名配置&lt;/li&gt;
&lt;li&gt;ESLint校验小程序代码规范&lt;/li&gt;
&lt;li&gt;Git协同开发规范&lt;/li&gt;
&lt;li&gt;CI自动上传小程序工具&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十三支付分享广告业务能力&#34;&gt;十三、支付、分享、广告、业务能力&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;小程序支付完整流程&lt;/li&gt;
&lt;li&gt;支付回调后端处理逻辑&lt;/li&gt;
&lt;li&gt;分享onShareAppMessage、onShareTimeline配置&lt;/li&gt;
&lt;li&gt;分享图、分享路径动态处理&lt;/li&gt;
&lt;li&gt;分享到朋友圈限制条件&lt;/li&gt;
&lt;li&gt;插屏广告、激励视频广告接入&lt;/li&gt;
&lt;li&gt;小程序跳转其他小程序API&lt;/li&gt;
&lt;li&gt;跳转限制与关联配置要求&lt;/li&gt;
&lt;li&gt;客服消息接入流程&lt;/li&gt;
&lt;li&gt;商品卡片、搜索收录配置sitemap&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十四安全审核合规&#34;&gt;十四、安全、审核、合规&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;小程序合法域名、业务域名、web-view域名区别&lt;/li&gt;
&lt;li&gt;前端存储敏感信息安全风险&lt;/li&gt;
&lt;li&gt;session_key不能传输到前端原因&lt;/li&gt;
&lt;li&gt;接口数据防篡改简单方案&lt;/li&gt;
&lt;li&gt;隐私合规要求有哪些&lt;/li&gt;
&lt;li&gt;图片、内容审核API调用&lt;/li&gt;
&lt;li&gt;小程序常见审核驳回原因&lt;/li&gt;
&lt;li&gt;诱导分享、诱导支付违规点&lt;/li&gt;
&lt;li&gt;本地存储数据加密思路&lt;/li&gt;
&lt;li&gt;防止恶意刷接口方案&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;十五实战场景综合题&#34;&gt;十五、实战场景综合题&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;项目整体目录架构设计&lt;/li&gt;
&lt;li&gt;封装通用请求库完整思路&lt;/li&gt;
&lt;li&gt;全局登录拦截、未登录跳转实现&lt;/li&gt;
&lt;li&gt;大型表单组件封装与校验&lt;/li&gt;
&lt;li&gt;多页面共享登录状态管理&lt;/li&gt;
&lt;li&gt;列表上拉加载、下拉刷新封装&lt;/li&gt;
&lt;li&gt;图片上传、预览、删除完整流程&lt;/li&gt;
&lt;li&gt;分包改造解决主包体积超限&lt;/li&gt;
&lt;li&gt;页面返回保留搜索条件、分页数据&lt;/li&gt;
&lt;li&gt;小程序热更新主动检测逻辑&lt;/li&gt;
&lt;li&gt;websocket聊天断线重连方案&lt;/li&gt;
&lt;li&gt;自定义tabBar遇到的坑与解决&lt;/li&gt;
&lt;li&gt;页面大量数据滑动卡顿优化&lt;/li&gt;
&lt;li&gt;线上白屏、加载失败排查思路&lt;/li&gt;
&lt;li&gt;原生小程序迁移Taro/uni改造方案&lt;/li&gt;
&lt;/ol&gt;</description>
    </item>
    <item>
      <title>消息中间件 面试题整理</title>
      <link>https://lv-blog.pages.dev/posts/programming/for-interview/mq-interview-questions/</link>
      <pubDate>Sun, 23 Mar 2025 13:21:54 +0800</pubDate>
      <guid>https://lv-blog.pages.dev/posts/programming/for-interview/mq-interview-questions/</guid>
      <description>&lt;h1 id=&#34;消息队列通识&#34;&gt;消息队列通识&lt;/h1&gt;
&lt;h2 id=&#34;为什么需要消息队列&#34;&gt;为什么需要消息队列&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;解耦&lt;/li&gt;
&lt;li&gt;削峰填谷&lt;/li&gt;
&lt;li&gt;异步调用&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;消息队列如何保持幂等&#34;&gt;消息队列如何保持幂等&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;重复源泉
&lt;ul&gt;
&lt;li&gt;生产端重发
&lt;ul&gt;
&lt;li&gt;发送ACK没有回复继续发送&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;消费端重复&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;解决方案
&lt;ul&gt;
&lt;li&gt;唯一消息ID，生产者发送时携带messageId&lt;/li&gt;
&lt;li&gt;幂等表&lt;/li&gt;
&lt;li&gt;状态机校验&lt;/li&gt;
&lt;li&gt;乐观锁 / 版本号&lt;/li&gt;
&lt;li&gt;分布式锁&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;核心原则
&lt;ul&gt;
&lt;li&gt;消费逻辑天然幂等&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;为什么需要消息队列-1&#34;&gt;为什么需要消息队列&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;解耦&lt;/li&gt;
&lt;li&gt;异步&lt;/li&gt;
&lt;li&gt;削峰&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;消息队列的模型有哪些&#34;&gt;消息队列的模型有哪些&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;点对点模型&lt;/li&gt;
&lt;li&gt;发布订阅模型&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;如何保证消息不丢失&#34;&gt;如何保证消息不丢失&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;生产端
&lt;ul&gt;
&lt;li&gt;ack&lt;/li&gt;
&lt;li&gt;broker 持久化
&lt;ul&gt;
&lt;li&gt;生产环境副本因子 &amp;gt;= 3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;消费端
&lt;ul&gt;
&lt;li&gt;手动提交 offset&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;如何保证消息有序&#34;&gt;如何保证消息有序&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;让需要保持有序的消息落到同一个分区&lt;/li&gt;
&lt;li&gt;给唯一的key，且key以后不会重复&lt;/li&gt;
&lt;li&gt;Kafka保证唯一分区内有序，跨分区无序&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;rabbitmq&#34;&gt;RabbitMQ&lt;/h1&gt;
&lt;h2 id=&#34;rabbitmq-如何保证消息不丢失&#34;&gt;RabbitMQ 如何保证消息不丢失&lt;/h2&gt;
&lt;!-- TODO 复习 --&gt;
&lt;ul&gt;
&lt;li&gt;哪些情况会丢失
&lt;ul&gt;
&lt;li&gt;publisher -&amp;gt; exchange
&lt;ul&gt;
&lt;li&gt;生产者确认机制
&lt;ul&gt;
&lt;li&gt;ack publish-confirm&lt;/li&gt;
&lt;li&gt;nack publish-confirm&lt;/li&gt;
&lt;li&gt;ack publish-return&lt;/li&gt;
&lt;li&gt;消息失败之后如何处理
&lt;ul&gt;
&lt;li&gt;回调方法&lt;/li&gt;
&lt;li&gt;记录日志&lt;/li&gt;
&lt;li&gt;保存到数据库中然后定时重发&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;exchange -&amp;gt; queue
&lt;ul&gt;
&lt;li&gt;消息持久化
&lt;ul&gt;
&lt;li&gt;交换机持久化&lt;/li&gt;
&lt;li&gt;队列持久化&lt;/li&gt;
&lt;li&gt;消息持久化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;queue&lt;/li&gt;
&lt;li&gt;queue -&amp;gt; consumer
&lt;ul&gt;
&lt;li&gt;消费者确认机制&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;rabbitmq-消息的重复消费问题是如何解决的&#34;&gt;RabbitMQ 消息的重复消费问题是如何解决的&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;重复消费的原因&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spring Cloud 面试题整理</title>
      <link>https://lv-blog.pages.dev/posts/programming/for-interview/spring-cloud-interview-questions/</link>
      <pubDate>Sun, 23 Feb 2025 13:20:18 +0800</pubDate>
      <guid>https://lv-blog.pages.dev/posts/programming/for-interview/spring-cloud-interview-questions/</guid>
      <description>&lt;h1 id=&#34;springcloud-问题&#34;&gt;SpringCloud 问题&lt;/h1&gt;
&lt;h2 id=&#34;springcloud-五大组件&#34;&gt;springcloud 五大组件&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Eureka / nacos&lt;/li&gt;
&lt;li&gt;Ribbon&lt;/li&gt;
&lt;li&gt;Feign / dubbo&lt;/li&gt;
&lt;li&gt;Hystrix / sentinel&lt;/li&gt;
&lt;li&gt;Zuul/Gateway&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;服务注册和发现是什么意思springcloud-如何实现服务注册和发现&#34;&gt;服务注册和发现是什么意思，SpringCloud 如何实现服务注册和发现？&lt;/h2&gt;
&lt;h2 id=&#34;nacos-和-eureka-的区别&#34;&gt;nacos 和 eureka 的区别？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;相同点
&lt;ul&gt;
&lt;li&gt;服务提供者 注册 服务信息 到 注册中心&lt;/li&gt;
&lt;li&gt;服务消费者 定时从 注册中心 拉取&lt;/li&gt;
&lt;li&gt;服务消费者 对 服务提供者 进行远程调用&lt;/li&gt;
&lt;li&gt;服务提供者 临时实例 采用心跳检查
&lt;ul&gt;
&lt;li&gt;什么是临时实例？
&lt;ul&gt;
&lt;li&gt;默认实例都是临时实例&lt;/li&gt;
&lt;li&gt;临时实例心跳模式&lt;/li&gt;
&lt;li&gt;非临时主动探测&lt;/li&gt;
&lt;li&gt;临时实例没有心跳会被剔除&lt;/li&gt;
&lt;li&gt;非临时不会被剔除&lt;/li&gt;
&lt;li&gt;ephemeral: false 变成非临时实例
&lt;ul&gt;
&lt;li&gt;非临时实例，nacos会主动询问服务提供者是否存活&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;不同点
&lt;ul&gt;
&lt;li&gt;非临时实例&lt;/li&gt;
&lt;li&gt;nacos集群AP，如果存在非临时实例，采用CP&lt;/li&gt;
&lt;li&gt;eureka采用AP&lt;/li&gt;
&lt;li&gt;nacos还有配置中心&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;你们项目中负载均衡是如何实现的&#34;&gt;你们项目中负载均衡是如何实现的？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ribbon&lt;/li&gt;
&lt;li&gt;Ribbon 负载均衡流程
&lt;ol&gt;
&lt;li&gt;微服务发起请求&lt;/li&gt;
&lt;li&gt;Ribbon 从注册中心拉取&lt;/li&gt;
&lt;li&gt;根据策略进行转发&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;ribbon-负载均衡策略有哪些&#34;&gt;Ribbon 负载均衡策略有哪些？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RoundRobinRule&lt;/strong&gt; 简单轮询&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WeightedResponseTimeRule&lt;/strong&gt; 按照权重来选择服务器，响应时间越长，权重越小&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;RandomRule&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;BestAvailableRule 忽略短路的服务器，选择并发数较低的服务器&lt;/li&gt;
&lt;li&gt;RetryRule 重试机制的选择逻辑（基于轮询）&lt;/li&gt;
&lt;li&gt;AvailabilityFilteringRule 可用性敏感策略。先过滤非健康的，再选择连接数比较小的&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ZoneAvoidanceRule&lt;/strong&gt; 以区域可用的服务器为基础对服务器选择。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;如果想自定义负载均衡策略如何实现&#34;&gt;如果想自定义负载均衡策略，如何实现？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;自己创建类实现 IRule 接口， 再通过配置类或配置文件配置&lt;/li&gt;
&lt;li&gt;@Bean IRule 全局生效&lt;/li&gt;
&lt;li&gt;NFLoadBalancerRuleClassName 局部生效&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;什么是服务雪崩如何解决这个问题&#34;&gt;什么是服务雪崩？如何解决这个问题？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;服务雪崩
&lt;ul&gt;
&lt;li&gt;一个服务失败，导致整条链路都失败的情形&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;解决方案
&lt;ul&gt;
&lt;li&gt;降级（接口）
&lt;ul&gt;
&lt;li&gt;Feign 接口走fallback&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;熔断（整个服务）
&lt;ul&gt;
&lt;li&gt;Hystix
&lt;ul&gt;
&lt;li&gt;@EnableCircuitBreaker&lt;/li&gt;
&lt;li&gt;断路器关闭 - 打开 - 半开&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;你们的微服务是怎么监控的&#34;&gt;你们的微服务是怎么监控的？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;skywalking
&lt;ul&gt;
&lt;li&gt;apache顶级项目&lt;/li&gt;
&lt;li&gt;问题定位&lt;/li&gt;
&lt;li&gt;性能分析&lt;/li&gt;
&lt;li&gt;服务关系&lt;/li&gt;
&lt;li&gt;服务告警&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&#34;业务相关&#34;&gt;业务相关&lt;/h1&gt;
&lt;h2 id=&#34;项目中有没有做过限流怎么做的&#34;&gt;项目中有没有做过限流？怎么做的？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;限流情况&lt;/p&gt;</description>
    </item>
    <item>
      <title>Java 面试题整理</title>
      <link>https://lv-blog.pages.dev/posts/programming/for-interview/java-interview-questions/</link>
      <pubDate>Thu, 23 Jan 2025 08:50:54 +0800</pubDate>
      <guid>https://lv-blog.pages.dev/posts/programming/for-interview/java-interview-questions/</guid>
      <description>&lt;h1 id=&#34;集合&#34;&gt;集合&lt;/h1&gt;
&lt;h2 id=&#34;为什么数组索引要从-0-开始从-1-开始不行吗&#34;&gt;为什么数组索引要从 0 开始？从 1 开始不行吗？&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;回答大纲&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数组在内存中是连续存储的，CPU 通过寻址公式访问元素&lt;/li&gt;
&lt;li&gt;从 0 开始：&lt;code&gt;a[i]_address = base_address + i * typeSize&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;从 1 开始：&lt;code&gt;base_address + (i-1) * typeSize&lt;/code&gt;，多一次减法&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;正式回答&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;数组在内存中是连续存储的，CPU 通过寻址公式来访问指定下标的元素：&lt;code&gt;a[i] 的地址 = 数组首地址 + i * 元素大小&lt;/code&gt;。当数组下标从 0 开始时，直接套用上述公式即可计算偏移量；如果下标从 1 开始，则需要先执行 &lt;code&gt;i - 1&lt;/code&gt; 再做乘法，多了一次减法运算。虽然单次访问的差异可以忽略不计，但数组通常会出现在循环、遍历等高频访问的场景中，这笔额外开销会被无限放大。这也是 C 语言沿用下来的历史约定，Java 作为一门追求高效的系统级语言，继承了这一设计。&lt;/p&gt;
&lt;h2 id=&#34;时间复杂度如何计算的&#34;&gt;时间复杂度如何计算的？&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;回答大纲&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;口诀：常 对 幂 指 阶&lt;/li&gt;
&lt;li&gt;常见复杂度
&lt;ul&gt;
&lt;li&gt;常数复杂度 O(1)：不随 n 变化&lt;/li&gt;
&lt;li&gt;对数复杂度 O(logN)：二分查找、树操作&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;正式回答&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;时间复杂度用于衡量算法执行时间随数据规模 n 增长的变化趋势，是大 O 表示法下对最坏情况的抽象描述。常见的大小关系可用口诀&amp;quot;常对幂指阶&amp;quot;来记忆，即 O(1) &amp;lt; O(logN) &amp;lt; O(N) &amp;lt; O(N*logN) &amp;lt; O(N²) &amp;lt; O(2ⁿ) &amp;lt; O(n!)，越靠后算法越慢。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Spring 面试题整理</title>
      <link>https://lv-blog.pages.dev/posts/programming/for-interview/spring-interview-questions/</link>
      <pubDate>Sat, 19 Oct 2024 23:19:24 +0800</pubDate>
      <guid>https://lv-blog.pages.dev/posts/programming/for-interview/spring-interview-questions/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;面试题从互联网各个角落收集而来&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;谈一谈-spring-ioc-的底层实现&#34;&gt;谈一谈 Spring IOC 的底层实现？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;反射&lt;/li&gt;
&lt;li&gt;工厂的价值&lt;/li&gt;
&lt;li&gt;设计模式&lt;/li&gt;
&lt;li&gt;关键的几个方法
&lt;ul&gt;
&lt;li&gt;createBeanFactory&lt;/li&gt;
&lt;li&gt;getBean&lt;/li&gt;
&lt;li&gt;doGetBean&lt;/li&gt;
&lt;li&gt;createBean&lt;/li&gt;
&lt;li&gt;doCreateBean&lt;/li&gt;
&lt;li&gt;createBeanInstance(getDeclaredConstructor, newInstance)「方案选单」&lt;/li&gt;
&lt;li&gt;populateBean&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&#34;mermaid&#34;&gt;flowchart TD
    A[开始] --&gt; B[&#34;createBeanFactory()&lt;br/&gt;创建 DefaultListableBeanFactory&#34;]
    B --&gt; C[加载 BeanDefinition&lt;br/&gt;解析 XML/注解]
    C --&gt; D[&#34;getBean(beanName)&lt;br/&gt;外部调用入口&#34;]

    D --&gt; E[&#34;doGetBean(beanName)&#34;]
    E --&gt; F{从缓存获取单例?}
    F --&gt;|是| G[返回缓存的 Bean]
    F --&gt;|否| H[&#34;createBean(beanName, mbd)&#34;]

    H --&gt; I[&#34;doCreateBean(beanName, mbd)&#34;]
    I --&gt; J[&#34;createBeanInstance()&lt;br/&gt;getDeclaredConstructor + newInstance&#34;]
    J --&gt; K[&#34;populateBean()&lt;br/&gt;属性填充/依赖注入&#34;]
    K --&gt; L[&#34;initializeBean()&lt;br/&gt;初始化回调&#34;]
    L --&gt; M[注册销毁方法]
    M --&gt; N[返回完整 Bean 实例]
&lt;/pre&gt;
&lt;h2 id=&#34;谈谈-springioc-的理解原理和实现&#34;&gt;谈谈 SpringIOC 的理解，原理和实现？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;IOC 思想&lt;/li&gt;
&lt;li&gt;DI 实现手段&lt;/li&gt;
&lt;li&gt;什么是容器 什么是Bean&lt;/li&gt;
&lt;li&gt;BeanDefination
&lt;ul&gt;
&lt;li&gt;从哪里读
&lt;ul&gt;
&lt;li&gt;XML&lt;/li&gt;
&lt;li&gt;注解&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;存哪里
&lt;ul&gt;
&lt;li&gt;所有 BeanDefinition 都存在 DefaultListableBeanFactory 里的一个 Map 中&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;容器的生命周期&#34;&gt;容器的生命周期&lt;/h2&gt;
&lt;pre class=&#34;mermaid&#34;&gt;flowchart TD
    START([🚀 程序启动]) --&gt; REFRESH[&#34;AbstractApplicationContext.refresh()&#34;]

    REFRESH --&gt; PHASE1

    subgraph PHASE1[&#34;🔵 第一阶段：准备工作&#34;]
        direction TB
        A1[&#34;prepareRefresh()\n记录启动时间\n设置容器状态为「活跃」\n初始化环境变量&#34;] --&gt; A2
        A2[&#34;obtainFreshBeanFactory()\n创建 DefaultListableBeanFactory\n这是容器的核心仓库&#34;] --&gt; A3
        A3[&#34;prepareBeanFactory()\n注册基础 BeanPostProcessor\n注册 Aware 相关处理器\n注册默认环境 Bean（environment）&#34;]
    end

    PHASE1 --&gt; PHASE2

    subgraph PHASE2[&#34;🟢 第二阶段：加载 BeanDefinition（读图纸）&#34;]
        direction TB
        B1[&#34;扫描 @ComponentScan 指定的包\n或读取 XML 配置文件&#34;] --&gt; B2
        B2[&#34;解析注解 / XML\n识别 @Component @Service\n@Repository @Controller @Bean&#34;] --&gt; B3
        B3[&#34;为每个 Bean 生成 BeanDefinition\n记录：类名、作用域、是否懒加载\n初始化方法、销毁方法、依赖关系&#34;] --&gt; B4
        B4[(&#34;存入 beanDefinitionMap\nkey = beanName\nvalue = BeanDefinition&#34;)]
    end

    PHASE2 --&gt; PHASE3

    subgraph PHASE3[&#34;🟡 第三阶段：修改 BeanDefinition（修图纸）&#34;]
        direction TB
        C1[&#34;invokeBeanFactoryPostProcessors()\n执行所有 BeanFactoryPostProcessor&#34;] --&gt; C2
        C2[&#34;ConfigurationClassPostProcessor\n处理 @Configuration @Import\n@PropertySource @ComponentScan\n👉 SpringBoot 自动装配在此触发&#34;] --&gt; C3
        C3[&#34;PropertySourcesPlaceholderConfigurer\n替换 BeanDefinition 中\n所有 ${xxx} 占位符为真实值&#34;] --&gt; C4
        C4[/&#34;所有 BeanDefinition 最终确定\n图纸不再变动&#34;/]
    end

    PHASE3 --&gt; PHASE4

    subgraph PHASE4[&#34;🌸 第四阶段：注册 BeanPostProcessor（工人就位）&#34;]
        direction TB
        D1[&#34;registerBeanPostProcessors()\n按优先级顺序注册\nPriorityOrdered → Ordered → 普通&#34;] --&gt; D2
        D2[&#34;AutowiredAnnotationBeanPostProcessor\n负责处理 @Autowired @Value&#34;] --&gt; D3
        D3[&#34;CommonAnnotationBeanPostProcessor\n负责处理 @PostConstruct @PreDestroy @Resource&#34;] --&gt; D4
        D4[&#34;AnnotationAwareAspectJAutoProxyCreator\n负责检测切面、生成 AOP 代理对象&#34;] --&gt; D5
        D5[/&#34;所有工人就位\n等待 Bean 创建时介入\n此时不开工&#34;/]
    end

    PHASE4 --&gt; PHASE5

    subgraph PHASE5[&#34;🟣 第五阶段：容器基础设施初始化&#34;]
        direction TB
        E1[&#34;initMessageSource()\n初始化国际化资源 i18n&#34;] --&gt; E2
        E2[&#34;initApplicationEventMulticaster()\n初始化事件广播器&#34;] --&gt; E3
        E3[&#34;onRefresh()\n⭐ SpringBoot 在此启动\nTomcat / Jetty / Undertow\nWeb 容器开始监听端口&#34;] --&gt; E4
        E4[&#34;registerListeners()\n注册所有 ApplicationListener\n监听容器事件&#34;]
    end

    PHASE5 --&gt; PHASE6

    subgraph PHASE6[&#34;🟠 第六阶段：实例化所有单例 Bean&#34;]
        direction TB
        F1[&#34;finishBeanFactoryInitialization()\npreInstantiateSingletons()\n遍历所有非懒加载单例 BeanDefinition&#34;] --&gt; F2
        F2[&#34;逐个执行 getBean()\n触发每个 Bean 的生命周期\n实例化 → 属性填充 → Aware回调\n→ 前置处理 → init方法 → 后置处理&#34;] --&gt; F3
        F3[(&#34;所有单例 Bean 存入\nsingletonObjects 一级缓存\n✅ 全部就绪&#34;)]
    end

    PHASE6 --&gt; PHASE7

    subgraph PHASE7[&#34;✅ 第七阶段：容器就绪&#34;]
        direction TB
        G1[&#34;finishRefresh()\n清理启动时占用的资源\n初始化生命周期处理器&#34;] --&gt; G2
        G2[&#34;发布 ContextRefreshedEvent\n通知所有监听者：容器启动完成&#34;] --&gt; G3
        G3[/&#34;容器进入运行状态\n可以处理业务请求&#34;/]
    end

    G3 --&gt; RUNNING([🎉 容器正常运行中])

    RUNNING -.-&gt;|&#34;收到关闭信号\nCtrl+C / kill / close()&#34;| PHASE8

    subgraph PHASE8[&#34;🔴 第八阶段：容器销毁&#34;]
        direction TB
        H1[&#34;发布 ContextClosedEvent\n通知所有监听者：容器即将关闭&#34;] --&gt; H2
        H2[&#34;停止 Web 容器\nTomcat 停止接受新请求&#34;] --&gt; H3
        H3[&#34;执行所有 Bean 的销毁逻辑\n@PreDestroy → destroy() → destroy-method\n按注册顺序逆序销毁&#34;] --&gt; H4
        H4[&#34;清空所有缓存\nsingletonObjects 清空\nbeanDefinitionMap 清空&#34;] --&gt; H5
        H5[&#34;容器状态设置为「关闭」\nactive = false / closed = true&#34;]
    end

    H5 --&gt; END([💀 容器销毁完成])

    style START fill:#43A047,color:#fff
    style RUNNING fill:#43A047,color:#fff
    style END fill:#e53935,color:#fff
    style REFRESH fill:#1E88E5,color:#fff
&lt;/pre&gt;
&lt;h2 id=&#34;bean-的生命周期&#34;&gt;bean 的生命周期&lt;/h2&gt;
&lt;pre class=&#34;mermaid&#34;&gt;flowchart TD
    START([🌱 开始创建 Bean]) --&gt; A

    A[&#34;① 实例化\nInstantiation\n反射调用构造方法\nnew 出空壳对象\n此时所有字段都是 null&#34;] --&gt; B

    B[&#34;② 放入三级缓存\nsingletonFactories\n提前暴露半成品\n为循环依赖做准备&#34;] --&gt; C

    C[&#34;③ 属性填充\npopulateBean()\n处理 @Autowired @Value\n把依赖的 Bean 注入进来&#34;] --&gt; D

    subgraph AWARE[&#34;④ Aware 回调&#34;]
        direction TB
        D[&#34;BeanNameAware\n告诉 Bean 自己叫什么名字&#34;] --&gt; E
        E[&#34;BeanFactoryAware\n把 BeanFactory 塞给 Bean&#34;] --&gt; F
        F[&#34;ApplicationContextAware\n把 ApplicationContext 塞给 Bean&#34;]
    end

    subgraph INIT[&#34;⑤ 初始化 initializeBean()&#34;]
        direction TB
        G[&#34;前置处理\npostProcessBeforeInitialization()\n所有 BeanPostProcessor 挨个执行\n📌 @PostConstruct 在这里被调用&#34;] --&gt; INITMETHOD

        subgraph INITMETHOD[&#34;init 方法（按顺序执行）&#34;]
            direction TB
            H1[&#34;第1个：@PostConstruct\n（已在前置处理中执行）&#34;] --&gt; H2
            H2[&#34;第2个：afterPropertiesSet()\n实现 InitializingBean 接口&#34;] --&gt; H3
            H3[&#34;第3个：init-method\n@Bean(initMethod=&#39;xxx&#39;) 或 XML 配置&#34;]
        end

        INITMETHOD --&gt; I

        I[&#34;后置处理\npostProcessAfterInitialization()\n所有 BeanPostProcessor 挨个执行\n⭐ AOP 代理在这里生成&#34;]
    end

    AWARE --&gt; INIT

    I --&gt; J

    subgraph CACHE[&#34;⑥ 存入缓存&#34;]
        direction TB
        J[&#34;从三级缓存 singletonFactories 移除\n从二级缓存 earlySingletonObjects 移除&#34;] --&gt; K
        K[&#34;存入一级缓存 singletonObjects\n✅ 完整 Bean 就绪&#34;]
    end

    K --&gt; READY([🎉 Bean 可以正常使用了])

    READY -.-&gt;|&#34;容器关闭&#34;| DESTROY

    subgraph DESTROY[&#34;⑦ 销毁阶段（容器关闭时）&#34;]
        direction TB
        D1[&#34;第1个：@PreDestroy\n方法被调用&#34;] --&gt; D2
        D2[&#34;第2个：destroy()\n实现 DisposableBean 接口&#34;] --&gt; D3
        D3[&#34;第3个：destroy-method\n@Bean(destroyMethod=&#39;xxx&#39;) 或 XML 配置&#34;]
    end

    D3 --&gt; END([💀 Bean 销毁完成])
&lt;/pre&gt;
&lt;h2 id=&#34;spring-三级缓存依赖流程&#34;&gt;spring 三级缓存依赖流程&lt;/h2&gt;
&lt;pre class=&#34;mermaid&#34;&gt;sequenceDiagram
    participant Spring as Spring容器
    participant L3 as 三级缓存&lt;br/&gt;singletonFactories
    participant L2 as 二级缓存&lt;br/&gt;earlySingletonObjects
    participant L1 as 一级缓存&lt;br/&gt;singletonObjects

    Note over Spring: 开始创建 A

    Spring-&gt;&gt;Spring: ① new A 空壳对象
    Spring-&gt;&gt;L3: ② 存入 A 的 ObjectFactory lambda

    Note over Spring: 给 A 注入属性，发现需要 B

    Spring-&gt;&gt;Spring: ③ new B 空壳对象
    Spring-&gt;&gt;L3: ④ 存入 B 的 ObjectFactory lambda

    Note over Spring: 给 B 注入属性，发现需要 A

    Spring-&gt;&gt;L1: ⑤ getBean(A)，查一级缓存
    L1--&gt;&gt;Spring: ❌ 没有

    Spring-&gt;&gt;L2: 查二级缓存
    L2--&gt;&gt;Spring: ❌ 没有

    Spring-&gt;&gt;L3: 查三级缓存
    L3--&gt;&gt;Spring: ✅ 找到 A 的 lambda！

    Spring-&gt;&gt;Spring: ⑥ 执行 lambda&lt;br/&gt;（需要代理则生成代理 A）
    Spring-&gt;&gt;L2: ⑦ 早期引用放入二级缓存
    Spring-&gt;&gt;L3: 删除三级缓存中的 A

    Note over Spring: B 拿到 A 的早期引用，B 完成初始化

    Spring-&gt;&gt;L1: ⑧ B 放入一级缓存 ✅
    Spring-&gt;&gt;L3: 删除三级缓存中的 B

    Note over Spring: 回到 A 的流程，B 已就绪，A 完成初始化

    Spring-&gt;&gt;L1: ⑨ A 放入一级缓存 ✅
    Spring-&gt;&gt;L2: 删除二级缓存中的 A

    Note over L1: 最终：一级缓存中有完整的 A 和 B ✅
&lt;/pre&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;情况&lt;/th&gt;
					&lt;th&gt;三级缓存&lt;/th&gt;
					&lt;th&gt;lambda 执行&lt;/th&gt;
					&lt;th&gt;二级缓存&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;无循环依赖，无 AOP&lt;/td&gt;
					&lt;td&gt;存了 lambda&lt;/td&gt;
					&lt;td&gt;❌ 不执行&lt;/td&gt;
					&lt;td&gt;不经过&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;无循环依赖，有 AOP&lt;/td&gt;
					&lt;td&gt;存了 lambda&lt;/td&gt;
					&lt;td&gt;❌ 不执行&lt;/td&gt;
					&lt;td&gt;不经过&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;有循环依赖，无 AOP&lt;/td&gt;
					&lt;td&gt;存了 lambda&lt;/td&gt;
					&lt;td&gt;✅ 执行&lt;/td&gt;
					&lt;td&gt;存原始对象&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;有循环依赖，有 AOP&lt;/td&gt;
					&lt;td&gt;存了 lambda&lt;/td&gt;
					&lt;td&gt;✅ 执行&lt;/td&gt;
					&lt;td&gt;存代理对象&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;spring-bean-缓存的放置时间和删除时间&#34;&gt;spring bean 缓存的放置时间和删除时间&lt;/h2&gt;
&lt;h2 id=&#34;spring-bean-三级缓存的放置与删除时间&#34;&gt;Spring Bean 三级缓存的放置与删除时间&lt;/h2&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;缓存&lt;/th&gt;
					&lt;th&gt;存的是什么&lt;/th&gt;
					&lt;th&gt;放入时机&lt;/th&gt;
					&lt;th&gt;删除时机&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;三级 &lt;code&gt;singletonFactories&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;Bean 的工厂 lambda&lt;/td&gt;
					&lt;td&gt;实例化完成后立刻放入&lt;/td&gt;
					&lt;td&gt;工厂被调用时（升级到二级）或 Bean 完成时&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;二级 &lt;code&gt;earlySingletonObjects&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;早期暴露的半成品 Bean&lt;/td&gt;
					&lt;td&gt;三级工厂被调用的瞬间&lt;/td&gt;
					&lt;td&gt;Bean 完全初始化完成放入一级时&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;一级 &lt;code&gt;singletonObjects&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;完整可用的 Bean&lt;/td&gt;
					&lt;td&gt;初始化全部完成后&lt;/td&gt;
					&lt;td&gt;容器关闭销毁时&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;beanfactory-和-factorybean-的区别&#34;&gt;BeanFactory 和 FactoryBean 的区别？&lt;/h2&gt;
&lt;h3 id=&#34;factorybean-是什么&#34;&gt;FactoryBean 是什么&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-java&#34; data-lang=&#34;java&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;interface&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;FactoryBean&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;T&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 返回 Bean 的实例（可以是复杂创建逻辑）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    T &lt;span style=&#34;color:#a6e22e&#34;&gt;getObject&lt;/span&gt;() &lt;span style=&#34;color:#66d9ef&#34;&gt;throws&lt;/span&gt; Exception;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 返回 Bean 的类型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Class&lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;?&amp;gt;&lt;/span&gt; getObjectType();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;// 是否单例&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;default&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;boolean&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;isSingleton&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;相同点
&lt;ul&gt;
&lt;li&gt;都是用来创建Bean对象的&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;不同点
&lt;ul&gt;
&lt;li&gt;使用 BeanFactory 创建对象的适合必须遵循严格的生命周期流程，太复杂了。如果想简单自定义某个对象的创建，同时想交给spring管理，那么必须实现 FactoryBean 接口
&lt;ul&gt;
&lt;li&gt;isSingleton 是否是单例对象&lt;/li&gt;
&lt;li&gt;getObjectType 获取返回对象的类型&lt;/li&gt;
&lt;li&gt;getObject 自定义创建对象的过程&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;对比维度&lt;/th&gt;
					&lt;th&gt;BeanFactory&lt;/th&gt;
					&lt;th&gt;FactoryBean&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;角色&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;容器/工厂接口&lt;/td&gt;
					&lt;td&gt;特殊的 Bean&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;功能&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;管理所有 Bean 的生命周期&lt;/td&gt;
					&lt;td&gt;自定义某个 Bean 的创建逻辑&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;定位&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;基础设施（IOC 容器）&lt;/td&gt;
					&lt;td&gt;业务扩展（创建复杂对象）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;使用方式&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;由 Spring 框架实现和使用&lt;/td&gt;
					&lt;td&gt;由开发者实现，注册到容器中&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;常见实现&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;DefaultListableBeanFactory&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;SqlSessionFactoryBean&lt;/code&gt;、&lt;code&gt;ProxyFactoryBean&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;&lt;strong&gt;谁创建谁&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;BeanFactory&lt;/code&gt; 创建并管理 &lt;code&gt;FactoryBean&lt;/code&gt;&lt;/td&gt;
					&lt;td&gt;&lt;code&gt;FactoryBean&lt;/code&gt; 创建业务对象&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;pre class=&#34;mermaid&#34;&gt;flowchart LR
    subgraph BeanFactory[BeanFactory - IOC容器]
        direction LR
        Bean1[普通 Bean]
        Bean2[普通 Bean]
        FB[FactoryBean&lt;br/&gt;特殊 Bean]
    end

    FB --&gt;|调用 getObject| Result[业务对象]

    User[开发者] --&gt;|getBean| BF[BeanFactory]
    BF --&gt;|返回| Bean1
    BF --&gt;|返回| Bean2
    BF --&gt;|返回 getObject 结果| Result
    BF --&gt;|加 &amp; 前缀| FB
&lt;/pre&gt;
&lt;h2 id=&#34;spring中用到的设计模式&#34;&gt;Spring中用到的设计模式&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;单例模式&lt;/li&gt;
&lt;li&gt;原型模式（指定作用域为prototype）&lt;/li&gt;
&lt;li&gt;工厂模式
&lt;ul&gt;
&lt;li&gt;BeanFactory&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;模板方法
&lt;ul&gt;
&lt;li&gt;JdbcTemplate&lt;/li&gt;
&lt;li&gt;TransactionTemplate&lt;/li&gt;
&lt;li&gt;RestTemplate&lt;/li&gt;
&lt;li&gt;RedisTemplate&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;策略模式
&lt;ul&gt;
&lt;li&gt;XmlBeanDefinitionReader&lt;/li&gt;
&lt;li&gt;PropertiesBeanDefinitionReader&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;观察者模式
&lt;ul&gt;
&lt;li&gt;listener&lt;/li&gt;
&lt;li&gt;event&lt;/li&gt;
&lt;li&gt;multicast&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;适配器模式
&lt;ul&gt;
&lt;li&gt;HandlerAdapter&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;装饰者模式
&lt;ul&gt;
&lt;li&gt;BeanWrapper&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;责任链模式
&lt;ul&gt;
&lt;li&gt;使用aop的时候会先生成一个拦截器链&lt;/li&gt;
&lt;li&gt;SpringMVC 的filter责任链&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;代理模式
&lt;ul&gt;
&lt;li&gt;动态代理&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;委托者模式
&lt;ul&gt;
&lt;li&gt;delegate&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;spring-aop-底层实现原理&#34;&gt;Spring AOP 底层实现原理&lt;/h2&gt;
&lt;h3 id=&#34;-第一层一句话定性开场&#34;&gt;🥇 第一层：一句话定性（开场）&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Spring AOP 的底层本质是&lt;strong&gt;动态代理&lt;/strong&gt;。Spring 在容器初始化 Bean 的时候，通过 &lt;code&gt;BeanPostProcessor&lt;/code&gt; 机制拦截，判断这个 Bean 是否需要被增强，如果需要，就用动态代理生成一个代理对象，替换掉原始 Bean 注册进容器。后续所有对这个 Bean 的调用，实际上都是在走代理对象。&amp;rdquo;&lt;/p&gt;</description>
    </item>
    <item>
      <title>MySQL 面试题整理</title>
      <link>https://lv-blog.pages.dev/posts/programming/for-interview/mysql-interview-questions/</link>
      <pubDate>Thu, 19 Sep 2024 23:19:24 +0800</pubDate>
      <guid>https://lv-blog.pages.dev/posts/programming/for-interview/mysql-interview-questions/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;面试题从互联网各个角落收集而来&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;如何定位慢查询&#34;&gt;如何定位慢查询？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;方案1
&lt;ul&gt;
&lt;li&gt;开源工具
&lt;ul&gt;
&lt;li&gt;Arthas&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;运维工具
&lt;ul&gt;
&lt;li&gt;Prometheus&lt;/li&gt;
&lt;li&gt;Skywalking&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;方案2
&lt;ul&gt;
&lt;li&gt;MySQL自带慢日志(mysql性能损耗)
&lt;ul&gt;
&lt;li&gt;开启慢日志方法
&lt;ul&gt;
&lt;li&gt;/etc/my.conf
&lt;ul&gt;
&lt;li&gt;slow_query_log&lt;/li&gt;
&lt;li&gt;long_query_time&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;sql语句执行很慢如何分析&#34;&gt;SQL语句执行很慢，如何分析&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;慢的原因
&lt;ul&gt;
&lt;li&gt;聚合查询&lt;/li&gt;
&lt;li&gt;多表查询&lt;/li&gt;
&lt;li&gt;表数据量过大查询&lt;/li&gt;
&lt;li&gt;深度分页查询&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;如何分析慢
&lt;ul&gt;
&lt;li&gt;explain， desc 命令
&lt;ul&gt;
&lt;li&gt;如何分析执行结果？
&lt;ul&gt;
&lt;li&gt;extra 的额外优化建议
&lt;ul&gt;
&lt;li&gt;using where; using index 查找使用了索引，需要的数据在索引列都能找到，不需要回表查询数据&lt;/li&gt;
&lt;li&gt;using index condition 查找使用了索引&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;type
&lt;ul&gt;
&lt;li&gt;index，all 需要优化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;了解过索引吗什么是索引&#34;&gt;了解过索引吗？什么是索引？&lt;/h2&gt;
&lt;p&gt;索引（index）是帮助 MySQL 高效获取数据的数据结构（有序）。在数据之外，数据库系统还维护着满足特定查找算法的数据结构（如 B+ 树），这些数据结构以某种方式引用（指向）数据，这样就可以在这些数据结构上实现高级查找算法，这种数据结构就是索引。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;帮助MySQL高效获取数据的数据结构&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;索引的底层数据结构了解过吗&#34;&gt;索引的底层数据结构了解过吗？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;二叉搜索树&lt;/li&gt;
&lt;li&gt;红黑树&lt;/li&gt;
&lt;li&gt;B树&lt;/li&gt;
&lt;li&gt;B+树
&lt;ul&gt;
&lt;li&gt;阶数更多，路径更短&lt;/li&gt;
&lt;li&gt;磁盘读写代价B+树更低，叶子节点才能真正存储数据&lt;/li&gt;
&lt;li&gt;便于扫库和区间查询，叶子节点是双向链表&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;什么是聚簇索引什么是非聚簇索引&#34;&gt;什么是聚簇索引？什么是非聚簇索引？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;聚簇索引&lt;/li&gt;
&lt;li&gt;二级索引&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;什么是回表查询&#34;&gt;什么是回表查询？&lt;/h2&gt;
&lt;h2 id=&#34;知道什么是覆盖索引吗&#34;&gt;知道什么是覆盖索引吗？&lt;/h2&gt;
&lt;p&gt;通过该索引查询能够一次找到所有数据，且无需回表的，就是覆盖索引&lt;/p&gt;
&lt;h2 id=&#34;mysql超大分页怎么处理&#34;&gt;MySQL超大分页怎么处理？&lt;/h2&gt;
&lt;p&gt;使用覆盖索引加上子查询&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-mysql&#34; data-lang=&#34;mysql&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;select&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;from&lt;/span&gt; tb_sku t,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  (&lt;span style=&#34;color:#66d9ef&#34;&gt;select&lt;/span&gt; id &lt;span style=&#34;color:#66d9ef&#34;&gt;from&lt;/span&gt; tb_sku &lt;span style=&#34;color:#66d9ef&#34;&gt;order&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;by&lt;/span&gt; id &lt;span style=&#34;color:#66d9ef&#34;&gt;limit&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;9000000&lt;/span&gt;,&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;) a 
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;where&lt;/span&gt; t.id &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; a.id
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;索引创建的原则有哪些&#34;&gt;索引创建的原则有哪些？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;单表超过10万条数据且查询比较频繁的表建立索引&lt;/li&gt;
&lt;li&gt;常常作为查询条件的字段要建立索引&lt;/li&gt;
&lt;li&gt;使用区分度高的列作为索引，尽量建立唯一索引&lt;/li&gt;
&lt;li&gt;字符串类型的字段长度较长可以建立前缀索引&lt;/li&gt;
&lt;li&gt;尽量使用联合索引，减少单列索引&lt;/li&gt;
&lt;li&gt;索引列使用NOT NULL方便优化器确定哪个索引更好用于查询&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;什么情况下索引会失效&#34;&gt;什么情况下索引会失效？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;违反了最左前缀法则&lt;/li&gt;
&lt;li&gt;查询范围右边的列，不能使用索引&lt;/li&gt;
&lt;li&gt;索引列上进行运算操作，索引列失效&lt;/li&gt;
&lt;li&gt;字符串不加单引号，索引失效（索引类型转换导致的失效）&lt;/li&gt;
&lt;li&gt;字符串非尾部匹配，索引失效&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;谈一谈对sql优化的经验&#34;&gt;谈一谈对SQL优化的经验&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;表设计优化
&lt;ul&gt;
&lt;li&gt;我们参考了 阿里开发手册《嵩山版》&lt;/li&gt;
&lt;li&gt;根据实际存储数值长短设计数据类型&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;索引的优化&lt;/li&gt;
&lt;li&gt;SQL语句的优化
&lt;ul&gt;
&lt;li&gt;select 语句务必指明字段名称
&lt;ul&gt;
&lt;li&gt;为了覆盖索引&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;尽量用 union all 代替 union&lt;/li&gt;
&lt;li&gt;避免对 where 子句中对字段进行表达式操作&lt;/li&gt;
&lt;li&gt;能用 innerjoin 就不用 left join , right join。如必须，要以小表为驱动&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;主从复制，读写分离&lt;/li&gt;
&lt;li&gt;分库分表&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;事务的特性详细说一说&#34;&gt;事务的特性详细说一说&lt;/h2&gt;
&lt;h2 id=&#34;并发事务带来哪些问题如何解决这些问题mysql的默认隔离级别是&#34;&gt;并发事务带来哪些问题，如何解决这些问题？MySQL的默认隔离级别是？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;并发事务的问题
&lt;ul&gt;
&lt;li&gt;脏读
&lt;ul&gt;
&lt;li&gt;读已提交&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;不可重复读
&lt;ul&gt;
&lt;li&gt;值问题&lt;/li&gt;
&lt;li&gt;可重复读&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;幻读
&lt;ul&gt;
&lt;li&gt;数量问题&lt;/li&gt;
&lt;li&gt;串行化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;隔离级别
&lt;ul&gt;
&lt;li&gt;未提交读&lt;/li&gt;
&lt;li&gt;读已提交&lt;/li&gt;
&lt;li&gt;可重复读*&lt;/li&gt;
&lt;li&gt;串行化&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;undo-log-和-redo-log-的区别&#34;&gt;undo log 和 redo log 的区别&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;缓冲池&lt;/li&gt;
&lt;li&gt;数据页&lt;/li&gt;
&lt;li&gt;redo log
&lt;ul&gt;
&lt;li&gt;物理&lt;/li&gt;
&lt;li&gt;持久&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;undo log
&lt;ul&gt;
&lt;li&gt;逻辑&lt;/li&gt;
&lt;li&gt;原子 一致&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;事务的隔离性底层是如何保证的&#34;&gt;事务的隔离性底层是如何保证的？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;锁：排他锁&lt;/li&gt;
&lt;li&gt;MVCC
&lt;ul&gt;
&lt;li&gt;多版本并发控制&lt;/li&gt;
&lt;li&gt;依赖于
&lt;ul&gt;
&lt;li&gt;隐式字段
&lt;ul&gt;
&lt;li&gt;DB_TRX_ID&lt;/li&gt;
&lt;li&gt;DB_ROLL_PTR&lt;/li&gt;
&lt;li&gt;DB_ROW_ID&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;undo log
&lt;ul&gt;
&lt;li&gt;版本链
&lt;ul&gt;
&lt;li&gt;版本链数据访问规则&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;readview
&lt;ul&gt;
&lt;li&gt;快照读
&lt;ul&gt;
&lt;li&gt;Read Committed 每次 select都生成一个快照读&lt;/li&gt;
&lt;li&gt;Repeatable Read 开启事务后第一个 select 语句才是快照读的地方&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;核心字段
&lt;ul&gt;
&lt;li&gt;m_ids&lt;/li&gt;
&lt;li&gt;min_trx_id&lt;/li&gt;
&lt;li&gt;max_trx_id&lt;/li&gt;
&lt;li&gt;creator_trx_id&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RC隔离级别下，在事务中每次执行快照读时生成 ReadView&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;img style=&#34;background:wheat&#34; src=&#34;https://img.wathan.cn/images/2026/06/cd548aef09e32fd1e14c29fa8745e0e1b60269f31af92b320c83320d44bdedf1.svg&#34;&gt;
&lt;h2 id=&#34;mysql-的主从同步原理&#34;&gt;MySQL 的主从同步原理&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;核心：二进制日志
&lt;ul&gt;
&lt;li&gt;BINLOG
&lt;ul&gt;
&lt;li&gt;DDL&lt;/li&gt;
&lt;li&gt;DML
主数据库在事务提交时，变更记录写入 Binlog
从库 binlog -&amp;gt; 中继日志
从库 中继日志读取事件 -&amp;gt; 从库数据库&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;你们项目用过分库分表吗&#34;&gt;你们项目用过分库分表吗？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;什么时候分库分表
&lt;ul&gt;
&lt;li&gt;单表数据量达到1000W 或者 20GB&lt;/li&gt;
&lt;li&gt;优化解决不了性能问题&lt;/li&gt;
&lt;li&gt;IO、CPU瓶颈&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;如何拆分
&lt;ul&gt;
&lt;li&gt;垂直拆分
&lt;ul&gt;
&lt;li&gt;垂直分库
&lt;ul&gt;
&lt;li&gt;不同表拆分到不同库&lt;/li&gt;
&lt;li&gt;适用于微服务&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;垂直分表
&lt;ul&gt;
&lt;li&gt;不常用字段单独放在一张表&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;水平拆分
&lt;ul&gt;
&lt;li&gt;水平分库
&lt;ul&gt;
&lt;li&gt;一个库的数据拆分到多个库中&lt;/li&gt;
&lt;li&gt;路由规则
&lt;ul&gt;
&lt;li&gt;根据id节点取模&lt;/li&gt;
&lt;li&gt;按id范围路由&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;水平分表
&lt;ul&gt;
&lt;li&gt;一个表的数据拆分到多个表中&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;新的问题
&lt;ul&gt;
&lt;li&gt;分布式事务一致性问题&lt;/li&gt;
&lt;li&gt;跨节点关联查询&lt;/li&gt;
&lt;li&gt;跨节点分页、排序函数&lt;/li&gt;
&lt;li&gt;主键去重&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;解决方案
&lt;ul&gt;
&lt;li&gt;分库分表中间件
&lt;ul&gt;
&lt;li&gt;mycat&lt;/li&gt;
&lt;li&gt;sharding-sphere&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;深入问题&#34;&gt;深入问题&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;为什么 InnoDB 主键建议自增？&lt;/li&gt;
&lt;li&gt;为什么非自增主键会导致页分裂？&lt;/li&gt;
&lt;li&gt;为什么 MyISAM 和 InnoDB 索引结构不同？&lt;/li&gt;
&lt;li&gt;为什么 B+树适合磁盘而红黑树不适合？&lt;/li&gt;
&lt;/ol&gt;</description>
    </item>
  </channel>
</rss>
