當前位置:首頁 » 存儲配置 » 哪個組件的配置項優先順序最高

哪個組件的配置項優先順序最高

發布時間: 2023-02-21 02:57:07

1. SpringBoot項目結構及功能

在IntelliJ使用 Spring Initializer快速創建項目

這是pom文件中父項目,再進一步查看其 spring-boot-starter-parent

發現真正管理Spring Boot應用裡面的所有依賴版本的地方在這 spring-boot-dependencies
Spring Boot的版本仲裁中心;
以後我們導入依賴默認是不需要寫版本;(沒有在dependencies裡面管理的依賴自然需要聲明版本號)
再往下看:

這是spring boot的web場景啟動器,只要引入了它,就能幫我們導入了web模塊正常運行所依賴的組件;

@SpringBootApplication: Spring Boot應用標注在某個類上說明這個類是SpringBoot的主配置類,SpringBoot就應該運行這個類的main方法來啟動SpringBoot應用;

@SpringBootConfiguration:Spring Boot的配置類:標注在某個類上,表示這是一個Spring Boot的配置類;
@Configuration:配置類上來標注這個註解;
配置類 ----- 配置文件;配置類也是容器中的一個組件;@Component

@EnableAutoConfiguration:開啟自動配置功能;
以前我們需要配置的東西,Spring Boot幫我們自動配置;@EnableAutoConfiguration告訴SpringBoot開啟自動配置功能;這樣自動配置才能生效;

在src下創建一個controller包,新建一個HelloController類,之後運行springboot,便可以通過 localhost:/8080/hello 來訪問hello頁面。

SpringBoot使用一個全局的配置文件,配置文件名是固定的;
• application.properties
• application.yml
配置文件的作用:修改SpringBoot自動配置的默認值;SpringBoot在底層都給我們自動配置好;

springboot 啟動會掃描以下位置的application.properties或者application.yml文件作為Spring boot的默認配置文件
–file:./config/
–file:./
–classpath:/config/
–classpath:/
優先順序由高到底,高優先順序的配置會覆蓋低優先順序的配置;
SpringBoot會從這四個位置全部載入主配置文件;互補配置;

application.yml

@Value獲取值和@ConfigurationProperties獲取值比較
配置文件yml還是properties他們都能獲取到值;
如果說,我們只是在某個業務邏輯中需要獲取一下配置文件中的某項值,使用@Value;
如果說,我們專門編寫了一個javaBean來和配置文件進行映射,我們就直接使用@ConfigurationProperties;
==我們還可以通過spring.config.location來改變默認的配置文件位置==
項目打包好以後,我們可以使用命令行參數的形式,啟動項目的時候來指定配置文件的新位置;指定配置文件和默認載入的這些配置文件共同起作用形成互補配置;
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties

2. spring boot 使用 k8s 的 configMap 作為外部配置

spring boot 應用以容器的方式運行在 k8s 集群上面是非常方便的,但是不同的環境需要不同的配置文件,我們可以使用外部的配置中心,比如 nacos 、 apollo 。 k8s 也提供了 configMap 用來將環境配置信息和容器鏡像解耦,便於應用配置的修改。本文主要從以下幾個方面介紹 spring boot 使用 k8s 的 configMap 作為外部配置的使用方法:

當應用程序啟動時,Spring Boot 會自動從以下位置查找並載入 application.properties 和 application.yaml 文件。

配置文件優先順序從高到底的順序如下:

高優先順序配置會覆蓋低優先順序配置

如果我們運行時想指定運行哪個環境的配置文件,可以有三種方式:

ConfigMap 是一種 API 對象,用來將非機密性的數據保存到鍵值對中。使用時 pod 可以將其用作環境變數、命令行參數或者存儲卷中的配置文件。

創建 configMap 的幾種方式:

從前面的介紹我們可以知道,spring boot 載入配置文件的最高優先順序是 項目根路徑下的 /config 子目錄 ,所以可以將 configMap 中的配置文件掛載到容器中的項目根路徑下的 config 子目錄中。

當卷中使用的 configMap 被更新時,所投射的鍵最終也會被更新。 kubelet 組件會在每次周期性同步時檢查所掛載的 configMap 是否為最新。 不過,kubelet 使用的是其本地的高速緩存來獲得 configMap 的當前值。 高速緩存的類型可以通過 KubeletConfiguration 結構 的 欄位來配置。

