• Spring Boot配置加载


    Spring Boot程序默认从application.properties或者application.yaml读取配置,如何将配置信息外置,方便配置呢?

    查询官网,可以得到下面的几种方案:

    通过命令行指定

    SpringApplication会默认将命令行选项参数转换为配置信息
    例如,启动时命令参数指定:

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

    从命令行指定配置项的优先级最高,不过你可以通过setAddCommandLineProperties来禁用

    SpringApplication.setAddCommandLineProperties(false).

    外置配置文件

    Spring程序会按优先级从下面这些路径来加载application.properties配置文件

    • 当前目录下的/config目录
    • 当前目录
    • classpath里的/config目录
    • classpath 跟目录

    因此,要外置配置文件就很简单了,在jar所在目录新建config文件夹,然后放入配置文件,或者直接放在配置文件在jar目录

    自定义配置文件

    如果你不想使用application.properties作为配置文件,怎么办?完全没问题

    java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties

    或者

    java -jar -Dspring.config.location=D:configconfig.properties springbootrestdemo-0.0.1-SNAPSHOT.jar 

    当然,还能在代码里指定

    @SpringBootApplication
    @PropertySource(value={"file:config.properties"})
    public class SpringbootrestdemoApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringbootrestdemoApplication.class, args);
        }
    }

    按Profile不同环境读取不同配置

    不同环境的配置设置一个配置文件,例如:

    • dev环境下的配置配置在application-dev.properties中;
    • prod环境下的配置配置在application-prod.properties中。

    在application.properties中指定使用哪一个文件

    spring.profiles.active = dev

    当然,你也可以在运行的时候手动指定:

    java -jar myproject.jar --spring.profiles.active = prod

    参考:

    1 参见Externalized Configuration


      在spring boot学习1 时,知道spring boot会默认读取配置application.properties。那如果我们直接在application.properties添加自定义的配置项时,如何读取?或者不想把所有的配置都放在application.properties中,而是自定义一个properties文件时,又该如何读取呢?难道还需自己写代码加载读取配置文件吗?

    注:下面代码是在spring boot 1.5.2版本下写的。

    pom.xml

    [html] view plain copy
    1. <parent>  
    2.     <groupId>org.springframework.boot</groupId>  
    3.     <artifactId>spring-boot-starter-parent</artifactId>  
    4.     <version>1.5.2.RELEASE</version>  
    5. </parent>     
    6. <dependencies>  
    7.     <dependency>  
    8.         <groupId>org.springframework.boot</groupId>  
    9.         <artifactId>spring-boot-starter-web</artifactId>  
    10.     </dependency>  
    11.     </dependencies>  


    @Value

       使用@Value注入写在application.properties中的配置项
    application.properties
    [plain] view plain copy
    1. logging.config=classpath:logback.xml  
    2. logging.path=d:/logs  
    3.   
    4.   
    5. ##tomcat set###  
    6. server.port=80  
    7. #session 超时时间  
    8. server.session-timeout=60  
    9. ###########  
    10.   
    11. hello=hello china!!!  
    12.   
    13. class.schoolName=china school  
    14. class.className=second grade three class  
    15. class.students[0].name=tom  
    16. class.students[1].name=jack  

    在代码中@Value注入到属性中
    [java] view plain copy
    1. @Controller  
    2. @RequestMapping("/")  
    3. public class HelloController {  
    4.   
    5.     public static Logger LOG = LoggerFactory.getLogger(HelloController.class);  
    6.       
    7.     @Value("${hello}")  
    8.     private String hello;  
    9.       
    10.     @Value("${class.schoolName}")  
    11.     private String schoolName;  

    @ConfigurationProperties

     如果想把某种相关的配置,注入到某个配置类中,比如上面的application.properties中看到class.xx的配置项,想注入到ClassConfig配置类中
    [java] view plain copy
    1. package com.fei.springboot.config;  
    2.   
    3. import java.util.ArrayList;  
    4. import java.util.List;  
    5.   
    6. import org.springframework.boot.context.properties.ConfigurationProperties;  
    7. import org.springframework.stereotype.Component;  
    8.   
    9. @Component("classConfig")  
    10. @ConfigurationProperties(prefix="class")  
    11. public class ClassConfig {  
    12.   
    13.     private String schoolName;  
    14.       
    15.     private String className;  
    16.       
    17.     private List<StudentConfig> students = new ArrayList<StudentConfig>();  
    18.   
    19.     public String getSchoolName() {  
    20.         return schoolName;  
    21.     }  
    22.   
    23.     public void setSchoolName(String schoolName) {  
    24.         this.schoolName = schoolName;  
    25.     }  
    26.   
    27.     public void setClassName(String className) {  
    28.         this.className = className;  
    29.     }  
    30.   
    31.     public void setStudents(List<StudentConfig> students) {  
    32.         this.students = students;  
    33.     }  
    34.   
    35.     public String getClassName() {  
    36.         return className;  
    37.     }  
    38.   
    39.     public List<StudentConfig> getStudents() {  
    40.         return students;  
    41.     }  
    42.       
    43.       
    44. }  
     这样就会把application.properties中以class.开头的配置项给注入进来
    我们看到代码中@ConfigurationProperties并没有指明properties,那默认的就是application.properties。那是否有地方指明properties的路径呢?在版本1.5.1之前可以@ConfigurationProperties(prefix="class",location="classpath:/customer.properties"),但是1.5.2版本没有location了,需要用@PropertySource("classpath:/student.properties")
    [java] view plain copy
    1. package com.fei.springboot.config;  
    2.   
    3. import org.springframework.boot.context.properties.ConfigurationProperties;  
    4. import org.springframework.context.annotation.PropertySource;  
    5. import org.springframework.stereotype.Component;  
    6.   
    7. @Component("studentConfig")  
    8. @ConfigurationProperties  
    9. @PropertySource("classpath:/student.properties")  
    10. public class StudentConfig {  
    11.   
    12.     private String name;  
    13.       
    14.   
    15.     public String getName() {  
    16.         return name;  
    17.     }  
    18.       
    19.     public void setName(String name) {  
    20.         this.name = name;  
    21.     }  
    22.       
    23. }  

    测试下
    [java] view plain copy
    1. package com.fei.springboot.controller;  
    2.   
    3. import org.slf4j.Logger;  
    4. import org.slf4j.LoggerFactory;  
    5. import org.springframework.beans.factory.annotation.Autowired;  
    6. import org.springframework.beans.factory.annotation.Value;  
    7. import org.springframework.stereotype.Controller;  
    8. import org.springframework.web.bind.annotation.RequestMapping;  
    9. import org.springframework.web.bind.annotation.ResponseBody;  
    10.   
    11. import com.fei.springboot.config.ClassConfig;  
    12. import com.fei.springboot.config.StudentConfig;  
    13.   
    14. @Controller  
    15. @RequestMapping("/")  
    16. public class HelloController {  
    17.   
    18.     public static Logger LOG = LoggerFactory.getLogger(HelloController.class);  
    19.       
    20.     @Value("${hello}")  
    21.     private String hello;  
    22.       
    23.     @Value("${class.schoolName}")  
    24.     private String schoolName;  
    25.       
    26.     @Autowired  
    27.     private ClassConfig classConfig;  
    28.       
    29.     @Autowired  
    30.     private StudentConfig studentConfig;  
    31.       
    32.     @RequestMapping(value="/hello")  
    33.     @ResponseBody  
    34.     public String hello(){  
    35.         System.out.println("=======使用@Value注入获取.....===========");  
    36.         System.out.println("hello="+hello+"   schoolName=" + schoolName);  
    37.         System.out.println("======使用@ConfigurationProperties注入获取.....============");  
    38.         System.out.println("schoolName=" + classConfig.getSchoolName());  
    39.         System.out.println("className=" + classConfig.getClassName());  
    40.         System.out.println("student[0].name=" + classConfig.getStudents().get(0).getName());  
    41.           
    42.         System.out.println("studentConfig...name=" + studentConfig.getName());  
    43.           
    44.         return "hello";  
    45.     }  
    46. }  
    打印结果
    [plain] view plain copy
    1. 2017-05-17 15:20:49.677  INFO 72996 --- [p-nio-80-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 19 ms  
    2. 2017-05-17 15:20:49.677 [http-nio-80-exec-1] INFO  o.s.web.servlet.DispatcherServlet - FrameworkServlet 'dispatcherServlet': initialization completed in 19 ms  
    3. =======使用@Value注入获取.....===========  
    4. hello=hello china!!!   schoolName=china school  
    5. ======使用@ConfigurationProperties注入获取.....============  
    6. schoolName=china school  
    7. className=second grade three class  
    8. student[0].name=tom  
    9. studentConfig...name=xiao hong  

    正因为当初对未来做了太多的憧憬,所以对现在的自己尤其失望。生命中曾经有过的所有灿烂,终究都需要用寂寞来偿还。
  • 相关阅读:
    程序员之道——编程也是一门艺术
    Spring动态获取IoC容器中管理的Bean
    SVN使用教程之——分支、合并
    WebSphere从Windows迁移至Linux出现org.dom4j.DocumentException异常:Nested exception: prolog 中不允许有内容
    Spring动态获取IoC容器中管理的Bean
    com.microsoft.sqlserver.jdbc.SQLServerException: 将截断字符串或二进制数据
    IMP导入数据 出现ORA01691问题 解决办法
    jquery对象与Dom对象的相互转化
    json<>js
    photoshop快捷键
  • 原文地址:https://www.cnblogs.com/candlia/p/11920142.html
Copyright © 2020-2023  润新知