📕我是廖志伟,一名Java开发工程师、《Java项目实战——深入理解大型互联网企业通用技术》(基础篇)、(进阶篇)、(架构篇)、《解密程序员的思维密码——沟通、演讲、思考的实践》作者、清华大学出版社签约作家、Java领域优质创作者、优快云博客专家、阿里云专家博主、51CTO专家博主、产品软文专业写手、技术文章评审老师、技术类问卷调查设计师、幕后大佬社区创始人、开源项目贡献者。
📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、SpringMVC、SpringCloud、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RocketMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。
📙不定期分享高并发、高可用、高性能、微服务、分布式、海量数据、性能调优、云原生、项目管理、产品思维、技术选型、架构设计、求职面试、副业思维、个人成长等内容。

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

🌟 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 GC | SpringBoot默认的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。具体实现如下:
- SpringFactoriesLoader加载所有jar包中的META-INF/spring.factories文件。
- 根据项目依赖的jar包,筛选出对应的自动配置类。
- 将筛选出的自动配置类注册到Spring应用上下文中。
🎉 2.3. @EnableAutoConfiguration的依赖注入
@EnableAutoConfiguration注解通过Spring的自动配置机制,将自动配置类注入到Spring应用上下文中。具体实现如下:
- SpringFactoriesLoader加载所有jar包中的META-INF/spring.factories文件。
- 根据项目依赖的jar包,筛选出对应的自动配置类。
- 将筛选出的自动配置类注册到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的加载过程如下:
- 获取所有jar包的路径。
- 遍历所有jar包,查找META-INF/spring.factories文件。
- 解析文件内容,获取所有自动配置类。
- 将自动配置类注册到Spring应用上下文中。
🎉 3.3. SpringFactoriesLoader的配置文件
SpringFactoriesLoader的配置文件位于jar包的META-INF/spring.factories文件中,格式如下:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.autoconfigure.MyAutoConfiguration
🍊 4. SpringBoot的自动配置原理
🎉 4.1. 自动配置的触发条件
SpringBoot的自动配置触发条件如下:
- 项目依赖了SpringBoot的启动器。
- 项目中使用了@EnableAutoConfiguration注解。
🎉 4.2. 自动配置的匹配规则
自动配置的匹配规则如下:
- 根据项目依赖的jar包,筛选出对应的自动配置类。
- 根据自动配置类的条件判断,确定是否启用该自动配置类。
🎉 4.3. 自动配置的生效过程
自动配置的生效过程如下:
- SpringFactoriesLoader加载所有jar包中的META-INF/spring.factories文件。
- 根据项目依赖的jar包,筛选出对应的自动配置类。
- 将筛选出的自动配置类注册到Spring应用上下文中。
- 自动配置类根据条件判断,自动配置相应的Bean。
🍊 5. SpringBoot的自动配置类
🎉 5.1. 自动配置类的定义
自动配置类是SpringBoot自动配置的核心,它负责根据项目依赖的jar包自动配置相应的Bean。以下是自动配置类的定义:
@Configuration
@ConditionalOnClass(XXX.class)
@ConditionalOnMissingBean(XXX.class)
public class MyAutoConfiguration {
// ...
}
🎉 5.2. 自动配置类的实现方式
自动配置类的实现方式如下:
- 使用@Configuration注解定义自动配置类。
- 使用@ConditionalOnClass、@ConditionalOnMissingBean等注解,根据项目依赖的jar包和Bean的存在情况,判断是否启用该自动配置类。
- 在自动配置类中,定义自动配置的Bean。
🎉 5.3. 自动配置类的使用示例
以下是一个简单的自动配置类示例:
@Configuration
@ConditionalOnClass(XXX.class)
@ConditionalOnMissingBean(XXX.class)
public class MyAutoConfiguration {
@Bean
public XXX myBean() {
return new XXX();
}
}
🍊 6. SpringBoot的自动配置属性
🎉 6.1. 自动配置属性的来源
自动配置属性的来源如下:
- SpringBoot的配置文件(application.properties、application.yml)。
- 系统环境变量。
- 命令行参数。
🎉 6.2. 自动配置属性的配置方式
自动配置属性的配置方式如下:
- 在SpringBoot的配置文件中,使用key-value形式配置属性。
- 使用系统环境变量配置属性。
- 使用命令行参数配置属性。
🎉 6.3. 自动配置属性的优先级
自动配置属性的优先级如下:
- 命令行参数 > 系统环境变量 > 配置文件
🍊 7. SpringBoot的自动配置排除
🎉 7.1. 自动配置排除的机制
SpringBoot的自动配置排除机制如下:
- 使用@ConditionalOnClass、@ConditionalOnMissingBean等注解,根据项目依赖的jar包和Bean的存在情况,判断是否排除该自动配置类。
- 在自动配置类中,使用@ConditionalOnClass、@ConditionalOnMissingBean等注解,根据项目依赖的jar包和Bean的存在情况,判断是否排除该自动配置类。
🎉 7.2. 自动配置排除的配置方式
自动配置排除的配置方式如下:
- 在自动配置类中,使用@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的自动配置扩展原理如下:
- 在SpringBoot的配置文件中,定义自定义属性。
- 创建自定义的自动配置类,根据自定义属性自动配置相应的Bean。
🎉 8.2. 自动配置扩展的实现方式
自动配置扩展的实现方式如下:
- 在SpringBoot的配置文件中,定义自定义属性。
- 创建自定义的自动配置类,使用@Value注解注入自定义属性。
- 在自定义的自动配置类中,根据自定义属性自动配置相应的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项目实战—深入理解大型互联网企业通用技术》基础篇的购书链接:https://item.jd.com/14152451.html
- 《Java项目实战—深入理解大型互联网企业通用技术》基础篇繁体字的购书链接:http://product.dangdang.com/11821397208.html
- 《Java项目实战—深入理解大型互联网企业通用技术》进阶篇的购书链接:https://item.jd.com/14616418.html
- 《Java项目实战—深入理解大型互联网企业通用技术》架构篇待上架
- 《解密程序员的思维密码--沟通、演讲、思考的实践》购书链接:https://item.jd.com/15096040.html
面试备战资料
八股文备战
| 场景 | 描述 | 链接 |
|---|---|---|
| 时间充裕(25万字) | Java知识点大全(高频面试题) | Java知识点大全 |
| 时间紧急(15万字) | Java高级开发高频面试题 | Java高级开发高频面试题 |
理论知识专题(图文并茂,字数过万)
| 技术栈 | 链接 |
|---|---|
| RocketMQ | RocketMQ详解 |
| Kafka | Kafka详解 |
| RabbitMQ | RabbitMQ详解 |
| MongoDB | MongoDB详解 |
| ElasticSearch | ElasticSearch详解 |
| Zookeeper | Zookeeper详解 |
| Redis | Redis详解 |
| MySQL | MySQL详解 |
| JVM | JVM详解 |
集群部署(图文并茂,字数过万)
| 技术栈 | 部署架构 | 链接 |
|---|---|---|
| MySQL | 使用Docker-Compose部署MySQL一主二从半同步复制高可用MHA集群 | Docker-Compose部署教程 |
| Redis | 三主三从集群(三种方式部署/18个节点的Redis Cluster模式) | 三种部署方式教程 |
| RocketMQ | DLedger高可用集群(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
希望各位读者朋友能够多多支持!
现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!
- 💂 博客主页: Java程序员廖志伟
- 👉 开源项目:Java程序员廖志伟
- 🌥 哔哩哔哩:Java程序员廖志伟
- 🎏 个人社区:Java程序员廖志伟
- 🔖 个人微信号:
SeniorRD
🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~
1203

被折叠的 条评论
为什么被折叠?



