【问题标题】:Spring Boot Reading a Custom Environment specific fileSpring Boot 读取自定义环境特定文件
【发布时间】:2018-01-11 00:43:31
【问题描述】:

我有以下问题, 我想读取特定于环境的自定义文件。所以,像 application-dev-kafka.properties、application-prod-kafka.properties 等,然后绑定属性。 我知道弹簧轮廓。 我曾考虑过使用@propertysource,但我再次不确定根据文件名指定什么。 任何帮助表示赞赏。

编辑- 对我来说,个人资料是 dev、prod 等。不是 dev-kafka 或 prod-kafka。 对于需要配置的每个配置文件和每个组件,我想要一个配置文件特定文件。

所以application-dev-kafka,

应用开发-hazelcast,

应用开发-mysql。

应用程序-prod-kafka,

应用程序-产品-hazelcast,

应用程序-prod-mysql,

应用程序-int-kafka,

application-int-hazelcast,

应用程序-int-mysql。

【问题讨论】:

    标签: java spring spring-boot


    【解决方案1】:

    所以,这就是我所做的。

    我正在使用弹簧配置文件,并在我的 application.properties 文件中添加了 spring.profiles.active=dev。

    也有环境特定的属性文件可用。因此,spring boot 会自动检测到 application-dev.properties、application-prod.properties 等。

    在我的应用程序中,我有一个用

    注释的组件
          @PropertySource("classpath:${file-name}")
    

    这里,property-file-name 存在于所有环境特定的属性文件中。因此,根据您运行的配置文件,spring boot 将自动检测到 2 个属性文件。所以例如-

    如果您使用配置文件 dev 运行,它将检测 application.properties 和 application-dev.properties。然后根据application-dev.properties中file-name的值检测application-dev-kafka.properties。

    【讨论】:

    • 能否请您详细解释一下,并附上完整的代码 sn-p?
    • 你的问题陈述到底是什么?
    【解决方案2】:

    根据响应更新。

    按照此处的示例:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html

    在您的 application.properties 文件中包含以下内容。

    list of your normal properties
    ---
    spring.profiles: prod
    spring.profiles.include:
      - prod-kafka
    ----
    spring.profiles: dev
    spring.profiles.include:
      - dev-kafka
    

    【讨论】:

    • 对我来说,个人资料只能是 dev 和 prod。不是卡夫卡。
    【解决方案3】:

    添加一个类以根据需要加载您的属性文件。

    @Configuration
    public class AppConfig {
        @Configuration
        @PropertySource("dev.properties")
        static class dev{}
    
        @Configuration
        @PropertySource("prod.properties")
        static class prod{}
    }
    

    如果你想通过不同的配置文件读取配置文件(-Dspring.profiles.active)

    @Configuration
    public class AppConfig {
        @Profile("dev")
        @Configuration
        @PropertySource("dev1.properties")
        static class dev1{}
    
        @Profile("dev")
        @Configuration
        @PropertySource("dev2.properties")
        static class dev2{}
    
        @Profile("prod")
        @Configuration
        @PropertySource("prod1.properties")
        static class prod1{}
    
        @Profile("prod")
        @Configuration
        @PropertySource("prod2.properties")
        static class prod2{}
    }
    

    【讨论】:

      【解决方案4】:

      将你的配置相关环境特定的kafka文件放在资源包中,

      您将使用以下代码获得弹簧活动配置文件的值,

      @Autowired
      private Environment environment;
      
      String activeProfile = environment.getActiveProfiles()[0];
      

      因此,您将在 activeProfile 变量中获得活动配置文件(如 dev、uat 或 prod)的值,只需使用创建一个特定于环境的文件名,

      private String ACTIVE_PROFILES_KAFKA_FILE = activeProfile + "_kafka.yml";
      

      因此,您将获得特定的 kafka 文件名,例如 dev_kafka for dev,prod_kafka for prod 等等,并在代码中加载文件,如下所示。

      MainClass.class.getClassLoader()
                                  .getResourceAsStream(ACTIVE_PROFILES_KAFKA_FILE);
      

      【讨论】:

        【解决方案5】:

        您可以使用spring.profiles.active 来指定配置文件。例如使用spring.profiles.active=dev 来指定application-dev.properties。

        您还可以在运行应用程序时指定配置文件,例如:

        java -jar myapp.jar --spring.profiles.active=prd
        

        【讨论】:

        • 感谢您的回复。仔细检查我的问题,我想要 application--kafka.properties。并且可以有多个这样的文件。应用程序--hazelcast。应用程序--mysql
        【解决方案6】:
        @PropertySource("classpath:application-dev-kafka.properties")
        class YourClassConfig {
            @Autowired
            private Environment env;
        
            //some method
            env.getProperty("your.property");
        }
        

        【讨论】:

        • 不要只发布代码答案,描述你的答案。
        猜你喜欢
        • 2014-09-07
        • 2016-08-08
        • 2016-08-30
        • 2018-08-05
        • 2021-08-12
        • 2020-11-04
        • 2020-07-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多