国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Spring Boot(二)Spring Boot 的配置

nicercode / 1424人閱讀

摘要:不同的環境之間的配置存在覆蓋關系。提供了一種統一的方式來管理應用的配置,允許開發人員使用屬性文件文件環境變量和命令行參數來定義優先級不同的配置值。比如命令行參數的優先級被設置為最高。

一.關于Spring Boot的配置

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

注意,自動配置永遠是第二位的,一旦你配置自己的東西,那自動配置的就會被覆蓋。

Spring Boot如何處理多配置

在應用中管理配置并不是一個容易的任務,尤其是在應用需要部署到多個環境中時。通常會需要為每個環境提供一個對應的屬性文件,用來配置各自的數據庫連接信息、服務器信息和第三方服務賬號等。通常的應用部署會包含開發、測試和生產等若干個環境。不同的環境之間的配置存在覆蓋關系。Spring Boot 提供了一種統一的方式來管理應用的配置,允許開發人員使用屬性文件、YAML 文件、環境變量和命令行參數來定義優先級不同的配置值。
Spring Boot 所提供的配置優先級順序比較復雜。按照優先級從高到低的順序,具體的列表如下所示。

命令行參數。

通過 System.getProperties() 獲取的 Java 系統參數。

操作系統環境變量。

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

通過 RandomValuePropertySource 生成的1random.*1屬性。

應用 Jar 文件之外的屬性文件。

應用 Jar 文件內部的屬性文件。

在應用配置 Java 類(包含@Configuration注解的 Java 類)中通過@PropertySource注解聲明的屬性文件。

通過SpringApplication.setDefaultProperties聲明的默認屬性。

Spring Boot 的這個配置優先級看似復雜,其實是很合理的。比如命令行參數的優先級被設置為最高。這樣的好處是可以在測試或生產環境中快速地修改配置參數值,而不需要重新打包和部署應用。

SpringApplication 類默認會把以“--”開頭的命令行參數轉化成應用中可以使用的配置參數,如 “--name=Alex” 會設置配置參數 “name” 的值為 “Alex”。比如在啟動一個Spring Boot項目的時候使用java -jar ${項目名}.jar --server.port=9090命令,則該項目的端口就被設置成了9090.

二.屬性(properties)文件配置

屬性文件是最常見的管理配置屬性的方式。Spring Boot 提供的 SpringApplication 類會搜索并加載 application.properties 文件來獲取配置屬性值。SpringApplication 類會在下面位置搜索該文件。

* 當前目錄的“/config”子目錄。
* 當前目錄。
* classpath 中的“/config”包。
* classpath

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

對于配置屬性,可以在代碼中通過“@Value”注解來使用,這點和普通的Spring項目一樣。如下例:
創建一個SpringBoot的Maven項目,項目結構如下:

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目錄下創建一個名為application.properties 的文件,將如下內容添加至該文件:

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

創建啟動類:

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) {
        //讀取默認配置文件的啟動方式
        SpringApplication.run(ConfigDemoApplication.class, args);

    }
}

再創建一個controller類,在這個類中就可以通過@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中發送請求得到如下結果:

properties文件中的中文出現了亂碼問題,可以在properties文件中改用unicode編碼的方式。

除此之外,還可以配置服務器端口、數據庫等各種配置:

# 配置服務器端口為8090
server.port=8090
# 配置應用的根路徑,必須以"/"開頭,否則會報異常:
# java.lang.IllegalArgumentException: ContextPath must start with "/ and not end with "/"
server.context-path=/demo-config

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

在這個示例中比如創建一個Book類:

package com.ddcx.springboot.democonfig.entity;

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


@Component  //因為要使用自動注入,所以要掃描注冊到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;
    }
}

在前面縮寫的DemoController中自動注入一個Book屬性,添加如下代碼:

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

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

在postman中測試表明也可以獲取到application.properties中的配置,并且服務器的端口配置也可以同時得到驗證:

