1. 程式人生 > >【Spring Boot】Spring Boot 屬性配置和使用

【Spring Boot】Spring Boot 屬性配置和使用

Spring Boot 屬性配置和使用

spring Boot 允許通過外部配置讓你在不同的環境使用同一應用程式的程式碼,簡單說就是可以通過配置檔案來注入屬性或者修改預設的配置。

Spring Boot 系列

Spring Boot 支援多種外部配置方式

這些方式優先順序如下:

  1. 命令列引數
  2. 來自java:comp/env的JNDI屬性
  3. Java系統屬性(System.getProperties()
  4. 作業系統環境變數
  5. RandomValuePropertySource配置的random.*屬性值
  6. jar包外部的application-{profile}.propertiesapplication.yml
    (帶spring.profile)配置檔案
  7. jar包內部的application-{profile}.propertiesapplication.yml(帶spring.profile)配置檔案
  8. jar包外部的application.propertiesapplication.yml(不帶spring.profile)配置檔案
  9. jar包內部的application.propertiesapplication.yml(不帶spring.profile)配置檔案
  10. @Configuration註解類上的@PropertySource
  11. 通過SpringApplication.setDefaultProperties
    指定的預設屬性

命令列引數

通過Java -jar app.jar --name="Spring" --server.port=9090方式來傳遞引數。

引數用--xxx=xxx的形式傳遞。

可以使用的引數可以是我們自己定義的,也可以是Spring Boot中預設的引數。

很多人可能會關心如web埠如何配置這樣的問題,這些都是Spring Boot中提供的引數,部分可用引數如下:

# LOGGING
logging.path=/var/logs
logging.file=myapp.log
logging.config= # location of config file (default classpath:logback.xml for logback)
logging.level.*= # levels for loggers, e.g. "logging.level.org.springframework=DEBUG" (TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF) # EMBEDDED SERVER CONFIGURATION (ServerProperties) server.port=8080 server.address= # bind to a specific NIC server.session-timeout= # session timeout in seconds server.context-parameters.*= # Servlet context init parameters, e.g. server.context-parameters.a=alpha server.context-path= # the context path, defaults to '/' server.servlet-path= # the servlet path, defaults to '/'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

更多常見的應用屬性請瀏覽這裡

注意:命令列引數在app.jar的後面!

可以通過SpringApplication.setAddCommandLineProperties(false)禁用命令列配置。

Java系統屬性

注意Java系統屬性位置java -Dname="isea533" -jar app.jar,可以配置的屬性都是一樣的,優先順序不同。

例如java -Dname="isea533" -jar app.jar --name="Spring!"name值為Spring!

作業系統環境變數

配置過JAVA_HOME的應該都瞭解這一個。

這裡需要注意的地方,有些OS可以不支援使用.這種名字,如server.port,這種情況可以使用SERVER_PORT來配置。

具體名字如何匹配,看本文後面。

RandomValuePropertySource

系統中用到隨機數的地方,例如:

my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

random.int*支援value引數和,max引數,當提供max引數的時候,value就是最小值。

應用配置檔案(.properties或.yml)

在配置檔案中直接寫:

name=Isea533
server.port=8080
  • 1
  • 2
  • 1
  • 2

.yml格式的配置檔案如:

name: Isea533
server:
    port: 8080
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

當有字首的情況下,使用.yml格式的配置檔案更簡單。關於.yml配置檔案用法請看這裡

注意:使用.yml時,屬性名的值和冒號中間必須有空格,如name: Isea533正確,name:Isea533就是錯的。

屬性配置檔案的位置

spring會從classpath下的/config目錄或者classpath的根目錄查詢application.propertiesapplication.yml

/config優先於classpath根目錄

@PropertySource

這個註解可以指定具體的屬性配置檔案,優先順序比較低。

SpringApplication.setDefaultProperties

例如:

SpringApplication application = new SpringApplication(Application.class);
Map<String, Object> defaultMap = new HashMap<String, Object>();
defaultMap.put("name", "Isea-Blog");
//還可以是Properties物件
application.setDefaultProperties(defaultMap);
application.run(args);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

應用(使用)屬性

@Value(“${xxx}”)

這種方式是最簡單的,通過@Value註解可以將屬性值注入進來。

@ConfigurationProperties

Spring Boot 可以方便的將屬性注入到一個配置物件中。例如:

my.name=Isea533
my.port=8080
my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

對應物件:

@ConfigurationProperties(prefix="my")
public class Config {
    private String name;
    private Integer port;
    private List<String> servers = new ArrayList<String>();

    public String geName(){
        return this.name;
    }

    public Integer gePort(){
        return this.port;
    }
    public List<String> getServers() {
        return this.servers;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

Spring Boot 會自動將prefix="my"字首為my的屬性注入進來。

Spring Boot 會自動轉換型別,當使用List的時候需要注意在配置中對List進行初始化!

Spring Boot 還支援巢狀屬性注入,例如:

name=isea533
jdbc.username=root
jdbc.password=root
...
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

對應的配置類:

@ConfigurationProperties
public class Config {
    private String name;
    private Jdbc jdbc;
    class Jdbc {
        private String username;
        private String password;
        //getter...
    }

    public Integer gePort(){
        return this.port;
    }
    public Jdbc getJdbc() {
        return this.jdbc;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

jdbc開頭的屬性都會注入到Jdbc物件中。

在@Bean方法上使用@ConfigurationProperties

例如:

@ConfigurationProperties(prefix = "foo")
@Bean
public FooComponent fooComponent() {
    ...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

Spring Boot 會將foo開頭的屬性按照名字匹配注入到FooComponent物件中。

屬性佔位符

例如:

app.name=MyApp
app.description=${app.name} is a Spring Boot application
  • 1
  • 2
  • 1
  • 2

可以在配置檔案中引用前面配置過的屬性(優先順序前面配置過的這裡都能用)。

通過如${app.name:預設名稱}方法還可以設定預設值,當找不到引用的屬性時,會使用預設的屬性。

由於${}方式會被Maven處理。如果你pom繼承的spring-boot-starter-parent,Spring Boot 已經將maven-resources-plugins預設的${}方式改為了@ @方式,例如@[email protected]

如果你是引入的Spring Boot,你可以修改使用其他的分隔符

通過屬性佔位符還能縮短命令引數

例如修改web預設埠需要使用--server.port=9090方式,如果在配置中寫上:

server.port=${port:8080}
  • 1
  • 1

那麼就可以使用更短的--port=9090,當不提供該引數的時候使用預設值8080

屬性名匹配規則

例如有如下配置物件:

@Component
@ConfigurationProperties(prefix="person")
public class ConnectionSettings {

    private String firstName;

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

firstName可以使用的屬性名如下:

  1. person.firstName,標準的駝峰式命名
  2. person.first-name,虛線(-)分割方式,推薦在.properties.yml配置檔案中使用
  3. PERSON_FIRST_NAME,大寫下劃線形式,建議在系統環境變數中使用

屬性驗證

可以使用JSR-303註解進行驗證,例如:

@Component
@ConfigurationProperties(prefix="connection")
public class ConnectionSettings {

    @NotNull
    private InetAddress remoteAddress;

    // ... getters and setters

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

最後

關於Spring Boot更多的內容可以繼續關注本部落格。

相關推薦

Spring BootSpring Boot 屬性配置使用

Spring Boot 屬性配置和使用 spring Boot 允許通過外部配置讓你在不同的環境使用同一應用程式的程式碼,簡單說就是可以通過配置檔案來注入屬性或者修改預設的配置。 Spring Boot 系列 Spring Boot 支援多種外部配置方式 這些方式

日常錯誤spring-boot配置文件讀取不到

無法 pan factory sdn 一個 pre nco span xxx 最近在用spring-boot做項目時,遇到自定義的配置文件無法讀取到的問題,通過在appcation.java類上定義@PropertySource(value = {"classpath:XX

spring-bootspring-boot-配置嵌入式Servlet容器學習

8、配置嵌入式Servlet容器SpringBoot預設使用Tomcat作為嵌入式的Servlet容器;問題?1)、如何定製和修改Servlet容器的相關配置;1、修改和server有關的配置(ServerProperties【也是EmbeddedServletContain

Spring Boot 屬性配置使用

系統環境 itl class location web ron hashmap 驗證 ssp spring Boot 允許通過外部配置讓你在不同的環境使用同一應用程序的代碼,簡單說就是可以通過配置文件來註入屬性或者修改默認的配置。 Spring Boot 系列

spring BootSpring中@Controller@RestController之間的區別

處理 public 不同 esp 舉例 rest control tro adding spring Boot入手的第一天,看到例子中的@RestController ............. 相同點:都是用來表示Spring某個類的是否可以接收HTTP請求 不同點:@C

spring Bootspring boot獲取資源文件的三種方式兩種情況下

不用 ash 12c ica pla bsp foreach set 使用 首先聲明一點,springboot獲取資源文件,需要看是   1》從spring boot默認的application.properties資源文件中獲取   2》還是從自定義的資源文件中獲取

spring boot框架學習8-幹貨spring boot的web開發(4)-自定義攔截器處理權限

凱哥spring boot spring boot框架 本章節主要內容:通過前面的學習,我們了解並快速完成了spring boot第一個應用。spring boot企業級框架,那麽spring boot怎麽讀取靜態資源?如js文件夾,css文件以及png/jpg圖片呢?怎麽自定義消息轉換器呢?怎麽自定

備忘spring boot netty 實現聊天工具 從開發到部署實戰

一: 課程概要 二: netty初識及BIO、NIO、AIO等執行緒模型 三: netty編寫簡單伺服器及channel詳解 四: netty與hbuilder開發websocket伺服器 五: H5與MUI構建移動端app 六: 資料庫設計及整合Springboot MyB

Spring boot 梳理 - Spring Boot 屬性配置使用(轉)

轉:https://blog.csdn.net/isea533/article/details/50281151 Spring Boot 支援多種外部配置方式,這些方式優先順序如下: 命令列引數 來自java:comp/env的JNDI屬性 Java系統屬性(Syste

spring-bootspring aop 面向切面程式設計初接觸

眾所周知,spring最核心的兩個功能是aop和ioc,即面向切面,控制反轉。這裡我們探討一下如何使用spring aop。 1.何為aop   aop全稱Aspect Oriented Programming,面向切面,AOP主要實現的目的是針對業務處理過程中的切面進行提取,它所面對的是處理過程中的某個

備忘Spring Boot從前端到後臺打造企業級部落格全棧實戰視訊

第1章 Spring Boot 簡介    第2章 開啟 Spring Boot 的第一個 Web 專案    第3章 一個Hello World專案    第4章 開發環境的搭建    第5章 整合Thymeleaf模版引擎    第6章 資料持久化Spring Data

Spring Cloudspring boot搭建+swagger-ui

spring boot 搭建restful介面專案 spring cloud 系列 環境: jdk1.8、maven3.x 、IDEA 簡介 搭建專案 1、新建專案 新建完成專案 新建類

新手須知Spring Boot 2.0.0 + MyBatis + Shiro + Swagger 開發專案踩坑記錄

寫在前面 Swagger 2.8.0 Spring Boot 2.0.0.RELEASE Shiro 1.4.0 Mybatis 1.3.1 填坑 踩坑一: MyBatis xml檔案

spring-bootspring-boot-Docker

五、Docker1、簡介Docker是一個開源的應用容器引擎;是一個輕量級容器技術;Docker支援將軟體編譯成一個映象;然後在映象中各種軟體做好配置,將映象釋出出去,其他使用者可以直接使用這個映象;執行中的這個映象稱為容器,容器啟動是非常快速的。2、核心概念docker主機

十九Spring Boot 之多資料來源分散式事務(JTA、Atomikos、Druid、Mybatis)

1.事務開始 2.A資料來源insert 3.B資料來源insert 4.報錯 5.事務回滾(A、B資料來源都回滾) 專案目錄 pom.xml <?xml version="1.0" encoding="UTF-8"?> <projec

十七Spring Boot 之 多資料來源(擴充套件AbstractRoutingDataSource類,實現動態資料來源。使用AOP註解動態切換資料來源)

在一個專案中操作多個不同的資料來源時,需要用到多資料來源的配置。 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0

Spring BootSpring Boot

Spring Boot - 配置排序依賴技巧 Spring Boot 系列 Spring Boot - 被錯誤使用的註解 我自己曾經在 spring Boot 中整合通用 Mapper 時,寫過下面的程式碼: @Configuration @AutoConfigur

Redis系列Spring boot實現監聽Redis key失效事件

> talk is cheap, show me the code. ## 一、開啟Redis key過期提醒 - 方式二:修改配置檔案 `redis.conf` ``` # 預設 notify-keyspace-events "" notify-keyspace-events Ex

Spring Security七、RememberMe配置

rop 基於 fig mep alias tom 保存 統一 source 一、概述 RememberMe 是指用戶在網站上能夠在 Session 之間記住登錄用戶的身份的憑證,通俗的來說就是用戶登陸成功認證一次之後在制定的一定時間內可以不用再輸入用戶名和密碼進行自動登錄

Spring註解3、屬性賦值

1、@Value 配置檔案 person.properties: person.nickName=張三 person.age=20 實體類 Person.java: @Data @AllArgsConstructor @NoArgsConstructor public class