導航:首頁 > 文件管理 > spring啟動載入配置文件

spring啟動載入配置文件

發布時間:2023-05-18 14:35:43

Ⅰ 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)

Ⅱ 如何在Spring容器中載入自定義的配置文件

自定義配置文件
配置文件名為:project.properties,內容如下:

[html] view plain
# 是否開啟邏輯刪除
project_del.filter.on=false
project_domain=

修改Spring配置文件
之前代碼

[html] view plain
<beanidbeanid="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<propertynamepropertyname="locations">
<list>
<value>classpath:dbinfo.properties</value>
</list>
</property>
</bean>

修改後的配置文件

[html] view plain
<beanidbeanid="propertyConfigurer"
class="com.hisun.core.util.">
<propertynamepropertyname="locations">
<list>
<value>classpath:dbinfo.properties</value>
<value>classpath:project.properties</value>
</list>
</property>
</bean>

加入了classpath:project.properties,其為自定義的配置文件
將PropertyPlaceholderConfigurer類修改為自定義類,
PropertyPlaceholderConfigurer類的具體作用可以查資料這塊兒不做詳細介紹
注意下:這個configurer類獲取的是所有properties的屬性map,如果希望處理某個properties文件,需要在properties中
做一個命名區別,然後在載入的時候,根據key的前綴,進行獲取。
定義類
類的具體內容為下,

[java] view plain
importjava.util.HashMap;
importjava.util.Map;
importjava.util.Properties;

importorg.springframework.beans.BeansException;
importorg.springframework.beans.factory.config.;
importorg.springframework.beans.factory.config.PropertyPlaceholderConfigurer;

publicclass {
privatestatic Map ctxPropertiesMap;

@Override
protectedvoid processProperties( beanFactoryToProcess,
Properties props)throws BeansException {
super.processProperties(beanFactoryToProcess, props);
ctxPropertiesMap =new HashMap();
for(Object key : props.keySet()) {
String keyStr = key.toString();
if(keyStr.startsWith("project_")){
String value = props.getProperty(keyStr);
ctxPropertiesMap.put(keyStr, value);
}

}
}
publicstatic Object getContextProperty(String name) {
returnctxPropertiesMap.get(name);
}
}

定義獲取配置文件中值的類SpringPropertiesUtil
類的具體內容如下:

[java] view plain
importorg.springframework.beans.BeansException;
importorg.springframework.context.ApplicationContext;
importorg.springframework.context.ApplicationContextAware;
importorg.springframework.stereotype.Component;

/**
* Spring-PropertiesUtil工具類 -獲取屬性值
*
*/
@Component
publicclass SpringPropertiesUtil {
publicstatic final String KEY = "propertyConfigurer";
privatestatic ApplicationContext applicationContext;

publicvoid setApplicationContext(ApplicationContext applicationContext)
throwsBeansException {
SpringPropertiesUtil.applicationContext = applicationContext;
}

publicstatic ApplicationContext getApplicationContext() {
returnapplicationContext;
}

/**
* 獲取配置文件中的內容
*
* @param keyName
* @return
*/
publicstatic String parseStr(String keyName) {
cp = () applicationContext
.getBean(KEY);
returncp.getContextProperty(keyName).toString();
}

/**
* 獲取配置文件中的內容
*
* @param keyName
* @return
*/
publicstatic int parseInt(String keyName) {
cp = () applicationContext
.getBean(KEY);
returnInteger.parseInt(cp.getContextProperty(keyName).toString());
}

/**
* 獲取配置文件中的內容
*
* @param keyName
* @return
*/
publicstatic double parseDouble(String keyName) {
cp = () applicationContext
.getBean(KEY);
returnDouble.parseDouble(cp.getContextProperty(keyName).toString());
}
}

這樣,在項目當中就能夠方便快速的獲取properties文件中配置的參數
如SpringPropertiesUtil.parseStr(「content」)

Ⅲ springboot實現動態載入遠程配置文件

有個獨立的API項目,該項目主要是對外部各個系統提供API介面,為了保證調用的安全,需要對請求進行校驗,主要校驗包括調用頻率,訪問IP,是否跨域和Token,其中IP和是否跨域的配置會根據接入方進行相應的修改,為了避免每次有新的接入方就得去修改一次配置文件並重啟項目,所以打算使用動態配置的方式。

初級實現方案:API服務每隔5分鍾向管理端請求一次數據,管理端添加IP和域白名單的管理,這個實現方案,簡單好用,但是弊端也明顯,管理端每次修改完配置後,客戶端需要等待下次請求後才會載入對應的配置,同時,還需要自己管理獲取到的配置文件

更新方案:在springboot啟動時,先從遠端獲取配置文件,並將其載入進Environment對象中,其餘的,就都交給Spring了。同時配合spring-cloud-context實現遠程配置變更後,本地重新拉取配置並更新

點進去之後,springboot會在這里初始化ConfigurableEnvironment對象

這里是給ConfigurableEnvironment做一些初始化工作,我們先不管了,重點在這里,listeners.environmentPrepared(environment);,Springboot通過事件,將Environment的載入分發出去

