導航:首頁 > 文件管理 > 讀取spring配置文件的方法

讀取spring配置文件的方法

發布時間:2023-08-18 14:47:01

⑴ Springboot 讀取配置文件原理

Springboot 讀取配置文件(application.yaml, application.properties)的過程發生在SpringApplication#prepareEnvironment() 階段,而prepareEnvironment又屬於整個Springboot 應用啟動的非常前置階段,因為Environment的准備是後續bean創建的基礎。讓我們來一探啟動是的詳細code。除去StopWatch這些code,可以發現prepareEnvironment 發生在SpringApplication#run 這在整個應用啟動的多步實質性操作中幾乎是第一步。

而prepareEnvironment中最重要的是通過觸發listener(EventPublishingRunListener)來通過#multicastEvent發出。

而#multicastEvent的實現其實也很簡單,找到相關的監聽的listener,然後一個個的調用他們的Listener#onApplicationEvent(event)方法,而這其中就包括了處理configuration文件的listener。
在Springboot 2.4.0 之前這個處理configuration 文件的lister是ConfigFileApplicationListener,在2.4.0之後,處理configuration 文件的lister是,並且對configuration文件的載入做了較大的改變,導致一些行為可能出現了變化,這也就是下面要詳細講的內容。

Springboot 2.4.0之後,configuration 文件的load順序按照優先順序是如下順序(序號大的會被小的覆蓋):

和之前版本比較,整體的屬性載入順序並無調整,只有Application properties(14,15)這里有順序的調整,具體調整為:

如果存在多個active的profiles,例如[Test, Dev], 那麼對於同時存在兩個profile 配置文件中的配置,後面的profile里的配置(Dev)會覆蓋前面profile(Test)里配置的值。

前面講了這么多,終於要引出Springboot 2.4之後配置文件載入的行為變化了。

考慮這樣的情況,如果我想在跑Springboot test的時候指定特定的profile,那麼可以在Test class中加入@ActiveProfile("Test")。 如果我的應用中存在的某個自定義listener中,會根據當前environment 設置profile,如env.addActiveProfile("Dev")。
當前就會有兩個active profile,由於springboot-test會在調用application#run 前利用DefaultActiveProfilesResolver把@ActiveProfile註解定義的profile(Test)先加入了active的profile,等test run的時候 env.addActiveProfile("Dev") 又會把"Dev"也作為active profile 加入,這時候當前的active profile便為["Test", "Dev"]。

據上面介紹,後面的profile(Dev)對應的configuration 會覆蓋前面的(Test)。可Springboot 2.4.0之前的版本為我們做了調整,讓Test class中@ActiveProfile內定義的profile所對應的配置文件成為最高優先順序。

剛才提到在Springboot 2.4.0 之前這個處理configuration 文件的lister是ConfigFileApplicationListener,我們
來看看ConfigFileApplicationListener的相關code。

查看initializeProfiles(),發現此時對profile的順序做了調整,將activatedViaProperty (Test) 放在最後add,於是profile的順序就變成了[Dev, Test]。

在profiles.poll()時原本profile的順序已經倒了過來,已經變為[Dev, Test], 在load()方法中由於後置的Test profile,application-Test.yaml中的值最終生效了。

可是到了Springboot2.4.0之後,ConfigFileApplicationListener被deprecated了,取而代之的是,通過調用來完成configuration載入。
.java

.java

只是老老實實的set了active profile,並沒有調換profile的順序。最後調用定義在spring.factories中的resource loader class來load 配置文件。

YamlPropertySourceLoader.java

插一句,Springboot為我們提供了很好的yaml文件parse的code,當你需要解析yaml文件時不妨直接參考Springboot的YamlPropertySourceLoader

這樣一旦應用升級到Springboot 2.4.0之後相同的test code會使用application-Dev.yaml中配置的值,造成了test結果的改變。
如果要解決這個問題,根據上面介紹的配置文件優先順序順序,可以在@SpringbootTest中設置properties 來作為最終的配置覆蓋當前profile對應的配置。