configMap 既可以通過 watch 操作實現內容傳播(默認形式),也可實現基於 TTL 的緩存,還可以直接經過所有請求重定向到 API 伺服器。 因此,從 configMap 被更新的那一刻算起,到新的主鍵被投射到 Pod 中去,這一 時間跨度可能與 kubelet 的同步周期加上高速緩存的傳播延遲相等。 這里的傳播延遲取決於所選的高速緩存類型 (分別對應 watch 操作的傳播延遲、高速緩存的 TTL 時長或者 0)。

以環境變數方式使用的 configMap 數據不會被自動更新,更新這些數據需要重新啟動 Pod。

參考文檔:

k8s 官網

spring boot 官網

3. 2021-11-22 spring-cloud-nacos配置優先順序

最近有項目組同學問到為什麼自己配置了nacos,但配置不生效?我簡單看了下,發現問題出在相關配置的優先順序模式不同。
spring-boot項目,有bootstrap、application兩個配置文件,結合profile,和支持的文件格式properties、yaml,已經有6個配置文件了。然後使用了spring-cloud-starter-alibaba-nacos-config 後,又提供了三級配置。這些配置之間的組合關系,將在無形中影響配置的效果。很多同學只知道其中的一種,因此在無意識引入兩種或以上的配置後,就會發現有奇怪的配置不生效問題發生。

spring-boot項目依賴bootstrap.yml 用於應用程序上下文的引導階段,由父Spring ApplicationContext載入,其工作的階段為父ApplicationContext 被載入到使用application.yml的之前。也就是說 bootstrap 載入優先於 applicaton。

bootstrap 主要用於從額外的資源來載入配置信息,還可以在本地外部配置文件中解密屬性。這兩個上下文共用一個環境,它是任何Spring應用程序的外部屬性的來源。bootstrap 裡面的屬性會優先載入,它們默認也不能被本地相同配置覆蓋。

bootstrap 配置文件有以下幾個應用場景:

由於spring-boot支持多種文件格式,所以多種格式之間,其優先順序是平等的,只要找到了一個,就會被使用。一般有:.properties、.yaml、.xml等格式。

應用級別的spring-boot配置文件,主要用於 Spring Boot 項目的自動化配置,其載入優先順序低於bootstrap.yaml。

nacos作為外部配置伺服器,通過spring-boot的bootstrap.yaml引入。但nacos本身,也提供了三級配置體系:主配置(只有一個,但會按照不同後綴名,去找到相關配置)、擴展配置、共享配置。

三級配置的優先順序如下:主配置 > 擴展配置 > 共享配置

nacos提供的配置路徑 spring.cloud.nacos.config 下,有一系列的屬性用於定位主配置。基於 prefix(默認為 ${spring.application.name} 的值)、namespace、group(默認為字元串 DEFAULT_GROUP )、file-extension(默認為字元串 .properties ),按組裝規則 ${prefix}-${spring.profiles.active}.${file-extension} 去找到一個配置。

在nacos的所有配置中,主配置(存在的情況下)具有最高的優先順序,其同名配置值不能被擴展配置或共享配置中定義的同名屬性所覆蓋。

上述兩類配置都支持三個屬性: data-id 、 group (默認為字元串 DEFAULT_GROUP )、 refresh (默認為 true )。

實際上,nacos中並未對 extension-configs 和 shared-configs 的差別進行詳細闡述。我們從他們的結構,看不出本質差別;除了優先順序不同以外,也沒有其他差別。那麼,nacos項目組為什麼要引入兩個類似的配置呢?我們可以從當初 該功能的需求(issue) 上找到其原始目的。
摘要其核心內容如下:

4. SpringBoot 配置文件詳解(告別XML)

快速學會和掌握 SpringBoot 的 核心配置文件的使用。

SpringBoot 提供了豐富的 外部配置 ,常見的有:

其中核心配置文件我們並不陌生,主要以Key-Value的形式進行配置,其中屬性Key主要分為兩種:

在 application.properties 添加配置如下:

① 添加數據源信息

在 application.propertis 添加配置如下:

① 添加認證信息,其中 socks.indentity.* 是自定義的屬性前綴。

② 添加隨機值,其中spring.test.* 是自定義的屬性前綴。

使用方法: @ConfigurationProperties(prefix = "spring.datasource")

使用說明:提供 Setter方法 和 標記組件 Component

如何驗證是否成功讀取配置?答:這里可以簡單做個驗證,注入 MyDataSource ,使用 Debug 模式可以看到如下信息:

使用方法: @Value("spring.datasource.*")

使用說明:提供 Setter方法 和 標記組件 Component

注意事項:@Value不支持注入靜態變數,可間接通過Setter注入來實現。

關於兩者的簡單功能對比:

