JVM GC策略与SpringBoot实践解析

📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)(进阶篇)、(架构篇)、《解密程序员的思维密码——沟通、演讲、思考的实践》作者、清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。

📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。

📙不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。

Java程序员廖志伟

💡在这个美好的时刻,笔者不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

优快云

🌟 JVM与SpringBoot关联的GC策略

🍊 GC策略选择定义

🎉 JVM支持的GC算法

算法名称技术原理应用场景优势与局限实际案例
Serial GC单线程执行垃圾回收,适用于单核CPU单核CPU环境,对响应时间要求不高简单,启动快,但性能较差适用于小型应用或测试环境
Parallel GC多线程执行垃圾回收,适用于多核CPU多核CPU环境,对性能要求较高性能较好,但启动时间较长适用于大型应用或生产环境
CMS GC分代收集,适用于响应时间敏感的应用响应时间敏感的应用,如Web服务器减少停顿时间,但可能产生碎片适用于Web服务器、数据库服务器等
G1 GC分代收集,适用于大内存,多核CPU大内存,多核CPU环境,对性能要求较高优化停顿时间,减少碎片适用于大型应用或生产环境
ZGC分代收集,适用于大内存,多核CPU大内存,多核CPU环境,对性能要求极高极低停顿时间,适用于生产环境适用于对性能要求极高的生产环境
Shenandoah GC分代收集,适用于大内存,多核CPU大内存,多核CPU环境,对性能要求极高极低停顿时间,适用于生产环境适用于对性能要求极高的生产环境

🎉 SpringBoot支持的GC策略

策略名称描述
Default GCSpringBoot默认的GC策略,根据JVM版本自动选择合适的GC算法
Custom GC用户自定义的GC策略,可以通过配置文件指定GC算法

🍊 GC策略是什么

🎉 Serial GC

  • 技术原理:Serial GC通过单线程进行垃圾回收,适用于单核CPU环境。
  • 应用场景:在单核CPU环境中,当对响应时间的要求不高时,Serial GC是一个不错的选择。
  • 优势与局限:Serial GC的优势在于其简单性和快速启动,但它的局限在于性能较差。
  • 实际案例:Serial GC适用于小型应用或测试环境。

🎉 Parallel GC

  • 技术原理:Parallel GC通过多线程执行垃圾回收,适用于多核CPU环境。
  • 应用场景:在多核CPU环境中,当对性能要求较高时,Parallel GC能够提供较好的性能。
  • 优势与局限:Parallel GC在性能上优于Serial GC,但启动时间较长。
  • 实际案例:Parallel GC适用于大型应用或生产环境。

🎉 CMS GC

  • 技术原理:CMS GC采用分代收集机制,适用于响应时间敏感的应用。
  • 应用场景:CMS GC特别适合于Web服务器和数据库服务器等响应时间敏感的应用。
  • 优势与局限:CMS GC能够减少停顿时间,但可能会产生碎片。
  • 实际案例:CMS GC适用于Web服务器、数据库服务器等。

🎉 G1 GC

  • 技术原理:G1 GC也是一种分代收集机制,适用于大内存和多核CPU环境。
  • 应用场景:G1 GC适用于大型应用或生产环境,对性能要求较高。
  • 优势与局限:G1 GC优化了停顿时间,减少了碎片。
  • 实际案例:G1 GC适用于大型应用或生产环境。

🎉 ZGC

  • 技术原理:ZGC是一种分代收集机制,适用于大内存和多核CPU环境,对性能要求极高。
  • 应用场景:ZGC适用于对性能要求极高的生产环境。
  • 优势与局限:ZGC提供了极低的停顿时间。
  • 实际案例:ZGC适用于对性能要求极高的生产环境。

🎉 Shenandoah GC

  • 技术原理:Shenandoah GC也是一种分代收集机制,适用于大内存和多核CPU环境,对性能要求极高。
  • 应用场景:Shenandoah GC适用于对性能要求极高的生产环境。
  • 优势与局限:Shenandoah GC提供了极低的停顿时间。
  • 实际案例:Shenandoah GC适用于对性能要求极高的生产环境。

🍊 GC策略有什么用

🎉 性能优化

  • 减少内存碎片:通过选择合适的GC算法,可以减少内存碎片,提高内存使用效率。
  • 降低GC停顿时间:降低GC停顿时间,可以提高应用的响应速度。

🎉 资源管理

  • 优化内存分配:优化内存分配,减少内存泄漏。
  • 适应不同应用场景:根据应用场景选择合适的GC算法,提高资源利用率。

🎉 稳定性保障

  • 降低GC引起的应用卡顿:降低GC引起的应用卡顿,提高应用稳定性。
  • 减少故障发生:提高应用稳定性,减少故障发生。

