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

+++++背到厌倦。持续更新

Spring IoC 的工作流程:

  1. 读取 BeanDefinition: Spring 容器启动时,会读取 Bean 的配置信息 (例如 XML 配置文件、注解或 Java 代码),并将这些配置信息转换为 BeanDefinition 对象。
  2. 创建 Bean 实例: 根据 BeanDefinition 中的信息,Spring 容器使用反射机制创建 Bean 的实例。
  3. 解析依赖关系: Spring 容器解析 Bean 的依赖关系,找到 Bean 所依赖的其他 Bean。
  4. 注入依赖: Spring 容器使用依赖注入的方式,将依赖对象注入到 Bean 中。
  5. Bean 的生命周期管理: Spring 容器负责管理 Bean 的生命周期,包括初始化、使用和销毁。

自动装配的核心概念:

  • @EnableAutoConfiguration:

    • 这是一个复合注解,通常放在 Spring Boot 应用的启动类上。
    • 它启用了 Spring Boot 的自动配置机制。
    • 它实际上包含了 @AutoConfigurationPackage 和 @Import(AutoConfigurationImportSelector.class) 两个注解。
  • @AutoConfigurationPackage:

    • 它用于指定自动配置的基础包。
    • Spring Boot 会扫描该包及其子包下的所有组件 (例如 @Component@Service@Repository@Controller 等),并将它们注册为 Bean。
    • 通常情况下,@AutoConfigurationPackage 会自动扫描启动类所在的包作为基础包。
  • AutoConfigurationImportSelector:

    • 它是自动配置的核心组件。
    • 它负责扫描所有符合自动配置条件的类,并将它们导入到 Spring 容器中。
    • 它主要通过以下几个步骤来实现自动配置:
      1. 扫描 META-INF/spring.factories 文件: AutoConfigurationImportSelector 会扫描所有 jar 包中的 META-INF/spring.factories 文件。
      2. 加载自动配置类: spring.factories 文件中定义了大量的自动配置类,AutoConfigurationImportSelector 会加载这些类。
      3. 条件过滤: AutoConfigurationImportSelector 会根据一定的条件对自动配置类进行过滤,只有满足条件的自动配置类才会被导入到 Spring 容器中。
      4. 导入自动配置类: AutoConfigurationImportSelector 使用 @Import 注解将符合条件的自动配置类导入到 Spring 容器中。
  • 条件注解 (Conditional Annotations):

    • Spring Boot 提供了大量的条件注解,用于控制自动配置类的生效条件。

 MyBatis中一级缓存和二级缓存有什么差别?

1. 一级缓存 (Local Cache):

  • 作用域: SqlSession 级别。
  • 生命周期: 与 SqlSession 的生命周期相同。 当 SqlSession 关闭时,一级缓存也会被清空。
  • 存储介质: 内存。
  • 工作原理:
    • 当执行一个查询语句时,MyBatis 首先会从一级缓存中查找是否存在相同的 SQL 语句和参数。
    • 如果存在,则直接从一级缓存中返回结果,避免访问数据库。
    • 如果不存在,则访问数据库,并将查询结果放入一级缓存中。
    • 当执行更新、插入或删除语句时,MyBatis 会清空一级缓存,以保证数据的一致性。
  • 优点:
    • 提高查询性能,减少数据库访问次数。
    • 实现简单,无需额外配置。
  • 缺点:
    • 缓存范围小,只能在单个 SqlSession 中共享。
    • 并发性差,多个 SqlSession 之间无法共享缓存。
  • 默认开启: 一级缓存默认开启,无需手动配置。
  • 清空时机:
    • 执行更新、插入或删除语句时。
    • 手动调用 SqlSession.clearCache() 方法时。
    • SqlSession 关闭时。

2. 二级缓存 (Second Level Cache):

  • 作用域: Mapper 级别 (namespace 级别)。
  • 生命周期: 与应用程序的生命周期相同。
  • 存储介质: 可以配置为内存、磁盘或其他存储介质。
  • 工作原理:
    • 当执行一个查询语句时,MyBatis 首先会从二级缓存中查找是否存在相同的 SQL 语句和参数。
    • 如果存在,则直接从二级缓存中返回结果,避免访问数据库。
    • 如果不存在,则访问数据库,并将查询结果放入二级缓存中。
    • 当执行更新、插入或删除语句时,MyBatis 会清空二级缓存中与该语句相关的缓存区域,以保证数据的一致性。
  • 优点:
    • 提高查询性能,减少数据库访问次数。
    • 缓存范围大,可以在多个 SqlSession 之间共享。
    • 并发性好,多个 SqlSession 可以同时访问二级缓存。
  • 缺点:
    • 实现复杂,需要手动配置。
    • 数据一致性难以保证,需要谨慎使用。
  • 默认关闭: 二级缓存默认关闭,需要手动配置才能开启。
  • 清空时机:
    • 执行更新、插入或删除语句时,会清空与该语句相关的缓存区域。
    • 手动配置缓存刷新策略。
    • 应用程序关闭时。

