Deprecated: 自 6.9.0 版本起,使用参数调用函数 WP_Dependencies->add_data() 已弃用!IE conditional comments are ignored by all supported browsers. in D:\wwwroot\zyxy\wordpress\wp-includes\functions.php on line 6131

Deprecated: 自 6.9.0 版本起,使用参数调用函数 WP_Dependencies->add_data() 已弃用!IE conditional comments are ignored by all supported browsers. in D:\wwwroot\zyxy\wordpress\wp-includes\functions.php on line 6131

Spring Boot外部化配置:application.properties/yml

好的,各位程序猿、攻城狮、码农们,大家好!我是你们的老朋友,今天咱们来聊聊Spring Boot里那些“深藏功与名”的配置文件,也就是application.propertiesapplication.yml

想象一下,咱们辛辛苦苦写好的代码,就像一座精美的城堡🏰,但城堡里的一切都是固定的,门牌号写死了,大门的颜色也定死了,那多没意思啊!如果来了个新邻居,想改个门牌号,或者你突然想把大门刷成土豪金,难道要拆了城堡重建吗?

显然不行!这就需要咱们的配置文件来救场了。它们就像城堡的控制面板,让我们可以在不改动城堡主体的情况下,轻松调整各种参数。

一、配置文件:Spring Boot的“变形金刚”

在Spring Boot的世界里,application.propertiesapplication.yml就是配置文件界的“变形金刚”。它们让我们的应用程序具有极强的灵活性和可配置性。

  • application.properties:老牌劲旅,简单粗暴

    application.properties就像一位经验丰富的老兵,简单直接,使用键值对的形式来配置各种属性。比如:

    server.port=8080
    spring.datasource.url=jdbc:mysql://localhost:3306/mydb
    spring.datasource.username=root
    spring.datasource.password=123456

    这种方式优点是简单易懂,缺点是稍微有点冗长,特别是配置层级关系的时候,会显得有点笨拙。

  • application.yml:优雅绅士,层次分明

    application.yml就像一位优雅的绅士,使用YAML(YAML Ain’t Markup Language)格式,通过缩进来表示层级关系,配置起来更加简洁美观。比如:

    server:
      port: 8080
    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/mydb
        username: root
        password: 123456

    YAML的优点是可读性强,配置结构清晰,缺点是缩进必须严格遵守,否则容易出错(对于Python程序员来说,这简直是家常便饭😂)。

二、配置文件的加载顺序:先来后到,后来居上

Spring Boot加载配置文件的顺序也是有讲究的,就像排队买奶茶,谁先来谁先得,但如果后面的人是VIP,那就可以插队了!

默认情况下,Spring Boot会按照以下顺序加载配置文件:

  1. 命令行参数:优先级最高,一锤定音

    如果你在启动应用程序的时候,通过命令行指定了某个属性,那么这个属性的值将具有最高的优先级,会覆盖其他配置文件中的值。例如:

    java -jar myapp.jar --server.port=9000

    这条命令会把server.port设置为9000,即使application.propertiesapplication.yml中设置了其他值,也会被覆盖。

  2. 来自java:comp/env的JNDI属性:企业级应用,身经百战

    JNDI(Java Naming and Directory Interface)是一种用于访问命名和目录服务的API。在企业级应用中,可以通过JNDI来配置一些属性。

  3. System properties:系统属性,根正苗红

    系统属性可以通过-D参数在启动JVM的时候设置。例如:

    java -Dserver.port=9000 -jar myapp.jar

    与命令行参数类似,系统属性也会覆盖配置文件中的值。

  4. OS environment variables:环境变量,四通八达

    环境变量是操作系统级别的配置,可以影响所有运行在该系统上的应用程序。Spring Boot会自动将环境变量转换为属性,例如,环境变量SERVER_PORT会被转换为属性server.port

  5. RandomValuePropertySource:随机数生成器,神秘莫测

    Spring Boot提供了一个RandomValuePropertySource,可以用来生成随机数。例如:

    my.secret=${random.value}
    my.number=${random.int}
    my.range=${random.int[1024,65536]}

    这些属性的值会在应用程序启动时自动生成。

  6. application-{profile}.propertiesapplication-{profile}.yml:Profile专属,量身定制

    Spring Boot支持Profile的概念,可以根据不同的环境(例如开发、测试、生产)加载不同的配置文件。例如,application-dev.properties只会在dev Profile激活时加载。

  7. application.propertiesapplication.yml:默认配置,万能备胎

    这是最常用的配置文件,如果没有指定Profile,或者没有找到特定Profile的配置文件,那么就会加载这些默认的配置文件。

  8. @PropertySource注解:灵活多变,自由发挥

    可以通过@PropertySource注解来指定额外的配置文件。例如:

    @Configuration
    @PropertySource("classpath:myconfig.properties")
    public class MyConfig {
        // ...
    }

    这种方式可以让我们更灵活地管理配置文件。

  9. 默认属性:兜底方案,保驾护航

    Spring Boot本身也提供了一些默认属性,如果没有在任何配置文件中指定,那么就会使用这些默认值。