了解一個框架很不容易,一個小小的變化都有可能造成應用的行為變化,唯有刨根問底,不斷總結才是framework人解決一切問題的不變的方法論。

⑵ Spring中讀取bean配置文件的幾種方式

BeanFactory允許InputStream作為構造函數的參數,也可以org.springframework.core.io.Resource介面。下面這個例子是用ClassPathResource作為參數:

Resource resource = new ClassPathResource("bean.xml");
BeanFactory factory = new XmlBeanFactory(resource);
ActionBean action = (ActionBean) factory.getBean("actionBean");

如果同一個Bean在配置文件有多個bean的定義,則用下面的方法取得所有的對象:
Resource resource = new ClassPathResource("bean.xml");
ListableBeanFactory factory = new XmlBeanFactory(resource);

Map helloBeans = factory.getBeansOfType(ActionBean.class, false, false);

⑶ springmvc中如何從配置文件中讀取信息

1、第一來步,先新建一個.properties文件源,
app.properties裡面內容
admin=admin
test=test
2、第二步,新建一個xml文件,在applicationContext.xml,
<!-- 用來解析Java Properties屬性文件值(注意class指定的類)-->
<bean id="placeholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:app.properties</value>
</list>
</property>
</bean>
<!-- 把properties裡面的信息讀進來: -->

<bean id="report" class="java.lang.String">
<constructor-arg value="${admin}"/>
</bean>

⑷ Java讀取配置文件的幾種方法


在現實工作中,我們常常需要保存一些系統配置信息,大家一般都會選擇配置文件來完成,本文根據筆者工作中用到的讀取配置文件的方法小小總結一下,主要敘述的是spring讀取配置文件的方法。
一、讀取xml配置文件
(一)新建一個java bean
package chb.demo.vo;
public class HelloBean {
private String helloWorld;
public String getHelloWorld() {
return helloWorld;
}
public void setHelloWorld(String helloWorld) {
this.helloWorld = helloWorld;
}
}
(二)構造一個配置文件
?xml version="1.0" encoding="UTF-8"?
!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" ""
beans
bean id="helloBean" class="chb.demo.vo.HelloBean"
property name="helloWorld"
valueHello!chb!/value
/property
/bean
/beans
(三)讀取xml文件
1.利用
ApplicationContext context = new ("beanConfig.xml");
HelloBean helloBean = (HelloBean)context.getBean("helloBean");
System.out.println(helloBean.getHelloWorld());
2.利用FileSystemResource讀取
Resource rs = new FileSystemResource("D:/software/tomcat/webapps/springWebDemo/WEB-INF/classes/beanConfig.xml");
BeanFactory factory = new XmlBeanFactory(rs);
HelloBean helloBean = (HelloBean)factory.getBean("helloBean");
System.out.println(helloBean.getHelloWorld());
值得注意的是:利用FileSystemResource,則配置文件必須放在project直接目錄下,或者寫明絕對路徑,否則就會拋出找不到文件的異常。
二、讀取properties配置文拿鎮件
這里介紹兩種啟敬技術:利用spring讀取properties 文件和利用java.util.Properties讀取
(一)利用spring讀取properties 文件
我們還利用上面的HelloBean.java文件,構造如下beanConfig.properties文件:
helloBean.class=chb.demo.vo.HelloBean
helloBean.helloWorld=Hello!chb!
屬性文件中的"helloBean"名稱即是Bean的別名設定,.class用於指定類來消旁粗源。
然後利用org.springframework.beans.factory.support.來讀取屬性文件
BeanDefinitionRegistry reg = new DefaultListableBeanFactory();
reader = new (reg);
reader.loadBeanDefinitions(new ClassPathResource("beanConfig.properties"));
BeanFactory factory = (BeanFactory)reg;
HelloBean helloBean = (HelloBean)factory.getBean("helloBean");
System.out.println(helloBean.getHelloWorld());
(二)利用java.util.Properties讀取屬性文件
比如,我們構造一個ipConfig.properties來保存伺服器ip地址和埠,如:
ip=192.168.0.1
port=8080
則,我們可以用如下程序來獲得伺服器配置信息:
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("ipConfig.properties");
Properties p = new Properties();
try {
p.load(inputStream);
} catch (IOException e1) {
e1.printStackTrace();
}
System.out.println("ip:"+p.getProperty("ip")+",port:"+p.getProperty("port"));

