配置文件(application.properties/application.yaml)放置位置

配置文件常见位置

  1. 外部配置文件路径
  • 位于应用运行目录下的config/子目录
./config/application.properties
./config/application.yml
  • 位于应用运行目录的根目录:
./application.properties
./application.yml
  1. 类路径中的配置文件:
  • classpath:/config/ 下:
classpath:/config/application.properties
classpath:/config/application.yml
  • classpath:/ 下(默认位置):
classpath:/application.properties
classpath:/application.yml

配置文件加载优先级

  1. 外部配置文件路径优先
  2. 类路径中的配置文件次之
  3. 靠前位置的配置会覆盖靠后位置的配置。
  4. 如果多个文件中存在相同的属性值,最终取决于优先级较高的配置文件。

文件搜索逻辑

Spring Boot 会自动搜索并加载这些配置文件,无需手动指定。对于文件的具体搜索逻辑,Spring Boot 使用 ConfigFileApplicationListener 来处理。

多环境支持

  1. application-{profile}.properties
    为了支持多环境配置,Spring Boot 提供了 application-{profile}.properties 或 application-{profile}.yml 文件的机制。
  2. 激活环境
    在 application.properties 中设置:
    spring.profiles.active=dev
  3. 通过 JVM 参数激活:
    java -jar myapp.jar --spring.profiles.active=prod

SpringBoot自动配置原理

能自动配置的基础

Spring Boot 的自动配置是基于以下机制实现的:

  1. 依赖管理:通过引入 spring-boot-starter 模块,带来了预设的依赖和配置。
  2. Spring 的 @Configuration 注解:定义 Bean 和配置类。
  3. Spring 的条件装配(@Conditional):根据运行时条件动态决定是否加载某些配置。
  4. 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,\
    ...

自动配置的加载流程

  1. 启动时加载 spring.factories 中的配置类

    • SpringFactoriesLoader 会扫描 META-INF/spring.factories 文件,获取所有的自动配置类。
    • 这些配置类通常带有 @ConditionalOn... 条件注解
  2. 基于条件的装配:

    • 自动配置类通过 @Conditional 系列注解判断是否生效:
  3. 实际装配 Bean:

    • 如果条件满足,自动配置类中的 Bean 定义会被加载到 Spring 容器中。

核心自动配置类示例

  1. 数据源自动配置

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:引入具体的配置实现

  1. 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装配报告信息

  1. 使用 actuator 的 beans 端点

    • Spring Boot Actuator 提供了一个专门的端点 beans,可以用来查看应用上下文中的所有 Bean 信息。
  2. 使用 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());
        }
    }
}
  1. 使用 ConditionEvaluationReport
    Spring Boot 提供了 ConditionEvaluationReport 类,它包含所有自动配置的条件评估结果,可以帮助开发者了解哪些配置生效或未生效。
  2. 使用 debug 模式
    启动日志中会显示每个 @Conditional 注解的匹配结果及 Bean 的装配状态。

针对请求访问的几个组合注解

  1. @RequestMapping

    • 最通用的请求映射注解,用于将 HTTP 请求映射到处理方法上。
    • 可以通过 method 参数指定具体的 HTTP 请求类型
@RequestMapping(value = "/example", method = RequestMethod.GET)
    public String handleRequest() {
        return "Handle Request";
    }
  1. @GetMapping

    • 专门用于处理 HTTP GET 请求
    • 等价于 @RequestMapping 并指定 method = RequestMethod.GET
  2. @PostMapping

    • 专门用于处理 HTTP POST 请求。
    • 等价于 @RequestMapping 并指定 method = RequestMethod.POST
  3. @DeleteMapping
  4. @PutMapping
  5. @PatchMapping

    • 专门用于处理 HTTP PATCH 请求
    • 等价于 @RequestMapping 并指定 method = RequestMethod.PATCH
  6. @CrossOrigin

    • 用于启用跨域资源共享 (CORS) 的支持
    • 可单独使用,也可与其他注解组合。

SpringBoot异常处理相关注解

在 Spring Boot 中,异常处理是通过注解和机制为不同场景提供统一的异常处理方式。以下是与异常处理相关的主要注解及其作用:

  1. @ExceptionHandler

    • 作用:用于在控制器中定义方法,专门处理指定类型的异常。
    • 适用范围:仅限于当前类或通过 @ControllerAdvice 全局适用。
  2. @ControllerAdvice

    • 作用:定义全局的异常处理逻辑,适用于所有控制器。
    • 特点:配合 @ExceptionHandler 使用,将异常处理从控制器中解耦。
  3. @ResponseStatus

    • 作用:用于将异常与 HTTP 状态码绑定。
    • 特点:抛出异常时,Spring 会返回指定的状态码
  4. @RestControllerAdvice

    • 作用:@ControllerAdvice 的扩展,专门为 @RestController 提供异常处理支持
    • 自动将返回值作为 JSON 处理。
    • @RestControllerAdvice 是一个快捷方式,等效于 @ControllerAdvice + @ResponseBody。
  5. @ResponseBody

    • 作用:用于将方法的返回值直接作为 HTTP 响应体。
    • 特点:在异常处理方法中,可以结合 @ExceptionHandler 使用。
  6. @Valid 和 @Validated

    • 作用:用于验证请求参数,当验证失败时,会抛出 MethodArgumentNotValidException 或 ConstraintViolationException。
    • 特点:需配合 @ExceptionHandler 处理相关异常。
  7. @InitBinder

    • 作用:用于预处理 Web 请求参数或初始化数据绑定。
    • 特点:可以结合异常处理方法进行参数校验。
  8. @JsonComponent

    • 作用:用于自定义序列化和反序列化异常信息。
    • 特点:常与异常处理结合,用于格式化返回的 JSON。

爱跑步的猕猴桃
1 声望0 粉丝