总结一下,优先级从高到低依次是:

优先级 配置来源 备注
1 命令行参数 --server.port=9000
2 JNDI属性 来自java:comp/env
3 系统属性 -Dserver.port=9000
4 操作系统环境变量 SERVER_PORT
5 RandomValuePropertySource ${random.value}
6 Profile特定的配置文件 (application-{profile}.*) 例如 application-dev.properties
7 默认配置文件 (application.properties/yml) 如果没有激活任何profile
8 @PropertySource注解 灵活指定配置文件
9 Spring Boot默认属性 如果以上都没有配置,则使用默认值

三、Profile:多环境的“任意门”

在实际开发中,我们通常需要为不同的环境(例如开发、测试、生产)配置不同的属性。Spring Boot的Profile机制就像一个“任意门”,让我们可以在不同的环境之间轻松切换。

  • 激活Profile:多种方式,任君选择

    激活Profile的方式有很多种:

    • 通过命令行参数:

      java -jar myapp.jar --spring.profiles.active=dev
    • 通过系统属性:

      java -Dspring.profiles.active=dev -jar myapp.jar
    • 通过环境变量:

      设置环境变量SPRING_PROFILES_ACTIVE=dev

    • application.propertiesapplication.yml中配置:

      spring.profiles.active=dev

      注意:这种方式的优先级较低,会被命令行参数、系统属性和环境变量覆盖。

  • Profile特定的配置文件:各司其职,井然有序

    我们可以为每个Profile创建特定的配置文件,例如:

    • application-dev.properties:开发环境的配置
    • application-test.properties:测试环境的配置
    • application-prod.properties:生产环境的配置

    当激活某个Profile时,Spring Boot会自动加载对应的配置文件,并将其中的属性应用到应用程序中。

四、配置文件的使用技巧:让你的配置更上一层楼

  • 使用占位符:灵活引用,事半功倍

    可以在配置文件中使用占位符来引用其他属性的值。例如:

    server.port=8080
    my.url=http://localhost:${server.port}/api

    这样,my.url的值会自动根据server.port的值进行替换。

  • 类型安全的配置:告别手误,提升效率

    Spring Boot提供了类型安全的配置方式,可以将配置文件中的属性绑定到Java Bean上。例如:

    @ConfigurationProperties(prefix = "my")
    public class MyProperties {
        private String name;
        private int age;
    
        // getter and setter methods
    }

    然后在配置文件中配置属性:

    my.name=张三
    my.age=20

    这样,Spring Boot会自动将my.namemy.age的值注入到MyProperties对象的nameage属性中。

  • 使用@Value注解:简单快捷,方便易用

    可以使用@Value注解来直接注入配置文件中的属性值。例如:

    @Component
    public class MyComponent {
        @Value("${my.name}")
        private String name;
    
        @Value("${my.age}")
        private int age;
    
        // ...
    }

    这种方式比较简单快捷,但不如类型安全的配置方式那么灵活。

  • 嵌套配置:结构清晰,一目了然

    可以使用嵌套配置来组织复杂的配置结构。例如:

    my:
      database:
        url: jdbc:mysql://localhost:3306/mydb
        username: root
        password: 123456
      server:
        host: localhost
        port: 8080

    这种方式可以使配置结构更加清晰,易于维护。

五、常见问题与解决方案:避坑指南,一路畅通

  • 配置文件加载失败:检查路径,仔细排查

    如果配置文件加载失败,首先要检查配置文件的路径是否正确,文件名是否正确,以及文件格式是否正确。

  • 属性值未生效:检查优先级,仔细分析

    如果属性值未生效,可能是因为被其他配置覆盖了。需要仔细分析配置文件的加载顺序和优先级,找到导致属性值被覆盖的原因。

  • YAML格式错误:注意缩进,小心翼翼

    YAML格式对缩进要求非常严格,如果缩进不正确,会导致解析错误。需要仔细检查YAML文件的缩进,确保符合规范。

六、总结:掌握配置,掌控全局

好了,各位小伙伴们,关于Spring Boot的外部化配置,咱们就聊到这里。希望通过今天的讲解,大家能够对application.propertiesapplication.yml有更深入的了解,能够更加灵活地使用它们来配置我们的应用程序。

记住,掌握配置,就能掌控全局!希望大家在编码的道路上越走越远,写出更加优雅、更加健壮的应用程序!🚀

最后,送给大家一句至理名言:Debug一时爽,一直Debug一直爽! 祝大家编码愉快!🎉

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注