顯然,前者支持松綁定的特性更強大,所以在實際開發中建議使用@ConfigurationProperties來讀取自定義屬性。

SpringBoot 默認會載入這些路徑載入核心配置文件,按優先順序從高到低進行排列:具體規則詳見 ConfigFileApplicationListener

如果存在多個配置文件,則嚴格按照優先順序進行覆蓋,最高者勝出:

舉個簡單的例子,例如再上述位置都有一個application.properties ,並且每個文件都寫入了server.port=xx (xx分別是9001,9002,9003,9004),在啟動成功之後,最終應用的埠為:9004。圖例:

如果想修改默認的載入路徑 或者 調改默認的配置文件名,我們可以藉助命令行參數進行指定,例如:

YAML是JSON的一個超集,是一種可輕松定義層次結構的數據格式。

答: 因為配置文件這東西,結構化越早接觸越規范越好。這里推薦閱讀阮一峰老師寫的 YAML語言教程 ,寫的很簡單明了。

引入依賴: 在POM文件引入 snakeyaml 的依賴。

使用說明: 直接在類路徑添加 application.yml 即可。

例如下面這兩段配置是完全等價的:

① 在 application.yml 配置數據源:

② 在 application.properties 配置數據源:

在項目的實際開發中,我們往往需要根據不同的環境來載入不同的配置文件。例如生產環境,測試環境和開發環境等。此時,我們可以藉助 Profiles 來指定載入哪些配置文件。例如:

溫馨提示:如果spring.profiles.active指定了多個配置文件,則按順序載入,其中最後的優先順序最高,也就是最後的會覆蓋前者。

使用方法:
使用Maven插件打包好項目,然後在當前路徑,執行DOS命令: java -jar demo.jar --server.port=8081 ,在控制台可看到應用埠變成了8081。

實現原理:
默認情況下,SpringBoot會將這些命令行參數轉化成一個 Property ,並將其添加到 Environment 上下文。

溫馨提示:
由於命令行參數優先順序非常之高,基本高於所有常見的外部配置,所以使用的時候要謹慎。詳見 PropertySource 執行順序 。

關閉方法:
如果想禁用命令行屬性,可以設置如下操作:springApplication.setAddCommandLineProperties(false)

5. 10 . DHCP作用域有三個層次,哪個作用域選項優先順序最高 (4 分)

C

A為所有作用域
B為指定的作用域
C為預約

6. 二、springboot配置文件

1. 配置文件

Spring Boot使用一個全局的配置文件

application.properties

application.yml

配置文件的作用:修改Spring Boot自動配置的默認值,SpringBoot在底層都給我們自動

配置好。有什麼配置項,可以移步官方文檔

配置文件一般放在src/main/resources目錄或者類路徑/confifig下,當然還有很多位置可

以放,它們會有不同優先順序,後面會講到。