SpringBoot 如何更改默認配置文件的名稱

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

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

接下來可以實際操作一下,首先在resources目錄下再創建一個 springboot-config.properties 的文件,
并在配置文件中添加內容:

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


server.port=8070

在將啟動類的啟動方式改成如下:

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) {
      //讀取默認配置文件的啟動方式
      //SpringApplication.run(ConfigDemoApplication.class, args);
      
      //讀取自定義配置文件名的啟動方式
      new SpringApplicationBuilder(ConfigDemoApplication.class)
            .properties("spring.config.location=classpath:/springboot-config.properties")
            .run(args);
   }
}

訪問結果:

這里會有一個現象,如果 application.properties 和 springboot-config.properties 兩個文件同時存在,當application.properties中的配置在pringboot-config.properties也同樣配置了,比如上面的bookName,那么pringboot-config.properties中的配置優先級更高,當application.properties中的配置在pringboot-config.properties沒有配置,那么application.properties中的那項配置仍然會起作用,比如上面的publisher和server.context-path等。但是如果將 application.properties文件名改成其它的,比如 application-config.properties,則完全以pringboot-config.properties這個配置文件為準。


三.YAML配置文件

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

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

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

SpringBoot的配置支持嵌套和幾何配置,對于上面的配置,對應如下User和Address兩個類:

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中添加訪問這個配置的user對象的方法:

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);
    }

}

訪問結果:

四.多環境配置

在實際開發中,通常會有開發、測試、生產等多種環境,SpringBoot是怎么來配置多種環境的呢?

1.properties多環境配置

(1)在項目中添加不同環境的配置文件

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

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

在application中增加內容:

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

定義一個DBConfig類,獲取激活的那個環境的配置:

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

通過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配置多環境,需要添加多個配置文件,YAML只需要一個配件文件
* 書寫格式的差異,yaml相對比較簡潔,優雅
* YAML的缺點:不能通過@PropertySource注解加載。如果需要使用@PropertySource注解的方式加載值,那就要使用properties文件。

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/71016.html

相關文章

  • spring boot - 收藏集 - 掘金

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

    rollback 評論0 收藏0
  • Spring Boot 2 快速教程:WebFlux 快速入門(

    摘要:響應式編程是基于異步和事件驅動的非阻塞程序,只是垂直通過在內啟動少量線程擴展,而不是水平通過集群擴展。三特性常用的生產的特性如下響應式編程模型適用性內嵌容器組件還有對日志消息測試及擴展等支持。 摘要: 原創出處 https://www.bysocket.com 「公眾號:泥瓦匠BYSocket 」歡迎關注和轉載,保留摘要,謝謝! 02:WebFlux 快速入門實踐 文章工程: JDK...

    gaara 評論0 收藏0
  • 兩年了,我寫了這些干貨!

    摘要:開公眾號差不多兩年了,有不少原創教程,當原創越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章系列處理登錄請求前后端分離一使用完美處理權限問題前后端分離二使用完美處理權限問題前后端分離三中密碼加鹽與中異常統一處理 開公眾號差不多兩年了,有不少原創教程,當原創越來越多時,大家搜索起來就很不方便,因此做了一個索引幫助大家快速找到需要的文章! Spring Boo...

    huayeluoliuhen 評論0 收藏0
  • SpringBoot學習筆記:Getting Started構建第一個Spring Boot工程

    摘要:本文參考官方文檔部分特定版本如版本官方文檔地址注本文基于構建話說在上已經有多顆星了,足見火爆程度簡介以下介紹引自創建獨立的應用程序直接嵌入,或無需部署文件提供自己的入門來簡化你的配置盡可能自動配置提供生產就緒功能,如指標,運行 本文參考 Spring Boot官方文檔 Part II. Getting Started部分特定版本如1.5.10.RELEASE版本官方文檔地址:https...

    Drummor 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<