Ⅰ 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