🎉 可配置性

  • 根据应用需求调整GC策略:根据应用需求调整GC策略,适应不同应用场景。
  • 提高应用性能:适应不同应用场景,提高应用性能。
GC策略优势劣势适用场景
Serial GC简单,启动快性能较差小型应用或测试环境
Parallel GC性能较好启动时间较长大型应用或生产环境
CMS GC减少停顿时间可能产生碎片响应时间敏感的应用
G1 GC优化停顿时间,减少碎片适用于大内存,多核CPU环境大型应用或生产环境
ZGC极低停顿时间适用于大内存,多核CPU环境对性能要求极高的生产环境
Shenandoah GC极低停顿时间适用于大内存,多核CPU环境对性能要求极高的生产环境# SpringBoot@EnableAutoConfiguration底层技术实现细节

🍊 1. SpringBoot启动过程

🎉 1.1. SpringApplication.run()方法

SpringApplication.run()是SpringBoot启动的核心方法,负责初始化Spring应用上下文并启动应用。以下是该方法的主要步骤:

步骤描述
1创建SpringApplication实例
2设置Spring应用上下文
3设置应用参数
4设置事件监听器
5设置资源处理器
6设置环境处理器
7设置应用配置处理器
8设置应用属性处理器
9设置应用命令行处理器
10设置应用运行监听器
11设置应用运行器
12运行应用

🎉 1.2. SpringApplication的初始化

SpringApplication的初始化过程包括以下几个步骤:

步骤描述
1设置应用类型(例如:单实例、集群等)
2设置应用名称
3设置应用版本
4设置应用元数据
5设置应用资源处理器
6设置应用事件监听器
7设置应用运行监听器

🎉 1.3. 创建SpringApplicationRunListeners

SpringApplicationRunListeners用于监听Spring应用的生命周期事件。创建SpringApplicationRunListeners的过程如下:

步骤描述
1获取Spring应用运行监听器
2创建SpringApplicationRunListeners实例
3注册监听器

🎉 1.4. 执行run()方法

执行run()方法时,SpringApplication会依次执行以下步骤:

步骤描述
1初始化Spring应用上下文
2设置应用参数
3设置事件监听器
4设置资源处理器
5设置环境处理器
6设置应用配置处理器
7设置应用属性处理器
8设置应用命令行处理器
9设置应用运行监听器
10运行应用

🍊 2. @EnableAutoConfiguration注解

🎉 2.1. @EnableAutoConfiguration的源码解析

@EnableAutoConfiguration是一个Spring框架提供的注解,用于启用自动配置功能。以下是该注解的源码解析:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}

🎉 2.2. @EnableAutoConfiguration的原理

@EnableAutoConfiguration的原理是通过Spring的自动配置机制,根据项目依赖的jar包自动配置相应的Bean。具体实现如下:

  1. SpringFactoriesLoader加载所有jar包中的META-INF/spring.factories文件。
  2. 根据项目依赖的jar包,筛选出对应的自动配置类。
  3. 将筛选出的自动配置类注册到Spring应用上下文中。

🎉 2.3. @EnableAutoConfiguration的依赖注入

@EnableAutoConfiguration注解通过Spring的自动配置机制,将自动配置类注入到Spring应用上下文中。具体实现如下:

  1. SpringFactoriesLoader加载所有jar包中的META-INF/spring.factories文件。
  2. 根据项目依赖的jar包,筛选出对应的自动配置类。
  3. 将筛选出的自动配置类注册到Spring应用上下文中。

🍊 3. SpringFactoriesLoader

🎉 3.1. SpringFactoriesLoader的加载机制

SpringFactoriesLoader用于加载所有jar包中的META-INF/spring.factories文件。以下是SpringFactoriesLoader的加载机制:

步骤描述
1加载所有jar包的META-INF/spring.factories文件
2解析文件内容,获取所有自动配置类
3将自动配置类注册到Spring应用上下文中

🎉 3.2. SpringFactoriesLoader的加载过程

SpringFactoriesLoader的加载过程如下:

  1. 获取所有jar包的路径。
  2. 遍历所有jar包,查找META-INF/spring.factories文件。
  3. 解析文件内容,获取所有自动配置类。
  4. 将自动配置类注册到Spring应用上下文中。

🎉 3.3. SpringFactoriesLoader的配置文件

SpringFactoriesLoader的配置文件位于jar包的META-INF/spring.factories文件中,格式如下:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfigure.MyAutoConfiguration

🍊 4. SpringBoot的自动配置原理

🎉 4.1. 自动配置的触发条件

SpringBoot的自动配置触发条件如下:

  1. 项目依赖了SpringBoot的启动器。
  2. 项目中使用了@EnableAutoConfiguration注解。

