目录
SpringBoot优缺点
优点:
快速开发:通过自动配置和大量开箱即用功能,让开发者可以快速启动和运行一个应用程序,无需进行繁琐的配置工作。
独立运行:SpringBoot应用可以打包成独立的JAR文件,内嵌Web容器,使得应用可以通过java -jar命令直接运行,无需外部服务器。
生产级功能:SpringBoot提供一系列生产级功能,如监控、健康检查、外部化配置、指标收集、日志管理,帮助开发者更好管理和监控应用。
微服务与云原生支持:天然适配SpringCloud生态(服务发现、配置中心、负载均衡等),支持容器化部署(Docker、Kubernetes)和无服务器架构(Serverless)。
丰富的插件生态:拥有庞大的社区支持和生态系统,开发者可以方便地找到文档、教程、插件和第三方库
缺点:
依赖版本冲突:起步依赖管理大量第三方库,若手动引入不兼容版本可能会导致冲突。
自动配置的局限性:自动配置的“黑盒”特性可能导致调试困难。
应用体积与启动时间:嵌入式服务器和依赖会导致JAR包体积增大,并且首次启动时间会较长,在开发环境频繁重启时会影响效率。
过度依赖自动配置:过度依赖SpringBoot的自动配置可能会导致开发者对底层细节缺乏了解,从而在需要深入定制和优化时遇到困难。
SpringBoot自动配置原理
自动配置核心原理
1.基于条件的配置
- 核心思想:根据类路径中的依赖、配置属性或 Bean 的存在情况,动态决定是否加载特定配置。
- 关键注解:
@ConditionalOnClass
:当类路径中存在指定类时生效。@ConditionalOnMissingBean
:当容器中不存在指定 Bean 时生效。@ConditionalOnProperty
:当配置属性满足指定条件时生效。@ConditionalOnWebApplication
:在 Web 应用环境中生效。
2.自动配置的触发点
@SpringBootApplication
注解是启动自动配置的核心
@SpringBootApplication
包含三个关键注解:@EnableAutoConfiguration
:启用自动配置机制。@ComponentScan
:扫描@Component
、@Service
等组件。@Configuration
:允许在类中定义 Bean。
自动配置的工作流程
- 启动触发:
@SpringBootApplication
启用自动配置。 - 加载配置类:通过
spring.factories
加载候选配置类。 - 条件过滤:根据
@Conditional
注解筛选符合条件的配置类。 - 属性绑定:将外部配置(如
application.properties
)绑定到配置类。 - Bean 注册:将符合条件的配置类中的 Bean 注册到容器。
SpringBoot配置文件注入
Spring Boot 按以下顺序加载配置(后加载的覆盖先加载的):
- 默认属性:通过
SpringApplication.setDefaultProperties
设置。 - 配置文件:
application.properties
、application.yml
。 - 多环境配置文件:
application-{profile}.properties/yml
。 - @PropertySource:自定义配置文件。
- 命令行参数。
- JNDI 属性:来自
java:comp/env
。 - 环境变量。
- 测试配置:
@TestPropertySource
。
SpringBoot的profile加载
在 Spring Boot 中,Profile 是一种强大的机制,用于在不同环境(如开发、测试、生产)中加载特定的配置。通过 Profile,开发者可以轻松切换不同环境的配置,而无需修改代码。
什么是 Profile?
- Profile 是 Spring 框架提供的一种机制,用于根据环境(如
dev
、test
、prod
)加载不同的配置。 - 每个 Profile 可以有独立的配置文件(如
application-dev.properties
)或配置类。
核心用途
- 环境隔离:不同环境使用不同的数据库、服务器端口等配置。
- 安全管理:生产环境的敏感信息(如密码、密钥)与开发环境分离。
- 功能开关:在测试环境启用某些特性,生产环境禁用。
激活 Profile 的方式
1. 配置文件中指定
# application.properties
spring.profiles.active=dev
2. 命令行参数
java -jar myapp.jar --spring.profiles.active=prod
3. 环境变量
# Linux/macOS
export SPRING_PROFILES_ACTIVE=dev
# Windows
set SPRING_PROFILES_ACTIVE=dev
4. IDE 启动配置
在 IDE 的运行配置中添加--spring.profiles.active=test
。
5. 代码中动态设置
@SpringBootApplication
public class MyApp {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(MyApp.class);
app.setAdditionalProfiles("dev"); // 激活dev profile
app.run(args);
}
}
@Profile 注解与条件配置
1. Bean 级别的 Profile 控制
@Configuration
public class AppConfig {
@Bean
@Profile("dev") // 仅在dev profile激活时创建
public DataSource devDataSource() {
return DataSourceBuilder.create()
.url("jdbc:mysql://localhost:3306/dev_db")
.build();
}
@Bean
@Profile("prod") // 仅在prod profile激活时创建
public DataSource prodDataSource() {
return DataSourceBuilder.create()
.url("jdbc:mysql://prod-server:3306/prod_db")
.build();
}
}
2. 类级别的 Profile 控制
@Configuration
@Profile("!test") // 非test环境加载
public class ProductionConfig {
// ...
}
3. 组合 Profile
@Profile({"dev", "qa"}) // 同时支持dev和qa环境
public class DevQaConfig {
// ...
}
SpringBoot项目内部配置文件加载顺序
外部配置 > 内部配置
(命令行参数 > 环境变量 > 配置文件)特定 Profile > 通用配置
(application-prod.properties
>application.properties
)后加载的配置 > 先加载的配置
(如/config
目录 > 资源目录,YAML 中靠后的文档 > 靠前的文档)
SpringBoot日志关系
1. 日志抽象层
- SLF4J(Simple Logging Facade for Java)
Spring Boot 默认使用的日志门面,提供统一的日志 API(如LoggerFactory.getLogger()
),不负责具体实现。
2. 日志实现层
- Logback
Spring Boot 默认的日志实现,与 SLF4J 无缝集成,配置灵活(支持 XML/Groovy)。 - Log4j2
高性能日志框架,支持异步日志、JSON 格式输出,需手动引入依赖。
Spring Boot 默认使用 Logback 作为日志实现,并且提供了一个默认的配置文件logback-spring.xml
。如果你没有提供自定义的配置文件,Spring Boot 会使用默认的配置。可以通过application.properties
或application.yml
文件来配置日志级别和日志输出格式。
如果你需要更复杂的日志配置,可以创建一个logback-spring.xml
文件,并将其放在src/main/resources
目录下。Spring Boot 会自动加载该配置文件。
Springboot热部署
在 Spring Boot 中实现热部署主要有两种主流方案:使用内置的 DevTools 和集成 JRebel 插件。
DevTools工作原理
- DevTools 使用两个类加载器:基础类加载器(加载不变的类如 Spring 框架类)和重启类加载器(加载应用代码)。
- 当监测到类路径变化时,重启类加载器会被重新加载,实现快速重启(通常 1-2 秒)。
启用 JRebel 热部署
- 在 IDE 中启动应用时,选择
Run with JRebel
。 - 修改代码后,JRebel 会自动将变更推送到运行中的 JVM,无需重启。
SpringBoot的监控
Spring Boot 监控体系通过 Actuator 提供基础能力,结合第三方工具(如 Prometheus、Grafana、ELK)构建完整的监控链路。建议根据项目规模和需求选择合适的工具组合,并遵循以下原则:
- 最小化监控成本:避免采集无用指标。
- 关注业务指标:如转化率、响应时间、错误率。
- 自动化告警:及时发现并响应系统异常。
- 持续优化:根据监控数据调整系统参数和架构。