配置文件(application.properties/application.yaml)放置位置
配置文件常见位置
- 外部配置文件路径
- 位于应用运行目录下的config/子目录
./config/application.properties
./config/application.yml
- 位于应用运行目录的根目录:
./application.properties
./application.yml
- 类路径中的配置文件:
- classpath:/config/ 下:
classpath:/config/application.properties
classpath:/config/application.yml
- classpath:/ 下(默认位置):
classpath:/application.properties
classpath:/application.yml
配置文件加载优先级
- 外部配置文件路径优先
- 类路径中的配置文件次之
- 靠前位置的配置会覆盖靠后位置的配置。
- 如果多个文件中存在相同的属性值,最终取决于优先级较高的配置文件。
文件搜索逻辑
Spring Boot 会自动搜索并加载这些配置文件,无需手动指定。对于文件的具体搜索逻辑,Spring Boot 使用 ConfigFileApplicationListener 来处理。
多环境支持
- application-{profile}.properties
为了支持多环境配置,Spring Boot 提供了 application-{profile}.properties 或 application-{profile}.yml 文件的机制。 - 激活环境
在 application.properties 中设置:spring.profiles.active=dev
- 通过 JVM 参数激活:
java -jar myapp.jar --spring.profiles.active=prod
SpringBoot自动配置原理
能自动配置的基础
Spring Boot 的自动配置是基于以下机制实现的:
- 依赖管理:通过引入 spring-boot-starter 模块,带来了预设的依赖和配置。
- Spring 的 @Configuration 注解:定义 Bean 和配置类。
- Spring 的条件装配(@Conditional):根据运行时条件动态决定是否加载某些配置。
- SPI机制(Service Provider Interface):借助 spring.factories 文件实现组件的自动加载
自动配置的核心注解:@EnableAutoConfiguration
- @EnableAutoConfiguration 是自动配置的核心,它被 @SpringBootApplication 注解间接包含
- 作用:扫描并加载所有符合条件的配置类,自动为应用注册所需的 Bean。
实现路径:
@EnableAutoConfiguration 的实现依赖于 spring.factories 文件
META-INF/spring.factories
- 该文件中列出了所有的自动配置类:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\ org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\ org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ ...
自动配置的加载流程
启动时加载 spring.factories 中的配置类
- SpringFactoriesLoader 会扫描 META-INF/spring.factories 文件,获取所有的自动配置类。
- 这些配置类通常带有 @ConditionalOn... 条件注解
基于条件的装配:
- 自动配置类通过 @Conditional 系列注解判断是否生效:
实际装配 Bean:
- 如果条件满足,自动配置类中的 Bean 定义会被加载到 Spring 容器中。
核心自动配置类示例
- 数据源自动配置
Spring Boot 提供 DataSourceAutoConfiguration 来实现数据源的自动配置。
路径:
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
代码:
@Configuration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({DataSourceConfiguration.class})
public class DataSourceAutoConfiguration {
}
@ConditionalOnClass:类路径中存在 DataSource 类时自动配置。
@EnableConfigurationProperties:绑定外部配置(如 application.properties 中的 spring.datasource.*)到 DataSourceProperties。
@Import:引入具体的配置实现
- Web 应用自动配置
Spring Boot 提供 WebMvcAutoConfiguration 进行 Web 应用相关的配置。
路径:
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration
代码:
@Configuration
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({Servlet.class, DispatcherServlet.class})
@EnableConfigurationProperties(WebMvcProperties.class)
public class WebMvcAutoConfiguration {
}
@ConditionalOnWebApplication:仅在 Web 应用中生效。
@ConditionalOnClass:类路径中有 DispatcherServlet 时加载。
自动配置的覆盖与排除
自定义配置文件中的属性可以覆盖自动配置的默认值。例如:
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=secret
排除自动配置
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class MyApplication {
}
应用场景:需要自定义配置而不希望加载某些自动配置类。
自动配置调试工具
Spring Boot 提供工具来调试和检查自动配置的行为:
1. @Conditional 条件报告
启动时,控制台会打印哪些自动配置类生效或未生效的原因。
2. Actuator 的 autoconfig
启用 Actuator 并访问 /actuator/conditions,查看详细的自动配置报告。
SpringBoot的热部署方式
Spring-boot-devtools
Spring Loaded
Jrebel
模板热部署
boostrap.yml和application.yml的区别
加载顺序
Spring Boot 在启动时会按照顺序加载配置文件
- bootstrap会优先加载
- application.properties之后加载
bootstrap.properties
通常用于框架级别的配置,而非业务逻辑配置。它的典型用途包括:
Spring Cloud Config
- 当使用 Spring Cloud Config 时,bootstrap.properties 会指定从配置中心加载配置所需的元信息
服务发现
- 在使用服务注册中心(如 Eureka、Consul)时,可以在 bootstrap.properties 中定义相关配置。
加载优先级高的配置
- 一些初始化时需要的配置必须在 application.properties 之前加载,比如加密/解密密钥、环境变量等
application.properties
application.properties 是 Spring Boot 的主配置文件,它用于定义应用运行时所需的各种属性,包括
- 数据源配置
- 服务器配置
- 日志配置
- 自定义配置
- 不同环境的配置
总结
- bootstrap.properties:负责应用启动前的配置,通常涉及 Spring Cloud、服务注册和配置中心。
- application.properties:是主要的配置文件,负责定义大多数业务逻辑相关的属性。
开启SpringBoot特性的几种方式
方式 | 适用场景 |
---|---|
@SpringBootApplication | 标准入口,默认开启所有核心特性。 |
@EnableAutoConfiguration | 更精细化控制自动配置的启用或禁用。 |
SpringApplication类 | 自定义启动行为(如禁用命令行属性、添加监听器等)。 |
配置文件方式 | 配置简单,适合外部化管理。 |
命令行参数 | 临时调整应用配置,适合部署场景。 |
系统属性/环境变量 | 动态控制特性,适合容器化部署。 |
自定义 Starter | 按需加载功能模块,适合微服务或模块化开发。 |
条件注解控制 | 细粒度控制 Bean 的加载,适用于特定场景需求。 |
Spring Boot Actuator | 启用运行时监控和管理功能,适合生产环境。 |
获得Bean装配报告信息
使用 actuator 的 beans 端点
- Spring Boot Actuator 提供了一个专门的端点 beans,可以用来查看应用上下文中的所有 Bean 信息。
使用 ApplicationContext 的方法
- 通过编程方式,使用 Spring 的 ApplicationContext 对象获取上下文中所有 Bean 的信息。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
@Component
public class BeanInfoLogger implements CommandLineRunner {
@Autowired
private ApplicationContext applicationContext;
@Override
public void run(String... args) throws Exception {
String[] beanNames = applicationContext.getBeanDefinitionNames();
System.out.println("Bean definitions in the application context:");
for (String beanName : beanNames) {
System.out.println(beanName + " -> " + applicationContext.getBean(beanName).getClass().getName());
}
}
}
- 使用 ConditionEvaluationReport
Spring Boot 提供了 ConditionEvaluationReport 类,它包含所有自动配置的条件评估结果,可以帮助开发者了解哪些配置生效或未生效。 - 使用 debug 模式
启动日志中会显示每个 @Conditional 注解的匹配结果及 Bean 的装配状态。
针对请求访问的几个组合注解
@RequestMapping
- 最通用的请求映射注解,用于将 HTTP 请求映射到处理方法上。
- 可以通过 method 参数指定具体的 HTTP 请求类型
@RequestMapping(value = "/example", method = RequestMethod.GET)
public String handleRequest() {
return "Handle Request";
}
@GetMapping
- 专门用于处理 HTTP GET 请求
- 等价于 @RequestMapping 并指定 method = RequestMethod.GET
@PostMapping
- 专门用于处理 HTTP POST 请求。
- 等价于 @RequestMapping 并指定 method = RequestMethod.POST
- @DeleteMapping
- @PutMapping
@PatchMapping
- 专门用于处理 HTTP PATCH 请求
- 等价于 @RequestMapping 并指定 method = RequestMethod.PATCH
@CrossOrigin
- 用于启用跨域资源共享 (CORS) 的支持
- 可单独使用,也可与其他注解组合。
SpringBoot异常处理相关注解
在 Spring Boot 中,异常处理是通过注解和机制为不同场景提供统一的异常处理方式。以下是与异常处理相关的主要注解及其作用:
@ExceptionHandler
- 作用:用于在控制器中定义方法,专门处理指定类型的异常。
- 适用范围:仅限于当前类或通过 @ControllerAdvice 全局适用。
@ControllerAdvice
- 作用:定义全局的异常处理逻辑,适用于所有控制器。
- 特点:配合 @ExceptionHandler 使用,将异常处理从控制器中解耦。
@ResponseStatus
- 作用:用于将异常与 HTTP 状态码绑定。
- 特点:抛出异常时,Spring 会返回指定的状态码
@RestControllerAdvice
- 作用:@ControllerAdvice 的扩展,专门为 @RestController 提供异常处理支持
- 自动将返回值作为 JSON 处理。
- @RestControllerAdvice 是一个快捷方式,等效于 @ControllerAdvice + @ResponseBody。
@ResponseBody
- 作用:用于将方法的返回值直接作为 HTTP 响应体。
- 特点:在异常处理方法中,可以结合 @ExceptionHandler 使用。
@Valid 和 @Validated
- 作用:用于验证请求参数,当验证失败时,会抛出 MethodArgumentNotValidException 或 ConstraintViolationException。
- 特点:需配合 @ExceptionHandler 处理相关异常。
@InitBinder
- 作用:用于预处理 Web 请求参数或初始化数据绑定。
- 特点:可以结合异常处理方法进行参数校验。
@JsonComponent
- 作用:用于自定义序列化和反序列化异常信息。
- 特点:常与异常处理结合,用于格式化返回的 JSON。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。