🎉 4.2. 自动配置的匹配规则

自动配置的匹配规则如下:

  1. 根据项目依赖的jar包,筛选出对应的自动配置类。
  2. 根据自动配置类的条件判断,确定是否启用该自动配置类。

🎉 4.3. 自动配置的生效过程

自动配置的生效过程如下:

  1. SpringFactoriesLoader加载所有jar包中的META-INF/spring.factories文件。
  2. 根据项目依赖的jar包,筛选出对应的自动配置类。
  3. 将筛选出的自动配置类注册到Spring应用上下文中。
  4. 自动配置类根据条件判断,自动配置相应的Bean。

🍊 5. SpringBoot的自动配置类

🎉 5.1. 自动配置类的定义

自动配置类是SpringBoot自动配置的核心,它负责根据项目依赖的jar包自动配置相应的Bean。以下是自动配置类的定义:

@Configuration
@ConditionalOnClass(XXX.class)
@ConditionalOnMissingBean(XXX.class)
public class MyAutoConfiguration {
    // ...
}

🎉 5.2. 自动配置类的实现方式

自动配置类的实现方式如下:

  1. 使用@Configuration注解定义自动配置类。
  2. 使用@ConditionalOnClass、@ConditionalOnMissingBean等注解,根据项目依赖的jar包和Bean的存在情况,判断是否启用该自动配置类。
  3. 在自动配置类中,定义自动配置的Bean。

🎉 5.3. 自动配置类的使用示例

以下是一个简单的自动配置类示例:

@Configuration
@ConditionalOnClass(XXX.class)
@ConditionalOnMissingBean(XXX.class)
public class MyAutoConfiguration {
    @Bean
    public XXX myBean() {
        return new XXX();
    }
}

🍊 6. SpringBoot的自动配置属性

🎉 6.1. 自动配置属性的来源

自动配置属性的来源如下:

  1. SpringBoot的配置文件(application.properties、application.yml)。
  2. 系统环境变量。
  3. 命令行参数。

🎉 6.2. 自动配置属性的配置方式

自动配置属性的配置方式如下:

  1. 在SpringBoot的配置文件中,使用key-value形式配置属性。
  2. 使用系统环境变量配置属性。
  3. 使用命令行参数配置属性。

🎉 6.3. 自动配置属性的优先级

自动配置属性的优先级如下:

  1. 命令行参数 > 系统环境变量 > 配置文件

🍊 7. SpringBoot的自动配置排除

🎉 7.1. 自动配置排除的机制

SpringBoot的自动配置排除机制如下:

  1. 使用@ConditionalOnClass、@ConditionalOnMissingBean等注解,根据项目依赖的jar包和Bean的存在情况,判断是否排除该自动配置类。
  2. 在自动配置类中,使用@ConditionalOnClass、@ConditionalOnMissingBean等注解,根据项目依赖的jar包和Bean的存在情况,判断是否排除该自动配置类。

🎉 7.2. 自动配置排除的配置方式

自动配置排除的配置方式如下:

  1. 在自动配置类中,使用@ConditionalOnClass、@ConditionalOnMissingBean等注解,根据项目依赖的jar包和Bean的存在情况,判断是否排除该自动配置类。

🎉 7.3. 自动配置排除的使用示例

以下是一个简单的自动配置排除示例:

@Configuration
@ConditionalOnClass(XXX.class)
@ConditionalOnMissingBean(XXX.class)
@ConditionalOnProperty(name = "myapp.exclude", havingValue = "true")
public class MyAutoConfiguration {
    // ...
}

🍊 8. SpringBoot的自动配置扩展

🎉 8.1. 自动配置扩展的原理

SpringBoot的自动配置扩展原理如下:

  1. 在SpringBoot的配置文件中,定义自定义属性。
  2. 创建自定义的自动配置类,根据自定义属性自动配置相应的Bean。

🎉 8.2. 自动配置扩展的实现方式

自动配置扩展的实现方式如下:

  1. 在SpringBoot的配置文件中,定义自定义属性。
  2. 创建自定义的自动配置类,使用@Value注解注入自定义属性。
  3. 在自定义的自动配置类中,根据自定义属性自动配置相应的Bean。

🎉 8.3. 自动配置扩展的使用示例

以下是一个简单的自动配置扩展示例:

@Configuration
public class MyAutoConfiguration {
    @Value("${myapp.custom-value}")
    private String customValue;

