SpringBoot學習(四):springboot中的@PropertySource和@ImportResource註解的使用

一:@PropertySource

Spring boot框架提供了@PropertySource註解,目的是加載指定的屬性文件,接下來我們看一下如何使用該註解。


首先在默認的application.properties文件中添加如下內容

spring.datasource.url=jdbc:mysql://192.168.10.171:3306/Steam?useUnicode=true&characterEncoding=utf8
spring.datasource.name=root

在創建一個dataSource.properties配置文件

內容如下:

spring.datasource.url=jdbc:sqlserver://192.168.xxx.xxx;instanceName=sql_03;DatabaseName=edu;integratedSecurity=false
spring.datasource.name=admin

我們定義一個實體類:DataSourceConfig,添加屬性url,name,並給屬性添加get(),set()方法。

package cn.wq.testproject.Model;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@Component
@PropertySource(value= {"classpath:dataSource.properties"},ignoreResourceNotFound=false,encoding="UTF-8",name="dataSource.properties")
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceConfig {
    private String url;
    private String name;

    public String getUrl() {
        return url;
    }

    public String getName() {
        return name;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public void setName(String name) {
        this.name = name;
    }
}

上述的代碼目的是加載classpath路徑中dataSource.properties配置文件。

value值是設置需要加載的屬性文件,可以一次性加載多個。

其中:

encoding:用於指定讀取屬性文件所使用的編碼,我們通常使用的是UTF-8;

ignoreResourceNotFound:含義是當指定的配置文件不存在是否報錯,默認是false;比如上文中指定的加載屬性文件是dataSource.properties,如果該文件不存在,則ignoreResourceNotFound爲true的時候,程序不會報錯,

如果ignoreResourceNotFound爲false的時候,程序直接報錯。實際項目開發中,最好設置ignoreResourceNotFound爲false。該參數默認值爲false。

 

name的值我們設置的是dataSource.properties。這個值在Springboot的環境中必須是唯一的,如果不設置,則值爲:“class path resource [dataSource.properties]“。

可能很多人比較納悶,爲什麼是“class path resource [dataSource.properties]“呢?這個就涉及到了Spring中對資源文件的封裝類Resource。我們配置的value值爲"classpath:dataSource.properties",因此Spring發現是classpath開頭的,因此最終使用的是Resource的子類ClassPathResource。如果是file開頭的,則最終使用的類是FileSystemResource。

瞭解了上文所述的Resource類之後。我們再次明確一點,如果@PropertySource中如果沒有設置name值,則name值的生成規則是:根據value值查找到最終封裝的Resource子類,然後調用具體的Resource子類實例對象中的getDescription方法,getDescription方法的返回值爲最終的name值。

說實話,name我還沒有研究透,上面對於name的解釋也是網上找的,大家隨意看看,後面有空我再翻翻資料
 

運行測試類

package cn.wq.testproject;

import cn.wq.testproject.Model.*;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
public class TestprojectApplicationTests {
    @Autowired
    DataSourceConfig dataSourceConfig;

	@Test
	public void contextLoads() {
        System.out.println("url============"+dataSourceConfig.getUrl());
        System.out.println("name==========="+dataSourceConfig.getName());
	}

}

 

控制檯輸出,可以看出,他讀取的是默認配置文件application.properties裏的內容。

 

明明我們已經使用@PropertySource註解加載指定的dataSource.properties屬性文件,那爲何沒有讀取dataSource.properties文件裏的內容呢,這是因爲在實體類DataSourceConfig實體在上使用註解@ConfigurationProperties時,前綴prefix="spring.datasource",而默認application.properties配置文件裏也有前綴spring.datasource,所以優先從默認的application.properties配置文件裏讀取,所以我們把dataSource.properties,DataSourceConfig實體類裏的內容稍微更改一下:

 

 

這時再運行測試類,輸出如下圖,可以看出讀取到了指定的dataSource.properties文件的內容

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章