成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Spring Boot(二)Spring Boot 的配置

nicercode / 1431人閱讀

摘要:不同的環(huán)境之間的配置存在覆蓋關(guān)系。提供了一種統(tǒng)一的方式來(lái)管理應(yīng)用的配置,允許開(kāi)發(fā)人員使用屬性文件文件環(huán)境變量和命令行參數(shù)來(lái)定義優(yōu)先級(jí)不同的配置值。比如命令行參數(shù)的優(yōu)先級(jí)被設(shè)置為最高。

一.關(guān)于Spring Boot的配置

Spring Boot 對(duì)于開(kāi)發(fā)人員最大的好處在于可以對(duì) Spring 應(yīng)用進(jìn)行自動(dòng)配置。Spring Boot 會(huì)根據(jù)應(yīng)用中聲明的第三方依賴來(lái)自動(dòng)配置 Spring 框架,而不需要進(jìn)行顯式的聲明。比如當(dāng)聲明了對(duì) HSQLDB 的依賴時(shí),Spring Boot 會(huì)自動(dòng)配置成使用 HSQLDB 進(jìn)行數(shù)據(jù)庫(kù)操作。
Spring Boot 的自動(dòng)配置功能是沒(méi)有侵入性的,只是作為一種基本的默認(rèn)實(shí)現(xiàn)。開(kāi)發(fā)人員可以通過(guò)定義其他配置 bean 來(lái)替代自動(dòng)配置所提供的功能(使用@Configuration注解)。比如當(dāng)應(yīng)用中定義了自己的數(shù)據(jù)源 bean 時(shí),自動(dòng)配置所提供的 HSQLDB 就不會(huì)生效。這給予了開(kāi)發(fā)人員很大的靈活性,既可以快速的創(chuàng)建一個(gè)可以立即運(yùn)行的原型應(yīng)用,又可以不斷的修改和調(diào)整以適應(yīng)應(yīng)用開(kāi)發(fā)在不同階段的需要。Spring Boot 使得這樣的切換變得很簡(jiǎn)單。

注意,自動(dòng)配置永遠(yuǎn)是第二位的,一旦你配置自己的東西,那自動(dòng)配置的就會(huì)被覆蓋。

Spring Boot如何處理多配置

在應(yīng)用中管理配置并不是一個(gè)容易的任務(wù),尤其是在應(yīng)用需要部署到多個(gè)環(huán)境中時(shí)。通常會(huì)需要為每個(gè)環(huán)境提供一個(gè)對(duì)應(yīng)的屬性文件,用來(lái)配置各自的數(shù)據(jù)庫(kù)連接信息、服務(wù)器信息和第三方服務(wù)賬號(hào)等。通常的應(yīng)用部署會(huì)包含開(kāi)發(fā)、測(cè)試和生產(chǎn)等若干個(gè)環(huán)境。不同的環(huán)境之間的配置存在覆蓋關(guān)系。Spring Boot 提供了一種統(tǒng)一的方式來(lái)管理應(yīng)用的配置,允許開(kāi)發(fā)人員使用屬性文件、YAML 文件、環(huán)境變量和命令行參數(shù)來(lái)定義優(yōu)先級(jí)不同的配置值。
Spring Boot 所提供的配置優(yōu)先級(jí)順序比較復(fù)雜。按照優(yōu)先級(jí)從高到低的順序,具體的列表如下所示。

命令行參數(shù)。

通過(guò) System.getProperties() 獲取的 Java 系統(tǒng)參數(shù)。

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

從 java:comp/env 得到的 JNDI 屬性。

通過(guò) RandomValuePropertySource 生成的1random.*1屬性。

應(yīng)用 Jar 文件之外的屬性文件。

應(yīng)用 Jar 文件內(nèi)部的屬性文件。

在應(yīng)用配置 Java 類(lèi)(包含@Configuration注解的 Java 類(lèi))中通過(guò)@PropertySource注解聲明的屬性文件。

通過(guò)SpringApplication.setDefaultProperties聲明的默認(rèn)屬性。

Spring Boot 的這個(gè)配置優(yōu)先級(jí)看似復(fù)雜,其實(shí)是很合理的。比如命令行參數(shù)的優(yōu)先級(jí)被設(shè)置為最高。這樣的好處是可以在測(cè)試或生產(chǎn)環(huán)境中快速地修改配置參數(shù)值,而不需要重新打包和部署應(yīng)用。

SpringApplication 類(lèi)默認(rèn)會(huì)把以“--”開(kāi)頭的命令行參數(shù)轉(zhuǎn)化成應(yīng)用中可以使用的配置參數(shù),如 “--name=Alex” 會(huì)設(shè)置配置參數(shù) “name” 的值為 “Alex”。比如在啟動(dòng)一個(gè)Spring Boot項(xiàng)目的時(shí)候使用java -jar ${項(xiàng)目名}.jar --server.port=9090命令,則該項(xiàng)目的端口就被設(shè)置成了9090.

