Spring Boot配置加载

导读:本篇文章讲解 Spring Boot配置加载,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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:\config\config.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  

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/14279.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!