springboot:框架想學(xué)好收夸,屬性配置和使用你都明白了嗎?

在昨天介紹springboot框架之后血崭,大家對(duì)于這個(gè)框架的熱度還是不錯(cuò)卧惜。那么今天Damon繼續(xù)更大家介紹下關(guān)于springboot更深入的東西。希望能夠幫助大家成長(zhǎng)以及進(jìn)步夹纫。如果想要了解昨天的文章咽瓷,可以去github或者翻閱下此前的紀(jì)錄都能夠看到。
Spring Boot 屬性配置和使用
  • 簡(jiǎn)單的說舰讹,Spring Boot 就是允許通過外部配置讓你在不同的環(huán)境使用同一應(yīng)用程序的代碼茅姜,或許說就是可以通過配置文件來注入屬性或者修改默認(rèn)的配置。
Spring Boot 支持多種外部配置方式
這些方式優(yōu)先級(jí)如下:
    1. 命令行參數(shù)
    1. 來自java:comp/env的JNDI屬性
    1. Java系統(tǒng)屬性(System.getProperties())
    1. 操作系統(tǒng)環(huán)境變量
    1. RandomValuePropertySource配置的random.*屬性值
    1. jar包外部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
    1. jar包內(nèi)部的application-{profile}.properties或application.yml(帶spring.profile)配置文件
    1. jar包外部的application.properties或application.yml(不帶spring.profile)配置文件
    1. jar包內(nèi)部的application.properties或application.yml(不帶spring.profile)配置文件
    1. @Configuration注解類上的@PropertySource
    1. 通過SpringApplication.setDefaultProperties指定的默認(rèn)屬性
命令行參數(shù)
  • 通過java -jar app.jar --name="Spring" --server.port=9090方式來傳遞參數(shù)月匣。

  • 參數(shù)用--xxx=xxx的形式傳遞钻洒。

  • 可以使用的參數(shù)可以是我們自己定義的,也可以是Spring Boot中默認(rèn)的參數(shù)桶错。
    -很多人可能會(huì)關(guān)心如web端口如何配置這樣的問題航唆,這些都是Spring Boot中提供的參數(shù),部分可用參數(shù)如下:

          # 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 '/'
    
  • 注意:命令行參數(shù)在app.jar的后面院刁!
  • 可以通過SpringApplication.setAddCommandLineProperties(false)禁用命令行配置糯钙。

操作系統(tǒng)環(huán)境變量

  • 配置過JAVA_HOME的應(yīng)該都了解這一個(gè)。
  • 這里需要注意的地方,有些OS可以不支持使用.這種名字任岸,如server.port再榄,這種情況可以使用SERVER_PORT來配置。

應(yīng)用配置文件(.properties或.yml)

  • 在配置文件中直接寫:
    name=Isea533
    server.port=8080

  • .yml格式的配置文件如:
    name: Isea533
    server:
    port: 8080

  • 當(dāng)有前綴的情況下享潜,使用.yml格式的配置文件更簡(jiǎn)單困鸥。關(guān)于.yml配置文件用法請(qǐng)看這里

  • 注意:使用.yml時(shí),屬性名的值和冒號(hào)中間必須有空格剑按,如name: Isea533正確疾就,name:Isea533就是錯(cuò)的。

屬性配置文件的位置
  • spring會(huì)從classpath下的/config目錄或者classpath的根目錄查找application.properties或application.yml艺蝴。
  • /config優(yōu)先于classpath根目錄

@PropertySource

  • 這個(gè)注解可以指定具體的屬性配置文件猬腰,優(yōu)先級(jí)比較低。

SpringApplication.setDefaultProperties

  • 例如:

      SpringApplication application = new SpringApplication(Application.class);
      Map<String, Object> defaultMap = new HashMap<String, Object>();
      defaultMap.put("name", "Isea-Blog");
      //還可以是Properties對(duì)象
      application.setDefaultProperties(defaultMap);
      application.run(args);
    
應(yīng)用(使用)屬性

@Value(“${xxx}”)

  • 這種方式是最簡(jiǎn)單的猜敢,通過@Value注解可以將屬性值注入進(jìn)來姑荷。
@ConfigurationProperties
  • Spring Boot 可以方便的將屬性注入到一個(gè)配置對(duì)象中。例如:

      my.name=Isea533
      my.port=8080
      my.servers[0]=dev.bar.com
      my.servers[1]=foo.bar.com
    
  • 對(duì)應(yīng)對(duì)象:

      @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;
          }
      }
    
  • Spring Boot 會(huì)自動(dòng)將prefix="my"前綴為my的屬性注入進(jìn)來缩擂。

  • Spring Boot 會(huì)自動(dòng)轉(zhuǎn)換類型鼠冕,當(dāng)使用List的時(shí)候需要注意在配置中對(duì)List進(jìn)行初始化!

  • Spring Boot 還支持嵌套屬性注入胯盯,例如:
    name=isea533
    jdbc.username=root
    jdbc.password=root
    ...

  • 對(duì)應(yīng)的配置類:

  •   @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;
      }
    

    }

  • jdbc開頭的屬性都會(huì)注入到Jdbc對(duì)象中懈费。