    @Bean
    public CustomBean customBean() {
        return new CustomBean(customValue);
    }
}
```# JVM与SpringBoot关联的类加载机制

## 🍊 类加载器

### 🎉 Bootstrap ClassLoader

Bootstrap ClassLoader是JVM自带的类加载器,负责加载核心类库,如rt.jar中的类。它加载的类库位于JVM的启动类路径(Bootstrap Classpath)中,通常包括JVM运行时所需的类库,如java.lang.*, java.io.*等。

| 技术原理 | Bootstrap ClassLoader是JVM自带的类加载器,负责加载核心类库,如rt.jar中的类。 |
| --- | --- |
| 应用场景 | 加载JVM自身需要的类库,如java.lang.*, java.io.*等。 |
| 优势与局限 | 优势:加载速度较快,安全性高。局限:无法自定义加载路径。 |
| 实际案例 | 加载java.lang.Runtime类。 |

### 🎉 Extension ClassLoader

Extension ClassLoader负责加载JVM的扩展库,如jre/lib/ext目录下的jar包。它加载的类库位于JVM的扩展类路径(Extension Classpath)中,通常用于加载第三方库,如数据库驱动、加密库等。

| 技术原理 | Extension ClassLoader负责加载JVM的扩展库,如jre/lib/ext目录下的jar包。 |
| --- | --- |
| 应用场景 | 加载JVM扩展库,如数据库驱动、加密库等。 |
| 优势与局限 | 优势:方便扩展JVM功能。局限:加载速度较慢。 |
| 实际案例 | 加载MySQL驱动jar包。 |

### 🎉 App ClassLoader

App ClassLoader负责加载应用程序的类库,如应用程序的jar包、war包等。它通常位于应用程序的类路径(Classpath)中,负责加载应用程序运行时所需的类。

| 技术原理 | App ClassLoader负责加载应用程序的类库,如应用程序的jar包、war包等。 |
| --- | --- |
| 应用场景 | 加载应用程序的类库。 |
| 优势与局限 | 优势:方便管理应用程序的类库。局限:加载速度较慢。 |
| 实际案例 | 加载SpringBoot应用程序的类库。 |

### 🎉 用户自定义类加载器

用户自定义类加载器可以加载自定义的类库,如通过URL加载远程jar包。它允许开发者根据需要自定义类加载逻辑,实现特定的类加载需求。

| 技术原理 | 用户自定义类加载器可以加载自定义的类库,如通过URL加载远程jar包。 |
| --- | --- |
| 应用场景 | 加载自定义的类库,如远程jar包、加密类库等。 |
| 优势与局限 | 优势:灵活性强。局限:加载速度较慢,安全性较低。 |
| 实际案例 | 加载远程jar包。 |

## 🍊 双亲委派模型

双亲委派模型是一种类加载器之间的委托关系,当一个类加载器请求加载一个类时,它会先请求其父类加载器加载,如果父类加载器无法加载,再请求子类加载器加载。这种模型确保了类加载的一致性和安全性。

## 🍊 类加载器缓存

类加载器缓存可以提高类加载效率,避免重复加载同一个类。当类加载器加载一个类时,它会首先检查缓存中是否已存在该类的定义,如果存在,则直接返回该类的定义,否则进行加载。

## 🍊 类加载器隔离

类加载器隔离可以防止不同应用程序之间的类冲突。通过为每个应用程序创建独立的类加载器实例,可以确保不同应用程序之间的类不会相互干扰。

## 🍊 类加载器热部署

类加载器热部署可以在不重启应用程序的情况下,替换或更新类库。通过使用特定的类加载器,可以动态地加载和卸载类,从而实现类库的热更新。

# 🌟 SpringBoot自动配置使用Demo相关知识点

## 🍊 自动配置原理

### 🎉 @SpringBootApplication

@SpringBootApplication是SpringBoot的启动类注解,用于标记一个应用程序为SpringBoot应用程序。它是一个组合注解,包含了@Configuration、@EnableAutoConfiguration和@ComponentScan等注解。

| 技术原理 | @SpringBootApplication是SpringBoot的启动类注解,用于标记一个应用程序为SpringBoot应用程序。 |
| --- | --- |
| 应用场景 | 标记一个应用程序为SpringBoot应用程序。 |
| 优势与局限 | 优势:简化SpringBoot应用程序的配置。局限:无法自定义配置。 |
| 实际案例 | 标记SpringBoot应用程序的启动类。 |

### 🎉 @Configuration

@Configuration是Spring框架的配置类注解,用于定义Bean的创建和配置。它表示一个类是一个配置类,其中可以包含多个@Bean注解的方法,用于定义Bean的创建和配置。

| 技术原理 | @Configuration是Spring框架的配置类注解,用于定义Bean的创建和配置。 |
| --- | --- |
| 应用场景 | 定义Bean的创建和配置。 |
| 优势与局限 | 优势:方便管理Bean的创建和配置。局限:需要编写大量的配置代码。 |
| 实际案例 | 定义数据库连接池的Bean。 |

### 🎉 @Bean

@Bean是Spring框架的Bean注解,用于标记一个方法返回的对象为Bean。它通常用于@Configuration注解的类中,用于定义Bean的创建和配置。

| 技术原理 | @Bean是Spring框架的Bean注解,用于标记一个方法返回的对象为Bean。 |
| --- | --- |
| 应用场景 | 标记一个方法返回的对象为Bean。 |
| 优势与局限 | 优势:方便管理Bean的创建和配置。局限:需要编写大量的配置代码。 |
| 实际案例 | 定义一个数据库连接池的Bean。 |

### 🎉 @Conditional

@Conditional是Spring框架的条件注解,用于根据条件判断是否创建Bean。它允许在创建Bean时根据特定的条件进行判断,从而实现灵活的配置。

| 技术原理 | @Conditional是Spring框架的条件注解,用于根据条件判断是否创建Bean。 |
| --- | --- |
| 应用场景 | 根据条件判断是否创建Bean。 |
| 优势与局限 | 优势:灵活性强。局限:需要编写大量的条件判断代码。 |
| 实际案例 | 根据操作系统创建不同的Bean。 |

### 🎉 @ConditionalOnClass

@ConditionalOnClass是Spring框架的条件注解,用于判断类是否存在于类路径中。它可以根据类路径中是否存在特定的类来决定是否创建Bean。

| 技术原理 | @ConditionalOnClass是Spring框架的条件注解,用于判断类是否存在于类路径中。 |
| --- | --- |
| 应用场景 | 判断类是否存在于类路径中。 |
| 优势与局限 | 优势:方便管理类路径。局限:需要编写大量的条件判断代码。 |
| 实际案例 | 判断MySQL驱动类是否存在于类路径中。 |

### 🎉 @ConditionalOnMissingBean

@ConditionalOnMissingBean是Spring框架的条件注解,用于判断Bean是否已存在。它可以根据Bean的存在性来决定是否创建新的Bean。

| 技术原理 | @ConditionalOnMissingBean是Spring框架的条件注解,用于判断Bean是否已存在。 |
| --- | --- |
| 应用场景 | 判断Bean是否已存在。 |
| 优势与局限 | 优势:方便管理Bean的创建。局限:需要编写大量的条件判断代码。 |
| 实际案例 | 判断数据库连接池的Bean是否已存在。 |

### 🎉 @ConditionalOnProperty

@ConditionalOnProperty是Spring框架的条件注解,用于判断属性值是否满足条件。它可以根据属性值是否满足特定的条件来决定是否创建Bean。

| 技术原理 | @ConditionalOnProperty是Spring框架的条件注解,用于判断属性值是否满足条件。 |
| --- | --- |
| 应用场景 | 判断属性值是否满足条件。 |
| 优势与局限 | 优势:方便管理属性值。局限:需要编写大量的条件判断代码。 |
| 实际案例 | 判断数据库连接的属性值是否满足条件。 |

### 🎉 @ConditionalOnResource

@ConditionalOnResource是Spring框架的条件注解,用于判断资源文件是否存在。它可以根据资源文件的存在性来决定是否创建Bean。

| 技术原理 | @ConditionalOnResource是Spring框架的条件注解,用于判断资源文件是否存在。 |
| --- | --- |
| 应用场景 | 判断资源文件是否存在。 |
| 优势与局限 | 优势:方便管理资源文件。局限:需要编写大量的条件判断代码。 |
| 实际案例 | 判断数据库配置文件是否存在。 |

### 🎉 @ConditionalOnExpression

@ConditionalOnExpression是Spring框架的条件注解,用于判断表达式是否为true。它可以根据表达式的结果来决定是否创建Bean。

| 技术原理 | @ConditionalOnExpression是Spring框架的条件注解,用于判断表达式是否为true。 |
| --- | --- |
| 应用场景 | 判断表达式是否为true。 |
| 优势与局限 | 优势:灵活性强。局限:需要编写大量的表达式。 |
| 实际案例 | 判断操作系统是否为Linux。 |

## 🍊 自动配置属性

### 🎉 application.properties

application.properties是SpringBoot的配置文件,用于配置应用程序的属性。它支持多种属性格式,如key=value、key[:prefix]=value等。

| 技术原理 | application.properties是SpringBoot的配置文件,用于配置应用程序的属性。 |
| --- | --- |
| 应用场景 | 配置应用程序的属性。 |
| 优势与局限 | 优势:方便管理应用程序的属性。局限:需要编写大量的配置代码。 |
| 实际案例 | 配置数据库连接的属性。 |

### 🎉 application.yml

application.yml是SpringBoot的配置文件,用于配置应用程序的属性。它支持多种数据结构,如键值对、列表、嵌套对象等。

| 技术原理 | application.yml是SpringBoot的配置文件,用于配置应用程序的属性。 |
| --- | --- |
| 应用场景 | 配置应用程序的属性。 |
| 优势与局限 | 优势:方便管理应用程序的属性。局限:需要编写大量的配置代码。 |
| 实际案例 | 配置数据库连接的属性。 |

## 🍊 自动配置示例

### 🎉 SpringBoot Starter

SpringBoot Starter是SpringBoot的启动器,用于简化SpringBoot应用程序的配置。它将常用的依赖关系和配置整合到一个模块中,方便开发者快速启动和配置应用程序。

| 技术原理 | SpringBoot Starter是SpringBoot的启动器,用于简化SpringBoot应用程序的配置。 |
| --- | --- |
| 应用场景 | 简化SpringBoot应用程序的配置。 |
| 优势与局限 | 优势:方便管理SpringBoot应用程序的配置。局限:需要依赖Starter。 |
| 实际案例 | 使用SpringBoot Starter简化数据库连接的配置。 |

### 🎉 Starter POM

Starter POM是SpringBoot Starter的配置文件,用于定义Starter的依赖关系。它包含了Starter所依赖的库和配置信息。

| 技术原理 | Starter POM是SpringBoot Starter的配置文件,用于定义Starter的依赖关系。 |
| --- | --- |
| 应用场景 | 定义Starter的依赖关系。 |
| 优势与局限 | 优势:方便管理Starter的依赖关系。局限:需要编写大量的配置代码。 |
| 实际案例 | 定义数据库连接池的依赖关系。 |

### 🎉 Starter 配置

Starter 配置是SpringBoot Starter的配置文件,用于配置Starter的属性。它包含了Starter的配置信息,如数据库连接的URL、用户名、密码等。

| 技术原理 | Starter 配置是SpringBoot Starter的配置文件,用于配置Starter的属性。 |
| --- | --- |
| 应用场景 | 配置Starter的属性。 |
| 优势与局限 | 优势:方便管理Starter的属性。局限:需要编写大量的配置代码。 |
| 实际案例 | 配置数据库连接池的属性。 |

### 🎉 Starter 自动配置类

Starter 自动配置类是SpringBoot Starter的自动配置类,用于自动配置Starter的属性。它包含了自动配置的逻辑,可以根据条件自动配置Starter的属性。

| 技术原理 | Starter 自动配置类是SpringBoot Starter的自动配置类,用于自动配置Starter的属性。 |
| --- | --- |
| 应用场景 | 自动配置Starter的属性。 |
| 优势与局限 | 优势:方便管理Starter的属性。局限:需要编写大量的自动配置类。 |
| 实际案例 | 自动配置数据库连接池的属性。 |

### 🎉 Starter 自动配置属性

Starter 自动配置属性是SpringBoot Starter的自动配置属性,用于自动配置Starter的属性。它包含了自动配置的属性信息,可以根据条件自动配置Starter的属性。

| 技术原理 | Starter 自动配置属性是SpringBoot Starter的自动配置属性,用于自动配置Starter的属性。 |
| --- | --- |
| 应用场景 | 自动配置Starter的属性。 |
| 优势与局限 | 优势:方便管理Starter的属性。局限:需要编写大量的自动配置属性。 |
| 实际案例 | 自动配置数据库连接池的属性。 |

### 🎉 Starter 自动配置条件

Starter 自动配置条件是SpringBoot Starter的自动配置条件,用于根据条件自动配置Starter的属性。它可以根据条件自动配置Starter的属性,从而实现灵活的配置。

| 技术原理 | Starter 自动配置条件是SpringBoot Starter的自动配置条件,用于根据条件自动配置Starter的属性。 |
| --- | --- |
| 应用场景 | 根据条件自动配置Starter的属性。 |
| 优势与局限 | 优势:灵活性强。局限:需要编写大量的自动配置条件。 |
| 实际案例 | 根据操作系统自动配置数据库连接池的属性。 |

### 🎉 Starter 自动配置示例代码

```java
@Configuration
@ConditionalOnClass({DataSource.class})
public class DataSourceConfig {