到此為止,我們就能像使用本地配置文件一樣使用伺服器上的配置文件了,但是這里還只實現了載入遠程配置文件,我們還需要在遠程配置文件變更時,實現配置文件的熱更新

Ⅳ Maven-Spring多項目載入配置文件

1,classpath:applicationContext.xml改為classpath*:applicationContext.xml
這么寫也是一樣的效果:classpath*:/applicationContext.xml
2,在applicationContext.xml引用其它的配置文件:
如果在同一個專jar包這么寫,

Java代碼

<importresource="classpath:/applicationContext-action.xml"/>

要導入其它jar包中屬的配置文件,這么寫

Java代碼

<importresource="classpath*:/applicationContext-service.xml"/>

就這么簡單,重新打包、部署、啟動成功。

Ⅳ spring如何動態載入配置文件,就是配置文件修改了,application.xml如何能讀取到

項目,需要訪問多個資料庫,而且需要在伺服器運行不重新啟動的情況下,動態的修改spring中配置的數據源datasource,在網上找了很多資料,最後找到了適合我的方法,下面總結一下。
spring的配置文件是在容器啟動的時候就載入到內存中的,如果手動改了application.xml,我們必須要重新啟動伺服器配置文件才會生效。而在spring中提供了一個類WebApplicationContext,這個類可以讓你獲得一些bean,可以修改內存中的信息,我就是通過這個類來實現的。下面是我具體的代碼。