二.屬性(properties)文件配置

屬性文件是最常見(jiàn)的管理配置屬性的方式。Spring Boot 提供的 SpringApplication 類(lèi)會(huì)搜索并加載 application.properties 文件來(lái)獲取配置屬性值。SpringApplication 類(lèi)會(huì)在下面位置搜索該文件。

* 當(dāng)前目錄的“/config”子目錄。
* 當(dāng)前目錄。
* classpath 中的“/config”包。
* classpath

上面的順序也表示了該位置上包含的屬性文件的優(yōu)先級(jí)。優(yōu)先級(jí)按照從高到低的順序排列。

對(duì)于配置屬性,可以在代碼中通過(guò)“@Value”注解來(lái)使用,這點(diǎn)和普通的Spring項(xiàng)目一樣。如下例:
創(chuàng)建一個(gè)SpringBoot的Maven項(xiàng)目,項(xiàng)目結(jié)構(gòu)如下:

pom.xml文件中引入Spring Boot Parent和Spring Boot Web的依賴:

    
        org.springframework.boot
        spring-boot-starter-parent
        1.5.7.RELEASE
         
    
    
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            com.google.code.gson
            gson
            2.8.0
        
    

在resources目錄下創(chuàng)建一個(gè)名為application.properties 的文件,將如下內(nèi)容添加至該文件:

book.name=HongLouMeng
book.author=曹雪芹
book.publisher=u4e09u8054u51fau7248u793e
book.price=68.5

創(chuàng)建啟動(dòng)類(lèi):

package com.ddcx.springboot.democonfig;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ConfigDemoApplication {

    public static void main(String[] args) {
        //讀取默認(rèn)配置文件的啟動(dòng)方式
        SpringApplication.run(ConfigDemoApplication.class, args);

    }
}

再創(chuàng)建一個(gè)controller類(lèi),在這個(gè)類(lèi)中就可以通過(guò)@Value從配置文件中獲取配置好的值:

package com.ddcx.springboot.democonfig.controller;

import com.ddcx.springboot.democonfig.entity.Book;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class DemoController {

    @Value("${book.name}")
    private String bookName;

    @Value("${book.author}")
    private String bookAuthor;

    @Value("${book.publisher}")
    private String publisher;

    @Value("${book.price}")
    private String price;

    @RequestMapping("/bookInfo")
    String bookInfo() {
        return "bookName-->" + bookName + "
bookAuthor-->" + bookAuthor +
                "
publisher-->" + publisher + "
price-->" + price ;
    }

}



在postman中發(fā)送請(qǐng)求得到如下結(jié)果:

properties文件中的中文出現(xiàn)了亂碼問(wèn)題,可以在properties文件中改用unicode編碼的方式。

除此之外,還可以配置服務(wù)器端口、數(shù)據(jù)庫(kù)等各種配置:

# 配置服務(wù)器端口為8090
server.port=8090
# 配置應(yīng)用的根路徑,必須以"/"開(kāi)頭,否則會(huì)報(bào)異常:
# java.lang.IllegalArgumentException: ContextPath must start with "/ and not end with "/"
server.context-path=/demo-config

除了使用@Value注解綁定配置屬性值之外,還可以使用@ConfigurationProperties(prefix="book")注解,配置屬性中以“book”為前綴的屬性值會(huì)被自動(dòng)綁定到 Java 類(lèi)中同名的屬性上,前提是要有屬性的set方法。這種方法可以方便地配置數(shù)據(jù)庫(kù)。

在這個(gè)示例中比如創(chuàng)建一個(gè)Book類(lèi):

package com.ddcx.springboot.democonfig.entity;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;


@Component  //因?yàn)橐褂米詣?dòng)注入,所以要掃描注冊(cè)到ioc容器中
@ConfigurationProperties(prefix="book")
public class Book {

    private String name;
    private String author;
    private String publisher;
    private double price;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getPublisher() {
        return publisher;
    }

    public void setPublisher(String publisher) {
        this.publisher = publisher;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }
}

在前面縮寫(xiě)的DemoController中自動(dòng)注入一個(gè)Book屬性,添加如下代碼:

private static Gson gson = new Gson();
@Autowired
private Book book;

@RequestMapping("/prefixConfigTest")
String prefixConfigTest() {
    return gson.toJson(book);
}

在postman中測(cè)試表明也可以獲取到application.properties中的配置,并且服務(wù)器的端口配置也可以同時(shí)得到驗(yàn)證:

SpringBoot 如何更改默認(rèn)配置文件的名稱