    @Bean
    public DataSource dataSource() {
        // 创建并配置数据源
        return new DataSource();
    }
}
```# SpringBoot核心知识点

## 🍊 外部化配置

### 🎉 配置文件类型

SpringBoot支持多种配置文件类型,以下是对几种常见类型的详细介绍:

- **Properties**:支持基本数据类型,如int、float、boolean等,以及字符串类型。其读取速度快,易于阅读和维护,是SpringBoot默认的配置文件类型。
- **YAML**:支持复杂的数据结构,如列表、映射等,格式简洁。虽然读取速度较慢,但易于阅读和维护,是SpringBoot推荐的配置文件类型。
- **JSON**:支持复杂的数据结构,如列表、映射等,格式简洁。读取速度快,易于阅读和维护,但不是SpringBoot推荐类型,可应用于配置文件。

### 🎉 配置文件位置

配置文件的位置也是外部化配置的一个重要方面,以下是一些常见的配置文件位置:

- **classpath:/config/**:从类路径下加载配置文件,便于管理和部署。
- **classpath:/application/**:同样从类路径下加载配置文件,但可用于自定义配置文件位置。
- **file:/path/to/config/**:从指定文件路径加载配置文件,适用于加载外部配置文件。

### 🎉 配置文件优先级

配置文件的优先级决定了配置信息的覆盖顺序,以下是一些常见的配置文件优先级:

- **启动参数**:通过命令行参数传递配置信息,便于快速调整配置,但不易于维护。
- **系统环境变量**:通过系统环境变量传递配置信息,便于跨平台部署,但不易于维护。
- **配置文件**:通过配置文件传递配置信息,便于维护,易于阅读,是SpringBoot推荐的配置方式。

### 🎉 配置文件占位符

配置文件占位符用于读取配置文件中的值,以下是一些常见的占位符:

- **${}**:使用占位符读取配置文件中的值,便于动态读取配置信息,但需注意性能影响。
- **@PropertySource**:通过注解指定配置文件位置,便于动态加载配置文件,但需注意性能影响。

### 🎉 配置文件绑定

配置文件绑定将配置文件中的属性绑定到Java对象上,以下是一些常见的配置文件绑定方式:

- **@ConfigurationProperties**:将配置文件中的属性绑定到Java对象上,便于自动注入配置信息,但需注意性能影响。
- **@Value**:将配置文件中的值注入到Java对象中,便于手动注入配置信息,但需注意性能影响。

### 🎉 配置文件属性覆盖

配置文件属性覆盖允许通过不同的方式覆盖配置信息,以下是一些常见的配置文件属性覆盖方式:

- **配置文件优先级**:通过配置文件优先级覆盖配置信息,便于调整配置,但需注意配置冲突。
- **启动参数**:通过启动参数覆盖配置信息,便于快速调整配置,但不易于维护。

### 🎉 配置文件动态更新

配置文件动态更新允许在应用程序运行时更新配置信息,以下是一些常见的配置文件动态更新方式:

- **Spring Cloud Config**:通过配置中心动态更新配置信息,便于集中管理配置,但需注意性能影响。
- **Spring Cloud Bus**:通过消息总线动态更新配置信息,便于实时更新配置,但需注意性能影响。

### 🎉 配置文件加密

配置文件加密用于保护敏感信息,以下是一些常见的配置文件加密方式:

- **Jasypt**:使用Jasypt对配置文件进行加密和解密,便于保护敏感信息,但需注意性能影响。

### 🎉 配置文件版本控制

配置文件版本控制用于管理配置文件版本,以下是一些常见的配置文件版本控制方式:

- **Git**:使用Git进行配置文件版本控制,便于管理配置文件版本,但需注意性能影响。

## 🍊 同类型技术对比

以下是对SpringBoot外部化配置中涉及的一些同类型技术的对比:

### 🎉 Apache Commons Configuration

- **技术原理**:支持多种配置文件类型,如properties、xml等。
- **应用场景**:可用于配置文件管理。
- **优势与局限**:读取速度快,易于阅读和维护。
- **实际案例**:无。

### 🎉 Java Properties

- **技术原理**:支持基本数据类型,如int、float、boolean等,以及字符串类型。
- **应用场景**:可用于配置文件管理。
- **优势与局限**:读取速度快,易于阅读和维护。
- **实际案例**:无。

### 🎉 Java System Properties

- **技术原理**:通过系统环境变量传递配置信息。
- **应用场景**:可用于在不同环境中传递配置信息。
- **优势与局限**:便于跨平台部署,但不易于维护。
- **实际案例**:无。

### 🎉 Spring Cloud Config

- **技术原理**:支持多种配置文件类型,如properties、yaml等。
- **应用场景**:可用于配置中心管理。
- **优势与局限**:便于集中管理配置,但需注意性能影响。
- **实际案例**:无。

### 🎉 Spring Cloud Bus

- **技术原理**:支持多种配置文件类型,如properties、yaml等。
- **应用场景**:可用于实时更新配置。
- **优势与局限**:便于实时更新配置,但需注意性能影响。
- **实际案例**:无。

### 🎉 Jasypt

- **技术原理**:使用Jasypt对配置文件进行加密和解密。
- **应用场景**:可用于加密配置文件中的敏感信息。
- **优势与局限**:便于保护敏感信息,但需注意性能影响。
- **实际案例**:无。

### 🎉 Git

- **技术原理**:使用Git进行配置文件版本控制。
- **应用场景**:可用于管理配置文件版本。
- **优势与局限**:便于管理配置文件版本,但需注意性能影响。
- **实际案例**:无。

优快云

博主分享

📥博主的人生感悟和目标

Java程序员廖志伟

📙经过多年在优快云创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续出版。

面试备战资料

八股文备战
场景描述链接
时间充裕(25万字)Java知识点大全(高频面试题)Java知识点大全
时间紧急(15万字)Java高级开发高频面试题Java高级开发高频面试题

理论知识专题(图文并茂,字数过万)

技术栈链接
RocketMQRocketMQ详解
KafkaKafka详解
RabbitMQRabbitMQ详解
MongoDBMongoDB详解
ElasticSearchElasticSearch详解
ZookeeperZookeeper详解
RedisRedis详解
MySQLMySQL详解
JVMJVM详解

集群部署(图文并茂,字数过万)

技术栈部署架构链接
MySQL使用Docker-Compose部署MySQL一主二从半同步复制高可用MHA集群Docker-Compose部署教程
Redis三主三从集群(三种方式部署/18个节点的Redis Cluster模式)三种部署方式教程
RocketMQDLedger高可用集群(9节点)部署指南
Nacos+Nginx集群+负载均衡(9节点)Docker部署方案
Kubernetes容器编排安装最全安装教程

开源项目分享

项目名称链接地址
高并发红包雨项目https://gitee.com/java_wxid/red-packet-rain
微服务技术集成demo项目https://gitee.com/java_wxid/java_wxid

管理经验

【公司管理与研发流程优化】针对研发流程、需求管理、沟通协作、文档建设、绩效考核等问题的综合解决方案:https://download.youkuaiyun.com/download/java_wxid/91148718

希望各位读者朋友能够多多支持!

现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!

🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~

【Koopman】遍历论、动态模态分解和库普曼算子谱特性的计算研究(Matlab代码实现)内容概要:本文围绕【Koopman】遍历论、动态模态分解和库普曼算子谱特性的计算研究展开,重点介绍基于Matlab的代码实现方法。文章系统阐述了遍历理论的基本概念、动态模态分解(DMD)的数学原理及其库普曼算子谱特性之间的内在联系,展示了如何通过数值计算手段分析非线性动力系统的演化行为。文中提供了完整的Matlab代码示例,涵盖数据驱动的模态分解、谱分析及可视化过程,帮助读者理解并复现相关算法。同时,文档还列举了多个相关的科研方向和技术应用场景,体现出该方法在复杂系统建模分析中的广泛适用性。; 适合人群:具备一定动力系统、线性代数数值分析基础,熟悉Matlab编程,从事控制理论、流体力学、信号处理或数据驱动建模等领域研究的研究生、博士生及科研人员。; 使用场景及目标:①深入理解库普曼算子理论及其在非线性系统分析中的应用;②掌握动态模态分解(DMD)算法的实现优化;③应用于流体动力学、气候建模、生物系统、电力系统等领域的时空模态提取预测;④支撑高水平论文复现科研项目开发。; 阅读建议:建议读者结合Matlab代码逐段调试运行,对照理论推导加深理解;推荐参考文中提及的相关研究方向拓展应用场景;鼓励在实际数据上验证算法性能,并尝试改进扩展算法功能。
本系统采用微信小程序作为前端交互界面,结合Spring BootVue.js框架实现后端服务及管理后台的构建,形成一套完整的电子商务解决方案。该系统架构支持单一商户独立运营,亦兼容多商户入驻的平台模式,具备高度的灵活性扩展性。 在技术实现上,后端以Java语言为核心,依托Spring Boot框架提供稳定的业务逻辑处理数据接口服务;管理后台采用Vue.js进行开发,实现了直观高效的操作界面;前端微信小程序则为用户提供了便捷的移动端购物体验。整套系统各模块间紧密协作,功能链路完整闭环,已通过严格测试优化,符合商业应用的标准要求。 系统设计注重业务场景的全面覆盖,不仅包含商品展示、交易流程、订单处理等核心电商功能,还集成了会员管理、营销工具、数据统计等辅助模块,能够满足不同规模商户的日常运营需求。其多店铺支持机制允许平台方对入驻商户进行统一管理,同时保障各店铺在品牌展示、商品销售及客户服务方面的独立运作空间。 该解决方案强调代码结构的规范性可维护性,遵循企业级开发标准,确保了系统的长期稳定运行后续功能迭代的可行性。整体而言,这是一套技术选型成熟、架构清晰、功能完备且可直接投入商用的电商平台系统。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值