⑸ SpringBoot有幾種讀取配置的方式

常見的讀取配置的方式有三種:

第一、@Value註解,比較常用的一種方式。也支持與@propertySource註解何用,指定使用的配置文件

第二、@Configuration註解,讀取配置到類中,批量注入配置屬性

第三、Environment對象,獲取配置文件中所有的屬性的對象

如果你想掌握時下熱門微服務技術棧,跟上時代技術步伐,就去黑馬程序員官網視頻庫看免費視頻。

⑹ 如何在spring中讀取properties配置文件裡面的信息

一般來說。我們會將一些配置的信息放在。properties文件中。 然後使用${}將配置文件中的信息讀取至spring的配置文件。 那麼我們如何在spring讀取properties文件呢。 1.首先。我們要先在spring配置文件中。定義一個專門讀取properties文件的類. 例: <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath*:jdbc.properties</value> <!--要是有多個配置文件,只需在這里繼續添加即可 --> </list> </property> </bean> 這里為什麼用locations(還有一個location) 是因為。一般來說。我們的項目裡面。配置文件可能存在多個。 就算是只有一個。那將來新添加的話。只需在下面再加一個value標簽即可。 而不必再重新改動太多。(當然。性能上是否有影響,這個以當前這種伺服器的配置來說。是基科可以忽略不計的)。 然後我們就可以在jdbc.properties文件中填寫具體的配置信息了。 <!-- 配置C3P0數據源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass"> <value>${jdbc.driverClassName}</value> </property> <property name="jdbcUrl"> <value>${jdbc.url}</value> </property> <property name="user"> <value>${jdbc.username}</value> </property> <property name="password"> <value>${jdbc.password}</value> </property> </bean> jdbc.properties文件寫的信息。 jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/test jdbc.username=root jdbc.password=root 附加一個列子: <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>file:/data/pc-config/passport.properties</value> <value>classpath:memcached.properties</value> </list> </property> </bean> classpath:是指的當前類文件的目錄下。 file:在window下是指的當前分區(比如你的項目是放在d盤,則是在d:/data/pc-config/passport.properties) 在linux下,則是當前路徑下的文件/data/pc-config/passport.properties 轉載僅供參考,版權屬於原作者。祝你愉快,滿意請~~哦

閱讀全文

與讀取spring配置文件的方法相關的資料

熱點內容
word編輯宏選中一段 瀏覽:458
微信怎麼上傳其他文件 瀏覽:220
互聯網數據分析需要哪些指標 瀏覽:844
eps包含鏈接文件 瀏覽:167
怎麼編程一些風景視頻 瀏覽:430
蘋果手機才能領的紅包嗎 瀏覽:823
js操作符 瀏覽:516
怎樣打開db文件里的圖片 瀏覽:820
卡仕達配置文件 瀏覽:419
怎樣恢復直接刪除的文件 瀏覽:587
pg資料庫怎麼遷移庫 瀏覽:610
什麼軟體存放文件不能下載的 瀏覽:888
jsp的書籍推薦 瀏覽:330
大數據處理培訓有哪些 瀏覽:163
蘋果二手機檢測多少錢 瀏覽:482
qq生日許願保存到哪了 瀏覽:658
鬥地主發牌程序c語言 瀏覽:996
cad安裝上為什麼文件夾是空的 瀏覽:676
mp3文件多少位元組 瀏覽:261
哪個飾品批發網站好 瀏覽:944

友情鏈接