YAML (YAML Ain't Markup Language)

簡單介紹

<!--綁定配置文件處理器,配置文件進行綁定的時候就會有提示-->

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-configuration-processor</artifactId>

<optional>true</optional>

</dependency>

<!-- 將應用打包成一個可執行Jar包,直接使用java -jar xxxx的命令來執行 -->

<build>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

</plugin>

</plugins>

</build>以前的配置文件:大多是xml

.yml是YAML語言的文件,以數據為中 心,比json、xml等更適合做配置文件

全局配置文件的可以對一些默認配置值進行修改

配置實例

xml:

yml:

2. YAML語法

基本語法

K:(空格)V 標識一對鍵值對

以空格的縮進來控制層級關系

只要是左對齊的一列數據,都是同一層級的

屬性和值也是大小寫敏感

實例:

值的寫法

普通的值

k: v 字面量直接來寫,字元串默認不用添加單引號

" " 雙引號 不會轉義字元串裡面的特殊字元;

<server>

<port>8081</port>

</server>

server:

port: 8081

server:

port: 8081

path: /hello // 冒號後面的空格不要拉下' ' 單引號 會轉義字元,特殊字元最終是一個普通的字元串

對象

普通寫法:

行內寫法

frends:{ lastName: zhang,age: 18 }

Map

示例:

maps: {k1: v1,k2: v2}

數組

普通寫法:

pets: // var onj = {pets: ['cat','pig','dog']}

- cat

- pig

- dog

行內寫法

pets:[cat, pig, dog]

配置文件獲取

將配置文件中的每一個值映射到此組件中

1. Persion

name: "wang \n qian" // 輸出:wang 換行 qian

frends:

lastName: zhang

age: 20package com.wrq.boot.bean;

@Component

@ConfigurationProperties(prefix = "persion")

public class Persion {

private String name;

private int age;

private double weight;

private boolean boss;

private Date birth;

private Map<String,Object> maps;

private List<Object> list;

private Dog dog;

此處,這個bean的getter、setter和tostring方法已經省略,千萬不能忽略!

}

@ConfifigurationProperties 意思是:我們類裡面的屬性和配置文件中的屬性做綁定

不使用此註解,可以在bean的屬性添加@value()註解,如下:

@Component

// @ConfigurationProperties(prefix = "persion")

public class Persion {

@value("${persion.name}") // $()讀取配置文件、環境變數中的值

private String name;

@value("#{11*2}") // #{SpEL} 採用表達式

private int age;

@value("true") // 直接賦值

private boolean boos;

}

此處採用@ConfifigurationProperties的方式,@value()和@ConfifigurationProperties的

區別見下方表格。prefifix = "persion" 配置文件中那個下面的屬性來一一映射

@Component 如果想要這個註解起作用,必須放到容器裡面

2. Dog

package com.wrq.boot.bean;

public class Dog { // 用作Persion中的屬性

private String name;

private int age;

此處,這個bean的getter、setter和tostring方法已經省略,千萬不能忽略!

}

3. 配置文件

方式一: application.yml

persion:

name: 王大錘

age: 18

weight: 125

boss: false

birth: 2018/5/5

maps: {k1: v1,k2: v2}

list:

- wangli

- wang

dog:

name: xiaogou

age: 2

方式二: application.propertiespersion.name = 王大錘

persion.age = 18

persion.weight = 125

persion.boss = false

persion.birth = 2018/5/5

persion.maps.k1 = v1

persion.maps.k2 = v2

persion.dog.name = xiaogou

persion.dog.age = 15

4. 測試類:BootApplicationTests

package com.wrq.boot;

@RunWith(SpringRunner.class)

@SpringBootTest

public class BootApplicationTests {

@Autowired

Persion persion;

@Test

public void contextLoads() {

System.out.print(persion);

}

}

5. 運行 BootApplicationTests方法

控制台列印:

application.yml的結果:

Persion{name='王大錘', age=18, weight=125.0, boss=false, birth=Sat May

05 00:00:00 CST 2018, maps={k1=v1, k2=v2}, list=[wangli, wang],

dog=Dog{name='xiaogou', age=2}}

application.properties的結果:

Persion{name='��Ǭ', age=18, weight=125.0, boss=false, birth=Sat

May 05 00:00:00 CST 2018, maps={k2=v2, k1=v1}, list=[wangli, wang],

dog=Dog{name='xiaogou', age=15}}

把Bean中的屬性和配置文件綁定,通過yml文件和properties都可以做到,但是properties

文件出現亂碼。

properties中文讀取亂碼:File->Settings->File Encodings最底部選utf-8、Tranparent打

上勾

註解比較

@value和@ConfifigurationProperties獲取值比較

名詞解釋:

鬆散綁定

last-name和lastName都可以獲取導致,則代表支持鬆散綁定

JSR303@Component

@ConfigurationProperties(prefix = "persion") // 如果使用的是@value注入值

時,無法使用校驗

@Validated // 添加此註解

public class Persion {

@Email // 配置文件書寫的屬性必須是郵箱格式,不符合報錯!

private String name;

}

復雜類型封裝

如果獲取配置文件中map的值時,@value是獲取不到值的

@value("${persion.maps}") // 由於使用的是@value,無法獲取配置文件中的map

private Map<String,Object> maps;

@PropertySource

@PropertySource:載入指定配置文件

@ConfifigurationProperties()默認是從全局配置文件中獲取值,也就是

application.properties這個文件中獲取值。

如果做的配置很多,全局的配置文件就會特別大,為了方便管理。我會創建不同的配置文

件定向管理不同的配置。

如創建persion.properties文件單獨存放persion需要的配置

@PropertySource就是用來導入創建的配置文件

示例:

1. persion.properties

同時把兩個全局的配置中關於Persion的配置都注釋掉persion.name = 王弟弟

persion.age = 18

persion.weight = 125

persion.boss = false

persion.birth = 2018/5/5

persion.maps.k1 = v1

persion.maps.k2 = v2

persion.dog.name = xiaogou

persion.dog.age = 15

2. Persion

package com.wrq.boot.bean;

@Component

@PropertySource(value = {"classpath:persion.properties"})

@ConfigurationProperties(prefix = "persion")

public class Persion {

private String name;

private int age;

private double weight;

private boolean boss;

private Date birth;

private Map<String,Object> maps;

private List<Object> list;

private Dog dog;

此處,這個bean的getter、setter和tostring方法已經省略,千萬不能忽略!

}

這樣運行測試類,控制台就可以列印persion.properties中的數據。

通過下面的註解,把類路徑下的persion.properties載入進來。並且把persion開頭的數

據進行綁定。

@PropertySource(value = {"classpath:persion.properties"})@ConfifigurationProperties(prefifix = "persion")

@ImportResource

@ImportResource:導入Spring的配置文件,讓配置文件生效。

示例:

1. com.wrq.boot.service

package com.wrq.boot.service;

/**

* Created by wangqian on 2019/1/12.

*/

public class HelloService {

}

2. resources目錄手動建立bean.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="helloService" class="com.wrq.boot.service.HelloService">

</bean>

</beans>

3. 測試類

package com.wrq.boot;

@RunWith(SpringRunner.class)

@SpringBootTest

public class BootApplicationTests {

@Autowired

ApplicationContext ioc;@Test

public void testConfig() {

boolean b = ioc.containsBean("helloService");

System.out.print(b);

}

}

試圖通過添加一個Spring的配置文件bean.xml來把HelloService注入進去。

運行測試類結果:false

結果表明IoC容器中並不包含HelloService,即:配置文件bean.xml沒有生效

解決方式

方式一: 主程序中進行配置@ImportResouece註解

package com.wrq.boot;

@ImportResource(locations = {"classpath:bean.xml"}) // 通過此配置是

bean.xml生效

@SpringBootApplication

public class BootApplication {

public static void main(String[] args) {

//應用啟動起來

SpringApplication.run(BootApplication.class, args);

}

}

方法二:通過配置類實現,這種方式也是Spring Boot推薦的

1. com.wrq.boot.confifigpackage com.wrq.boot.config;

/**

* Created by wangqian on 2019/1/12.

*/

@Configuration

public class MyConfig {

// 將方法的返回值添加到容器之中,並且容器中這個組件的id就是方法名

@Bean

public HelloService helloService(){

System.out.print("通過@Bean給容器添加組件了..");

return new HelloService();

}

}

@Confifiguration標注這是一個配置類

通過@Bean註解,將方法的返回值添加到容器之中,並且容器中這個組件的id就是方

法名

2. 把主程序類中@ImportResource()配置注釋掉

3. 測試成功,添加了HelloService()組件

3. 配置文件佔位符

隨機數

RandomValuePropertySource:配置文件中可以使用隨機數

${random.value}

${random.int}

${random.long}

${random.uuid}

${random.int(10)}

${random.int[1024,65536]}

屬性配置佔位符可以在配置文件中引用前面配置過的屬性(優先順序前面配置過的這里都能用)

${app.name:默認值}來指定找不到屬性時的默認值

persion.name = 王弟弟${random.uuid}

persion.age = ${random.int}

persion.dog.name = ${persion.name}_dog

4. Profifile 多環境支持

Profifile是Spring對不同環境提供不同配置功能的支持,可以通過激活、 指定參數等方式

快速切換環境

1. 多Profifile的方式

格式:application-{profifile}.properties/yml

application-dev.properties

application-prod.properties

默認採用application.properties配置文件,如果使用別的,需要激活:

1. application.properties中配置:

# 激活application-dev.properties配置文件

spring.profiles.active=dev

2. application-dev.properties:

server.port=8082

3. 運行BootApplication主程序:

2019-01-12 20:46:09.345 INFO 14404 --- [main]

s.b.c.e.t. : Tomcat started on port(s):

8082 (http)

2. 多文檔塊的方式

除了上方多Profifile的方式來切換環境,也可以通過YAML多文檔塊的方式。示例:

application.yml:

server:

port: 8081

spring:

profiles:

active: dev

---

spring:

profiles: dev

server:

port: 8083

---

spring:

profiles: prod

server:

port: 8084

3. 激活指定Profifile

1. application.properties中配置:

# 激活application-dev.properties配置文件

spring.profiles.active=dev

2. application.yml中配置

server:

port: 8081

spring:

profiles:

active: dev

---

spring:

profiles: dev

server:

port: 80833. 啟動配置-參數

在IDE中,類似於配置tomcat的地方,按下方配置:

Program arguments:--spring.profiles.active=dev

4. 啟動配置-虛擬機

在IDE中,類似於配置tomcat的地方,按下方配置:

VM options:-Dspring-profiles-active=dev

5. 命令行 使用Maven的package命令打包,移動到jar的目錄。

java -jar spring-boot-project-config.jar --spring.profiles.active=dev

5. 配置文件優先順序

GitHub對應項目:boot-confifig-position

優先順序

Spring Boot 啟動會掃描以下位置的application.properties或者 application.yml文件作

為Spring boot的默認配置文件

fifile:./confifig/ (項目根目錄confifig文件夾下的配置文件)

fifile:./ (項目根目下的配置文件)

classpath:/confifig/ (resources目錄confifig文件夾下的配置文件)

classpath:/ (resources目下的配置文件)

以上是按照優先順序從高到低的順序,所有位置的文件都會被載入,高優先順序配置內容會覆

蓋低優先順序配置內容,形成互補配置。

默認配置

我們也可以通過配置spring.confifig.location來改變默認配置。

項目打包後以後,我們可以使用命令行參數的形式,啟動項目的時候來指定配置文件的新

位置;指定配置文件和默認載入的這些配置文件共同起作用,形成互補配置。

1. Maven->package對項目打包2. 把待使用的配置文件放在本地文件夾中,如:D:/application.properties

3. 命令行執行命令

java -jar boot-config-position-xxxxxx.jar --

spring.config.location=D:/application.properties

這樣即使項目上線了,我們也可以通過修改本地的配置文件,使用一行命令即可,極大方

便了運維人員。

6. 外部配置載入順序

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

可以從以下位置載入配置,優先順序從高到低,高優先順序配置覆蓋低優先順序的,所以配置形

成互補配置。

1. 命令行參數

java -jar boot-config-position-xxxxxx.jar --server.port // 多個配置用空格

隔開

2. 來自java:comp/env的JNDI屬性

3. Java系統屬性(System.getProperties())

4. 操作系統環境變數

5. RandomValuePropertySource配置的random.*屬性值

6. jar包外部的application-{profifile}.properties或application.yml(帶spring.profifile)配

置文件

7. jar包內部的application-{profifile}.properties或application.yml(帶spring.profifile)配

置文件

8. jar包外部的application.properties或application.yml(不帶spring.profifile)配置文件

9. jar包內部的application.properties或application.yml(不帶spring.profifile)配置文件

10. @Confifiguration註解類上的@PropertySource

11. 通過SpringApplication.setDefaultProperties指定的默認屬性

注意:從jar包外向jar包內尋找,優先載入profifile最後載入不帶profifile,更多參考官方文



7. 自動配置原理GitHub對應項目:boot-confifig-autoconfifig

1. 配置文件寫什麼?

配置文件可配置屬性查閱

2. 什麼是註解,如何實現一個註解?

關於註解的機制和相關原理可以移步此篇博客

3. 配置原理解析

我們運行Spring Boot應用是從main方法啟動,在主程序類上有一個

@SpringBootApplication註解。

@SpringBootApplication是一個復合註解,包括@ComponentScan,和

@SpringBootConfifiguration,@EnableAutoConfifiguration。

@SpringBootConfifiguration繼承自@Confifiguration,二者功能也一致,標注當前類

是配置類,並會將當前類內聲明的一個或多個以@Bean註解標記的方法的實例納入到

srping容器中,並且實例名就是方法名。

@EnableAutoConfifiguration的作用啟動自動的配置,@EnableAutoConfifiguration注

解的意思就是SpringBoot根據你添加的jar包來配置你項目的默認配置,比如根據

spring-boot-starter-web ,來判斷你的項目是否需要添加了webmvc和tomcat,就

會自動的幫你配置web項目中所需要的默認配置

@ComponentScan,掃描當前包及其子包下被@Component,@Controller,

@Service,@Repository註解標記的類並納入到spring容器中進行管理。是以前的co

ntext:component-scan(以前使用在xml中使用的標簽,用來掃描包配置的平行支

持)。

@SpringBootApplication註解分析

配置原理視頻講解

4. 自動配置類判斷

在配置文件properties中設置:debug=true 來讓控制台列印自動配置報告,方便的得知

那些配置類生效。

=========================

AUTO-CONFIGURATION REPORT

=========================Positive matches:

-----------------

matched:

- @ConditionalOnClass found required class

'org.springframework.web.servlet.DispatcherServlet';

@ConditionalOnMissingClass did not find unwanted class

(OnClassCondition)

- @ConditionalOnWebApplication (required) found 'session' scope

(OnWebApplicationCondition)

Negative matches:

-----------------

ActiveMQAutoConfiguration:

Did not match:

- @ConditionalOnClass did not find required classes

'javax.jms.ConnectionFactory',

'org.apache.activemq.ActiveMQConnectionFactory' (OnClassCondition)

7. 為什麼xml配置的優先順序大於註解配置的優先順序大於java源代碼的優先順序長

註解配置一般指諸如開放源代碼的對象框架,如Spring(開放源代碼的設計層面框架,他解決的是業務邏輯層和其他各層的松耦合問題)、Hibernate(對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,它將POJO與資料庫表建立映射關系,是一個全自動的orm框架)在使用這個框架的之前要進行相應的配置。配置的方式有三種,xml配置,註解配置(Java註解配置),java配置(Java代碼配置)。關於註解配置和Java配置的區別,此處附上大牛的詳細解答(https://blog.csdn.net/rendong/article/details/54566027)目前關於三種配置的優先順序沒有明確而統一的說法,況且編譯器以及編譯環境的差異,產生的結果差距較大,不可輕易下定結論。但有大牛做了實驗,總結出如下結論:「xml配置與註解配置都執行,默認順序誰先載入誰先執行,指定執行順序 添加order參數 建議: 應該先執行xml 後 執行註解 xml 配置的是統一的。但是可能我想在具體的方法里搞特殊,就自己加註解 例如xml配置了REQUIRED回滾 而我的具體的方法不想回滾但是還要用insert開頭,就可以在註解配置。詳細過程附上原文鏈接:https://blog.csdn.net/xclltssun/article/details/80959563」至於Java源代碼優先順序最後的原因也很清楚了,前面第一個鏈接力講的很清楚,我簡單講下:使用註解的方式,那麼你需要在Serivce層,DAO層的時候,需要在類上進行註解,才可獲得spring的依賴注入;如果使用java配置的方式,那麼就不需要在類上寫註解了,直接在配置類裡面進行申明即可。Java源代碼配置是寫在類裡面的,而註解配置是在類上進行註解,這就相當於一個在房門上,一個在房間里的桌子上,如果有人來拜訪坐在房間裡面的主人自然應該先敲門。註解配置就是那一扇門。本著默認順序——先載入先執行的原則,自然在優先順序上表現為xml配置>註解配置>Java源代碼配置但實際上,我海還是沒有找到關於此方面優先順序明確的定義。

8. 3.Config核心功能和原理

Config作為Spring Cloud官方指定產品,在配置管理方面主要提供了三個功能

經過前面幾個組件的源碼閱讀鍛煉,相信同學們讀起Config來已經不在話下了,作為配置中心的服務端,拉取參數三步走:

如果大家在application.yml中定義了一個屬性test,並使用佔位符${remoteTest}作為test屬性的值,當我們在Config Server中配置remoteTest屬性後,你會發現在項目完成啟動的時候,Config Server中的remoteTest被注入到了配置文件中的test屬性。從這個現象我們可以得出一個結論,應用程序一定是在Spring上下文初始化的早期階段就從Config Server獲取了配置文件,這個過程優先於本地配置項的載入過程。

P.S. 關於文件載入順序在這里多提一句,bootstrap.yml文件在所有文件以前載入,所以Config的配置我們會放在bootstrap.yml中。然後application.properties的載入優先順序比application.yml文件高。

我們來看看應用的初始化方式:

SpringCloud應用同時也是一個SpringBoot應用,因此整個應用的初始化從SpringBoot啟動時的上下文Context構建開始:

和所有的SpringBoot項目一樣,通過SpringApplication類的run方法開始啟動項目初始化和載入流程,其中就包括prepareContext這一步,整個項目的上下文結構就通過這個方法來構建

這是一連串的初始化構造過程,當我們在項目中引入了SpringCloud依賴時,將作為一個初始化構造器,參與SpringBoot上下文的初始化,用來載入SpringCloud的屬性資源

是通過一系列的locator來定位資源文件的,當我們在項目中引入springcloud-config-client的依賴以後,就會開啟Config組件的自動裝配(由實現),在這個自動裝配過程中會向locator列表裡添加一個專門用來獲取遠程文件的類-

定義了執行順序的優先順序是0(通過@Order(0)註解定義),在Spring中這個數字越小則表示優先順序越高,因此,這個組件將優先於其他locator先被執行。通過getRemoteEnvironment方法,向Config Server發起請求,獲取遠程屬性

9. 在web服務搭建中優先順序最高的默認文檔是什麼

Web伺服器的配置與管理

理論基礎

一、Web伺服器的基本概念

World Wide Web(也稱Web、WWW或萬維網)是Internet上集文本、聲音、動畫、視頻等多種媒體信息於一身的信息服務系統,整個系統由Web伺服器、瀏覽器(Browser)及通信協議等3部分組成。WWW採用的通信協議是超文本傳輸協議(HTTP,Hyper Text Transfer Protocol),它可以傳輸任意類型的數據對象,是Internet發布多媒體信息的主要協議。

WWW中的信息資源主要由一篇篇的網頁為基本元素構成,所有網頁採用超文本標記語言HTML(Hyper Text Markup Language)來編寫,即可以含有指向其他Web頁或其本身內部特定位置的超級鏈接,簡稱鏈接。可以將鏈接理解為指向其它Web頁的「指針」。鏈接使得Web頁交織網狀。這樣,如果Internet上的Web頁和鏈接非常多的話,就構成了一個巨大的信息網。當用戶從WWW伺服器取到一個文件後,用戶需要在自己的屏幕上將它正確無誤地顯示出來HTML文檔本身是文本格式的,用任何一種文本編輯器都有可以對它進行編輯。HTML語言HTML語言的語法,專門提供給專業人員用來創建Web文檔,一般用戶並不需要掌握它。Internet中的網站成千上萬。為了准確查找。人們採用了統一資源定位器URL(Uniform Resource Locator)來在全世界唯一標識某個網路資源。其描述格式為:

協議://主機名稱/路徑名/文件名:埠號

例如:客戶程序首先看到http(超文本傳輸協議),知道處理的是HTML連接,接下來的是站點地址(對應一個特定的IP地址),其中www是主機名稱,是域名。至於http協議默認使用的TCP協議埠為80,可省略不寫。如果另外指定埠號就需要在URL後面添加上埠號,例如::24。補充:其實,直接輸入與URL相對應的IP地址也可以找到相應的站點。只是IP地址不直觀,不便於記憶。關於URL和IP地址的轉換問題,我們將在DNS伺服器那節中再給大家進行詳細的講解。

實訓內容

一、實訓環境

兩台主機與交換機相連。WEB伺服器為windows 2000 server及更高版本操作系統,客戶機為WINDOW系列(如windows 2000 professional)操作系統;

本實訓兩人為一組,一人負責使用伺服器,另一人負責在驗證機上驗證測試WWW站點;

兩台裝有Windows 2000 Server操作系統的電腦。一台作為WWW伺服器,另一台作為WWW測試機。一張Windows 2000 Server系統的安裝光碟。

二、實訓要求

1、理解WWW伺服器的體系結構與工作原理;

2、掌握利用Microsoft的IIS實現WWW服務的基本配置;

3、掌握虛擬目錄的配置;

4、能熟練地配置與管理WWW伺服器。

三、實訓步驟

(一)IIS的安裝

1、在Windows 2000中推出了Internet Information Server (簡稱IIS)提供了方便的安裝和管理。因此,在配置與管理WWW伺服器之前,我們應先安裝IIS。打開「控制面板」中的「添加或刪除程序」,選擇「添加/刪除Windows組件」按鈕。

2、在出現「組件安裝向導」中,選擇「Internet信息服務(IIS)」,再選擇「詳細信息」,在彈出的對話框中,我們必須要保證「World Wide Web 伺服器」選項是被選中的。如下圖所示:

3、點「確定」按鈕返回「Windows 組件向導」對話框。再點「下一步」按鈕,即進入了WWW伺服器安裝過程。如下圖片所示:

4、系統將自動安裝WWW,點「完成」按鈕後,WWW便安裝成功了。此時我們打開「開始」菜單——「程序」——「管理工具」——「Internet伺服器管理器」選項後,我們將看到在「Internet信息服務」選項中多了兩個選項:「默認Web站點」和「管理Web站點」選項,並已自動啟動。

熱點內容
api加密java 發布:2025-07-12 18:15:55 瀏覽:443
爬蟲專用編譯器 發布:2025-07-12 18:15:10 瀏覽:458
安卓版糖果傳奇叫什麼 發布:2025-07-12 18:06:26 瀏覽:262
編程素質人 發布:2025-07-12 18:04:17 瀏覽:671
在雲伺服器安裝sqlserver 發布:2025-07-12 18:04:05 瀏覽:737
釘釘oa初始密碼是多少 發布:2025-07-12 18:02:34 瀏覽:72
樓道口防盜門密碼該如何使用 發布:2025-07-12 17:53:55 瀏覽:351
mysql源碼目錄 發布:2025-07-12 17:48:41 瀏覽:442
資料庫導出dmp 發布:2025-07-12 17:39:08 瀏覽:336
濟南少兒編程哪家好 發布:2025-07-12 17:33:09 瀏覽:128