前面講到,默認(rèn)情況下SpringBoot 會(huì)去指定的路徑下搜索文件名稱為 application.yml、application.properties的配置文件,那如何自己定義配置文件名?

在SpringBoot中可以通過(guò)“spring.config.name”配置屬性來(lái)指定不同的屬性文件名稱。也可以通過(guò)“spring.config.location”來(lái)添加額外的屬性文件的搜索路徑。如果應(yīng)用中包含多個(gè) profile,可以為每個(gè) profile 定義各自的屬性文件,按照“application-{profile}”來(lái)命名。

接下來(lái)可以實(shí)際操作一下,首先在resources目錄下再創(chuàng)建一個(gè) springboot-config.properties 的文件,
并在配置文件中添加內(nèi)容:

book.name=Effective Java
book.author=Joshua Bloch


server.port=8070

在將啟動(dòng)類(lèi)的啟動(dòng)方式改成如下:

package com.ddcx.springboot.democonfig;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;

@SpringBootApplication
public class ConfigDemoApplication {

   public static void main(String[] args) {
      //讀取默認(rèn)配置文件的啟動(dòng)方式
      //SpringApplication.run(ConfigDemoApplication.class, args);
      
      //讀取自定義配置文件名的啟動(dòng)方式
      new SpringApplicationBuilder(ConfigDemoApplication.class)
            .properties("spring.config.location=classpath:/springboot-config.properties")
            .run(args);
   }
}

訪問(wèn)結(jié)果:

這里會(huì)有一個(gè)現(xiàn)象,如果 application.properties 和 springboot-config.properties 兩個(gè)文件同時(shí)存在,當(dāng)application.properties中的配置在pringboot-config.properties也同樣配置了,比如上面的bookName,那么pringboot-config.properties中的配置優(yōu)先級(jí)更高,當(dāng)application.properties中的配置在pringboot-config.properties沒(méi)有配置,那么application.properties中的那項(xiàng)配置仍然會(huì)起作用,比如上面的publisher和server.context-path等。但是如果將 application.properties文件名改成其它的,比如 application-config.properties,則完全以pringboot-config.properties這個(gè)配置文件為準(zhǔn)。


三.YAML配置文件

除了屬性文件,SpringApplication 類(lèi)也提供了對(duì) YAML 配置文件的支持,下面給出了 application.yml 文件的示例。

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

user:
  username: 張三
  age: 22
  contactAddress[0]:
    province: hunan
    city: changsha
    area: yuhuaqu
  contactAddress[1]:
      province: guangdong
      city: guangzhou
      area: tianhequ

SpringBoot的配置支持嵌套和幾何配置,對(duì)于上面的配置,對(duì)應(yīng)如下User和Address兩個(gè)類(lèi):

package demoyaml.entity;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.List;

/**
* Created by liaosi on 2017/10/7.
*/
@Component
@ConfigurationProperties(prefix = "user")
public class User {

    private String username;
    private Integer age;
    private List
contactAddress; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public List
getContactAddress() { return contactAddress; } public void setContactAddress(List
contactAddress) { this.contactAddress = contactAddress; } }
package demoyaml.entity;

/**
* Created by liaosi on 2017/10/7.
*/
public class Address {

    private String province;
    private String city;
    private String area;

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getArea() {
        return area;
    }

    public void setArea(String area) {
        this.area = area;
    }
}

在Controller中添加訪問(wèn)這個(gè)配置的user對(duì)象的方法:

package demoyaml.controller;


import com.google.gson.Gson;
import demoyaml.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class DemoController {

    private static Gson gson = new Gson();
    @Autowired
    private User user;


    @RequestMapping("/getUser")
    String getUser() {
        return gson.toJson(user);
    }

}

訪問(wèn)結(jié)果:

四.多環(huán)境配置

在實(shí)際開(kāi)發(fā)中,通常會(huì)有開(kāi)發(fā)、測(cè)試、生產(chǎn)等多種環(huán)境,SpringBoot是怎么來(lái)配置多種環(huán)境的呢?

1.properties多環(huán)境配置

(1)在項(xiàng)目中添加不同環(huán)境的配置文件

(2)在application.properties配置文件中配置需要激活那個(gè)環(huán)境:

#激活哪一個(gè)環(huán)境的配置文件
spring.profiles.active=dev
#公共配置
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss:
2.yaml多環(huán)境配置

在application中增加內(nèi)容:

#激活哪一個(gè)環(huán)境的配置文件
spring:
    profiles:
        active: development
---
spring:
    profiles: development
    db:
        url: jdbc:hsqldb:file:testdb
        username: dev
        password: dev