当使用 new 关键字创建一个对象时,JVM 会执行以下步骤:

  1. 加载类: 如果 MyClass 类还没有被加载,JVM 会使用类加载器 (ClassLoader) 将 MyClass.class 文件加载到内存中。

  2. 分配内存: JVM 会在堆 (Heap) 内存中为新对象分配内存空间。 内存分配的方式取决于堆的实现和垃圾回收器的策略。

  3. 初始化零值: JVM 会将分配到的内存空间初始化为零值。 这意味着所有的实例变量都会被赋予默认值:

    • int -> 0
    • double -> 0.0
    • boolean -> false
    • Object -> null
  4. 设置对象头: JVM 会设置对象的对象头 (Object Header)。 对象头包含以下信息:

    • Mark Word: 存储对象的哈希码、GC 分代年龄、锁状态标志等。
    • Klass Pointer: 指向对象所属的类 (Class) 的指针。
  5. 执行构造方法: JVM 会调用对象的构造方法 (Constructor) 来初始化对象的实例变量。构造方法会根据代码中的逻辑给实例变量赋值。

  6. 返回对象引用: JVM 会将新创建对象的引用返回给调用者。

3. 内存分配方式

JVM 在堆中分配内存的方式有两种:

  • 指针碰撞 (Bump the Pointer): 适用于堆内存是规整的情况,即所有用过的内存都放在一边,空闲的内存放在另一边。 JVM 只需要将指针向空闲内存方向移动一段与对象大小相等的距离,即可完成内存分配。

  • 空闲列表 (Free List): 适用于堆内存是不规整的情况,即用过的内存和空闲的内存相互交错。 JVM 维护一个空闲列表,记录了所有可用的空闲内存块。 在分配内存时,JVM 会从空闲列表中找到一块足够大的内存块,并将其分配给对象。

4. 对象头的结构

对象头 (Object Header) 是 JVM 中每个对象都必须包含的信息,它存储了对象的元数据。 对象头的结构如下:

  • Mark Word (8 字节): 存储对象的哈希码、GC 分代年龄、锁状态标志等。 Mark Word 的结构会根据对象的状态而变化。
  • Klass Pointer (4 字节或 8 字节): 指向对象所属的类 (Class) 的指针。 如果 JVM 开启了指针压缩 (Compressed Oops),则 Klass Pointer 占用 4 字节,否则占用 8 字节。
  • 数组长度 (4 字节): 只有数组对象才有这个字段,用于记录数组的长度。

5. 对象创建的优化

JVM 会对对象创建进行一些优化:

  • TLAB (Thread-Local Allocation Buffer): 为每个线程分配一个私有的 TLAB,用于加速对象的分配。 线程可以在自己的 TLAB 中分配对象,而无需进行同步。
  • 逃逸分析: 分析对象的生命周期,如果对象只在方法内部使用,没有逃逸到方法外部,则可以将对象分配在栈上,而不是堆上。 这可以减少垃圾回收的压力。

http://www.mrgr.cn/news/98424.html

相关文章:

  • composer报错的处理方案
  • 【VUE3】练习项目——大事件后台管理
  • Android studio消息同步机制:消息本地存储,服务器交互减压
  • Nodejs Express框架
  • linux 进程信号
  • 批处理脚本bat丨遍历一个包含项目名称的数组,并对每个文件中的项目执行 git pull 操作 (一键拉很多文件的代码)
  • C++ Json-Rpc框架-3项目实现(2)
  • hive数仓要点总结
  • Apache Hive学习教程
  • [Dify] 使用 Docker 本地部署 Dify 并集成 Ollama 模型的详细指南
  • (2025亲测可用)Chatbox多端一键配置Claude/GPT/DeepSeek-网页端配置
  • Gitea 1.23.7 速配
  • 腾讯云golang一面
  • 批量归一化(Batch Normalization)原理与PyTorch实现
  • 用Webpack 基础配置快速搭建项目开发环境
  • Multisim使用教程详尽版--(2025最新版)
  • DICOM通讯(ACSE->DIMSE->Worklist)
  • Linux vagrant 导入ubuntu到virtualbox
  • spring-boot nacos
  • Java-面向对象