在@Bean方法上使用@ConfigurationProperties

  • 例如:
    @ConfigurationProperties(prefix = "foo")
    @Bean
    public FooComponent fooComponent() {
    ...
    }
  • Spring Boot 會(huì)將foo開頭的屬性按照名字匹配注入到FooComponent對(duì)象中。
  • 這種方式比較少見陨闹,我們?cè)谡蟤ybatis那章結(jié)合Druid的配置來具體演示楞捂。

屬性占位符

  • 例如:
    app.name=MyApp
    app.description=${app.name} is a Spring Boot application

  • 可以在配置文件中引用前面配置過的屬性(優(yōu)先級(jí)前面配置過的這里都能用)薄坏。

  • 通過如${app.name:默認(rèn)名稱}方法還可以設(shè)置默認(rèn)值趋厉,當(dāng)找不到引用的屬性時(shí),會(huì)使用默認(rèn)的屬性胶坠。

  • 由于${}方式會(huì)被Maven處理君账。如果你pom繼承的spring-boot-starter-parent,

  • Spring Boot 已經(jīng)將maven-resources-plugins默認(rèn)的${}方式改為了@ @方式沈善,例如@name@乡数。

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

通過屬性占位符還能縮短“命令行”參數(shù)

  • 例如修改web默認(rèn)端口需要使用--server.port=9090方式闻牡,如果在配置中寫上:
    server.port=${port:8080}
  • 那么就可以使用更短的--port=9090净赴,當(dāng)不提供該參數(shù)的時(shí)候使用默認(rèn)值8080。

屬性名匹配規(guī)則

  • 例如有如下配置對(duì)象:

      @Component
      @ConfigurationProperties(prefix="person")
      public class ConnectionSettings {
          private String firstName;
      }
    
  • firstName可以使用的屬性名如下:
  • person.firstName罩润,標(biāo)準(zhǔn)的駝峰式命名
  • person.first-name玖翅,虛線(-)分割方式,推薦在.properties和.yml配置文件中使用
  • PERSON_FIRST_NAME,大寫下劃線形式金度,建議在系統(tǒng)環(huán)境變量中使用

屬性驗(yàn)證

  • 可以使用JSR-303注解進(jìn)行驗(yàn)證应媚,例如:

      @Component
      @ConfigurationProperties(prefix="connection")
      public class ConnectionSettings {
          @NotNull
          private InetAddress remoteAddress;
          // ... getters and setters
      }
    
以上是Spring Boot 屬性配置和使用的內(nèi)容,有些不全面的地方或者讀者有更多疑問猜极,可以查看Spring Boot完整文檔 或 Externalized Configuration中姜。

總結(jié):

作為一個(gè)新生程序猿,Damon希望能夠與大家一同進(jìn)步跟伏。文章或者描述有所不足的地方丢胚,希望大家多多提出來,一同進(jìn)步受扳。

Damon會(huì)繼續(xù)發(fā)掘一些有用的咨詢嗜桌,知識(shí)以及新工具,與大家一同分享辞色,謝謝骨宠!

過去文章都上傳到github,有興趣的小伙伴可以Star下:https://github.com/xxxyyh/Front-end-knowledge.git

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末相满,一起剝皮案震驚了整個(gè)濱河市层亿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌立美,老刑警劉巖匿又,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異建蹄,居然都是意外死亡碌更,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門洞慎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痛单,“玉大人,你說我怎么就攤上這事劲腿⌒袢蓿” “怎么了?”我有些...
    開封第一講書人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵焦人,是天一觀的道長(zhǎng)挥吵。 經(jīng)常有香客問我,道長(zhǎng)花椭,這世上最難降的妖魔是什么忽匈? 我笑而不...
    開封第一講書人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮矿辽,結(jié)果婚禮上丹允,老公的妹妹穿的比我還像新娘歪沃。我一直安慰自己,他們只是感情好嫌松,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開白布沪曙。 她就那樣靜靜地躺著,像睡著了一般萎羔。 火紅的嫁衣襯著肌膚如雪液走。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,807評(píng)論 1 314
  • 那天贾陷,我揣著相機(jī)與錄音缘眶,去河邊找鬼。 笑死髓废,一個(gè)胖子當(dāng)著我的面吹牛巷懈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播慌洪,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼顶燕,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了冈爹?” 一聲冷哼從身側(cè)響起涌攻,我...
    開封第一講書人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎频伤,沒想到半個(gè)月后恳谎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡憋肖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年因痛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片岸更。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鸵膏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出坐慰,到底是詐尸還是另有隱情较性,我是刑警寧澤用僧,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布结胀,位于F島的核電站,受9級(jí)特大地震影響责循,放射性物質(zhì)發(fā)生泄漏糟港。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一院仿、第九天 我趴在偏房一處隱蔽的房頂上張望秸抚。 院中可真熱鬧速和,春花似錦、人聲如沸剥汤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吭敢。三九已至碰凶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鹿驼,已是汗流浹背欲低。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畜晰,地道東北人砾莱。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像凄鼻,于是被迫代替她去往敵國(guó)和親腊瑟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容