#在配置文件增加三個(gè)短橫線區(qū)分不同的環(huán)境
---
spring:
    profiles: test
    db:
        url: jdbc:mysql://localhost/test
        username: test
        password: test

定義一個(gè)DBConfig類(lèi),獲取激活的那個(gè)環(huán)境的配置:

package demoyaml.entity;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;


@Component
@ConfigurationProperties(prefix = "db")
public class DBConfig {

    private String url;
    private String username;
    private String password;

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

通過(guò)controller中的方法查看:

package demoyaml.controller;


import com.google.gson.Gson;
import demoyaml.entity.DBConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class DemoController {

    private static Gson gson = new Gson();

    @Autowired
    private DBConfig DBConfig;

    @RequestMapping("/getEnvConfig")
    String getDBConfig() {
        return gson.toJson(DBConfig);
    }

}

3.兩種配置方式的比較
* Properties配置多環(huán)境,需要添加多個(gè)配置文件,YAML只需要一個(gè)配件文件
* 書(shū)寫(xiě)格式的差異,yaml相對(duì)比較簡(jiǎn)潔,優(yōu)雅
* YAML的缺點(diǎn):不能通過(guò)@PropertySource注解加載。如果需要使用@PropertySource注解的方式加載值,那就要使用properties文件。

本節(jié)示例代碼已上傳到github: https://github.com/liaosilzu2...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71016.html

相關(guān)文章

  • spring boot - 收藏集 - 掘金

    摘要:引入了新的環(huán)境和概要信息,是一種更揭秘與實(shí)戰(zhàn)六消息隊(duì)列篇掘金本文,講解如何集成,實(shí)現(xiàn)消息隊(duì)列。博客地址揭秘與實(shí)戰(zhàn)二數(shù)據(jù)緩存篇掘金本文,講解如何集成,實(shí)現(xiàn)緩存。 Spring Boot 揭秘與實(shí)戰(zhàn)(九) 應(yīng)用監(jiān)控篇 - HTTP 健康監(jiān)控 - 掘金Health 信息是從 ApplicationContext 中所有的 HealthIndicator 的 Bean 中收集的, Spring...

    rollback 評(píng)論0 收藏0
  • Spring Boot 2 快速教程:WebFlux 快速入門(mén)(

    摘要:響應(yīng)式編程是基于異步和事件驅(qū)動(dòng)的非阻塞程序,只是垂直通過(guò)在內(nèi)啟動(dòng)少量線程擴(kuò)展,而不是水平通過(guò)集群擴(kuò)展。三特性常用的生產(chǎn)的特性如下響應(yīng)式編程模型適用性內(nèi)嵌容器組件還有對(duì)日志消息測(cè)試及擴(kuò)展等支持。 摘要: 原創(chuàng)出處 https://www.bysocket.com 「公眾號(hào):泥瓦匠BYSocket 」歡迎關(guān)注和轉(zhuǎn)載,保留摘要,謝謝! 02:WebFlux 快速入門(mén)實(shí)踐 文章工程: JDK...

    gaara 評(píng)論0 收藏0
  • 兩年了,我寫(xiě)了這些干貨!

    摘要:開(kāi)公眾號(hào)差不多兩年了,有不少原創(chuàng)教程,當(dāng)原創(chuàng)越來(lái)越多時(shí),大家搜索起來(lái)就很不方便,因此做了一個(gè)索引幫助大家快速找到需要的文章系列處理登錄請(qǐng)求前后端分離一使用完美處理權(quán)限問(wèn)題前后端分離二使用完美處理權(quán)限問(wèn)題前后端分離三中密碼加鹽與中異常統(tǒng)一處理 開(kāi)公眾號(hào)差不多兩年了,有不少原創(chuàng)教程,當(dāng)原創(chuàng)越來(lái)越多時(shí),大家搜索起來(lái)就很不方便,因此做了一個(gè)索引幫助大家快速找到需要的文章! Spring Boo...

    huayeluoliuhen 評(píng)論0 收藏0
  • SpringBoot學(xué)習(xí)筆記:Getting Started構(gòu)建第一個(gè)Spring Boot工程

    摘要:本文參考官方文檔部分特定版本如版本官方文檔地址注本文基于構(gòu)建話說(shuō)在上已經(jīng)有多顆星了,足見(jiàn)火爆程度簡(jiǎn)介以下介紹引自創(chuàng)建獨(dú)立的應(yīng)用程序直接嵌入,或無(wú)需部署文件提供自己的入門(mén)來(lái)簡(jiǎn)化你的配置盡可能自動(dòng)配置提供生產(chǎn)就緒功能,如指標(biāo),運(yùn)行 本文參考 Spring Boot官方文檔 Part II. Getting Started部分特定版本如1.5.10.RELEASE版本官方文檔地址:https...

    Drummor 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<