package com.southdigital.hospital;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class ChangeSpringConfig extends HttpServlet
{

private String ipAddress = "127.0.0.1";

/**
* The doGet method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to get.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
doPost(request, response);
}

/**
* The doPost method of the servlet. <br>
*
* This method is called when a form has its tag value method equals to post.
*
* @param request the request send by the client to the server
* @param response the response send by the server to the client
* @throws ServletException if an error occurred
* @throws IOException if an error occurred
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
//先取得servleContext對象,提供給spring的WebApplicationUtils來動態修改applicationContext.xml

ipAddress = request.getParameter("ipAddress");
System.out.println(ipAddress);

ServletContext servletContext = this.getServletContext();
WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);
ComboPooledDataSource cpds = (ComboPooledDataSource) applicationContext.getBean("dataSource");
cpds.setJdbcUrl("jdbc:mysql://"+ipAddress+":3306/ssh");

}

}
注意:通過這種方法修改applicationContext.xml文件的時候用c3p0,而不可以用dbcp,dbcp不支持動態修改讀取到內存裡面的數據。
spring 3.1已經支持了。

Ⅵ 二、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)

Ⅶ Spring Boot 第二彈,配置文件詳解-史上最全

  Spring Boot 官方 提供了兩種常用的配置文件格式,分別是 properties 、 YML 格式。相比於 properties 來說, YML 更加年輕,層級也是更加分明。 強烈推薦使用 YML 格式

  Spring Boot項目 啟動會掃描以下位置的 application.properties 或者 application.yml 作為默認的配置文件.

徒手撕源碼

內部類Loader的load方法

getSearchLocations()方法

asResolvedSet()

下面給出優先順序 從高到低 的配置文件排列順序:

以設置應用埠為例 初體驗Spring Boot配置文件

properties後綴結尾(application.properties)

yml/yaml後綴結尾(application.yml/application.yaml)

數字,字元串,布爾,日期

對象、Map

數組

數字,字元串,布爾,日期

對象、Map

數組

@ConfigurationProperties(prefix = "person")詳解

標注在類上

標注在方法上

綜上所述

  @ConfigurationProperties 註解能夠輕松的讓配置文件跟實體類綁定在一起。

 值得關注的是: @ConfigurationProperties 這個註解僅僅是支持從 Spring Boot的默認配置文件 中取值,也就是 application.properties 、 application.yml 、 application.yaml ,那我們如何從自定義配置文件取值呢???

 別著急,有解決辦法,那就是再加一個註解: @PropertySource(value = "classpath:custom-profile.properties") ,下面會有對 @PropertySource 註解的介紹。請耐心往下面看。

使用@PropertySource註解

對應配置文件

創建兩個配置文件 custom-profile.yml、custom-profile1.yml ,如下去引入。

我們可以通過控制變數法進行測試,具體過程我這里就不贅述了。

直接說 結論 吧: Spring載入順序 為 從左到右順序載入 ,後載入的會 覆蓋 先載入的屬性值。

另外需要注意的是 : @PropertySource 默認載入 xxx.properties類型 的配置文件,不能載入 YML格式 的配置文件。如何解決呢?下面來解決這一問題

對應配置文件:

編寫PropertiesController

擴展功能

application.yml 主配置文件

application-dev.yml 開發配置文件

application-prod.yml 生產配置文件

application-test.yml 測試配置文件

(1)主配置文件:配置激活選項

(2)其他配置文件:指定屬於哪個環境(同yml,只不過表現形式是 key=value 的,三個配置文件分別是: application-dev.properties , application-prod.properties , application-test.properties )

 無論是使用上述 多文檔塊 的方式,還是新建 application-test.yml 文件,都可以在配置文件中指定 spring.profiles.active=test 激活指定的profile。

感謝閱讀小生文章。祝大家早日富可敵國,實現財富自由。

寫文不易 ,一定要 點贊、評論、收藏哦 , 感謝感謝感謝!!!

Ⅷ Spring載入配置文件的方式

轉: https://blog.csdn.net/HaHa_Sir/article/details/79105951

1、用法示例團知培: 在spring.xml配置文件中添加標簽

2、在 spring.xml 中使用配置文件屬性:

3、在java文件中使用:
需開啟註解注入:
<context:annotation-config/> 或 <context:component-scan/>

1、用法示例: 在spring.xml配置文件中添加標簽

2、在spring.xml 中使用配置文件塌唯屬性:

3、在java文件中使用:

1、用法示例:猛梁在java類文件中使用 PropertySource 註解:

2、在java文件中使用:

1、用法示例:在 spring.xml 中使用 <bean>標簽進行配置

2、 PropertyPlaceholderConfigurer 配置方法,等價於 方式一,用法參考方法一

五、 還可以使用 org.springframework.beans.factory.config.PropertiesFactoryBean 載入,這里不再逐一列舉了。

Ⅸ Spring載入XML的過程

首先,Spring載入配置文件是在refresh#obtainFreshBeanFactory方法中進行的。

邏輯是在loadBeanDefinitions方法中進行的,Spring對loadBeanDefinitions方法做了很多重載。

在new ResourceEntityResolver(this)中

這里初始化了xsd/dtd的映射類,現在一般是使用xsd。
PluggableSchemaResolver#resolveEntity方法會讀取META-INF/Spring.schemas文件,該文件配置的是kv數據,k是xsd的網路地址,v是本地地址,為了防止在未聯網的情況下解析不了標簽。

這里遍歷了配置文件數組

doLoadDocument載入了配置文件主要看registerBeanDefinitions方法

parseBeanDefinitionElement(
Element ele, String beanName, @Nullable BeanDefinition containingBean)

在這個方法中就是解析標簽中的屬性了,將BeanDefinition創建出來,把屬性set到BeanDefinition中

Ⅹ Springboot 使用@RefreshScope 註解,實現配置文件的動態載入

實現配置文件動態讀取的好處不必多說,修改配置文件後不必重啟Application ,想想就開心。

合格調包俠的必備技能,從Maven倉庫引入依賴的Jar包,

搞好配置文件,默認在application.yml /properties 就行,與本功能相關的配置項(採用yml格式)如下:

distributed-id是自定義需要動態部署的配置文件。management:是暴露refresh介面,不加此條配置將無法啟用動態載入配置文件的功能(也就是管你理解不理解,別問,加就對了)。

1.編寫自定義配置文件的Java對象,一定要在類上加@RefreshScope註解

@data是lombok的註解,別的註解不多說。

2.編寫你的conroller ,也一定要加@RefreshScope註解, 不加的話,呵呵,對不起,無法運行。。原因嗎---在這 @RefreshScope not working - Spring Boot - Stack Overflow

   我這里是返回配置文件中distributed-id.mechineId的值。

3.到此為止了,簡單吧😒。其實的話,第一步也可以直接在Bean的配置中心(也就是@Configuration註解的類)搞一下,效果是一樣的。

使用這種寫法,就可以不用在配置對象類上加@Component和@RefreshScope。

測試一下啦,啟動應用前,將配置文件設置如下:

運行程序後,在瀏覽器輸入你的測試地址,返回如下,是5沒錯了:

然後找到你編譯後文件,修改配置文件的值,注意是 編譯後的配置文件     就是下圖中灰色文件的位置

修改如下:mechineId修改為4

接下來向 http://localhost:port/actuator/refresh 發送 POST 請求,get請求是無法識別的呦😘,可以看到返回了配置文件中被更改的屬性

測試一下,沒錯了,返回值為4

閱讀全文

與spring啟動載入配置文件相關的資料

熱點內容
windows7系統共享文件 瀏覽:62
ps前往文件夾 瀏覽:694
信捷plc編程用哪個軟體 瀏覽:939
vba導入文件 瀏覽:690
更新後版本英文怎麼說 瀏覽:267
桌面雲配置文件分離 瀏覽:505
iphone5如何升級4g網路 瀏覽:5
團購是在哪個app 瀏覽:897
打開多個word文檔圖片就不能顯示 瀏覽:855
騰訊新聞怎麼切換版本 瀏覽:269
app安裝失敗用不了 瀏覽:326
桌面文件滑鼠點開會變大變小 瀏覽:536
手機誤刪系統文件開不了機 瀏覽:883
微信兔子甩耳朵 瀏覽:998
android藍牙傳文件在哪裡 瀏覽:354
蘋果6s軟解是真的嗎 瀏覽:310
c語言代碼量大 瀏覽:874
最新網路衛星導航如何使用 瀏覽:425
以下哪些文件屬於圖像文件 瀏覽:774
zycommentjs 瀏覽:414

友情鏈接