Java中讀取Properties配置文件的幾種方式

一霞丧、Java jdk讀取Properties配置文件

1创葡、通過jdk提供的java.util.Properties類

2唬党、通過java.util.ResourceBundle類來讀取

代碼示例如下:

    /**
     * 方式一:通過jdk提供的java.util.Properties類滑频。
     * 這種方式需要properties文件的絕對路徑
     */
    public  void readProperties()  {
        ClassLoader cl = PropertiesDemo. class .getClassLoader();
        Properties p=new Properties();
        InputStream in= null;
        try {
            // 可根據(jù)不同的方式來獲取InputStream
            //方式一:InputStream is=new FileInputStream(filePath);  這種方式需要properties文件的絕對路徑
            // in = new BufferedInputStream(new FileInputStream("D:\tanyang\study-demo\example\src\main\java\com\ty\demo\example\properties\test.properties"));
            
            //方式三:通過PropertiesDemo.class.getClassLoader().getResourceAsStream(fileName)
            //  這個方式要求文件在classpath下
            //in = PropertiesDemo.class.getClassLoader().getResourceAsStream("test.properties");
            if  (cl !=  null ) {
                in = cl.getResourceAsStream( "test.properties" );
            }  else {
                in = ClassLoader.getSystemResourceAsStream( "test.properties" );
            }
            p.load(in);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally {
            try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        System.out.println(p.getProperty( "test.port" ).trim());
        System.out.println(p.getProperty( "test.siteName" ).trim());
    }

3腺逛、 maven 工程讀取配置文件同上!

二著拭、 spring 讀取properties文件

1纱扭、通過xml方式加載properties文件

我們以Spring實例化dataSource為例,我們一般會在beans.xml文件中進行如下配置:

 <!-- com.mchange.v2.c3p0.ComboPooledDataSource類在c3p0-0.9.5.1.jar包的com.mchange.v2.c3p0包中 -->  
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">  
    <property name="driverClass" value="com.mysql.jdbc.Driver" />  
    <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/shop" />  
    <property name="user" value="root" />  
    <property name="password" value="root" />  
</bean>

現(xiàn)在如果我們要改變dataSource儡遮,我們就得修改這些源代碼乳蛾,但是我們?nèi)绻褂胮roperties文件的話,只需要修改那里面的即可鄙币,就不管源代碼的東西了肃叶。那么如何做呢?
Spring中有個<context:property-placeholder location=""/>標簽十嘿,可以用來加載properties配置文件因惭,location是配置文件的路徑,我們現(xiàn)在在工程目錄的src下新建一個conn.properties文件绩衷,里面寫上上面dataSource的配置:

dataSource=com.mchange.v2.c3p0.ComboPooledDataSource  
driverClass=com.mysql.jdbc.Driver  
jdbcUrl=jdbc\:mysql\://localhost\:3306/shop  
user=root  
password=root  

現(xiàn)在只需要在beans.xml中做如下修改即可:

<context:property-placeholder location="classpath:conn.properties"/><!-- 加載配置文件 -->  
  
<!-- com.mchange.v2.c3p0.ComboPooledDataSource類在c3p0-0.9.5.1.jar包的com.mchange.v2.c3p0包中 -->  
 <bean id="dataSource" class="${dataSource}"> <!-- 這些配置Spring在啟動時會去conn.properties中找 -->  
    <property name="driverClass" value="${driverClass}" />  
    <property name="jdbcUrl" value="${jdbcUrl}" />  
    <property name="user" value="${user}" />  
    <property name="password" value="${password}" />  
 </bean>  

<context:property-placeholderlocation=""/>標簽也可以用下面的<bean>標簽來代替,<bean>標簽我們更加熟悉咳燕,可讀性更強:

<!-- 與上面的配置等價勿决,下面的更容易理解 -->  
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
    <property name="locations"> <!-- PropertyPlaceholderConfigurer類中有個locations屬性低缩,接收的是一個數(shù)組,即我們可以在下面配好多個properties文件 -->  
        <array>  
            <value>classpath:conn.properties</value>  
        </array>  
    </property>  
</bean>  

雖然看起來沒有上面的<context:property-placeholder location=""/>簡潔曹货,但是更加清晰,建議使用后面的這種控乾。但是這個只限于xml的方式,即在beans.xml中用${key}獲取配置文件中的值value蜕衡。

2设拟、通過注解方式加載properties文件

我們來看一個例子:假如我們要在程序中獲取某個文件的絕對路徑,我們很自然會想到不能在程序中寫死久脯,那么我們也可以寫在properties文件中纳胧。還是在src目錄下新建一個public.properties文件,假設(shè)里面寫了一條記錄:

filePath=E\:\\web\\apache-tomcat-8.0.26\\webapps\\E_shop\\image

如果想在java代碼中通過注解來獲取這個filePath的話帘撰,首先得在beans.xml文件中配置一下注解的方式:

<!-- 第二種方式是使用注解的方式注入跑慕,主要用在java代碼中使用注解注入properties文件中相應(yīng)的value值 -->  
<bean id="prop" class="org.springframework.beans.factory.config.PropertiesFactoryBean">  
    <property name="locations"><!-- 這里是PropertiesFactoryBean類,它也有個locations屬性摧找,也是接收一個數(shù)組核行,跟上面一樣  
        <array>  
            <value>classpath:public.properties</value>  
        </array>  
    </property>  
</bean>

現(xiàn)在我們可以在java代碼中使用注解來獲取filePath的值了:

@Component("fileUpload")  
public class FileUploadUtil implements FileUpload {  
      
    private String filePath;  
    @Value("#{prop.filePath}")   
    //@Value表示去beans.xml文件中找id="prop"的bean,它是通過注解的方式讀取properties配置文件的蹬耘,然后去相應(yīng)的配置文件中讀取key=filePath的對應(yīng)的value值  
    public void setFilePath(String filePath) {  
        System.out.println(filePath);  
        this.filePath = filePath;  
    }

注意要有set方法才能被注入進來芝雪,注解寫在set方法上即可。在setFilePath方法中通過控制臺打印filePath是為了在啟動tomcat的時候综苔,觀察控制臺有沒有輸出來惩系,如果有,說明Spring在啟動時如筛,已經(jīng)將filePath給加載好了

3. 利用spring 的PropertiesBeanDefinitionReader來讀取屬性文件

spring提供了有兩種方式的bean definition解析器:PropertiesBeanDefinitionReader和XmLBeanDefinitionReader即屬性文件格式的bean definition解析器和xml文件格式的bean definition解析器堡牡。
PropertiesBeanDefinitionReader 屬性文件bean definition解析器
作用:一種簡單的屬性文件格式的bean definition解析器,提供以Map/Properties類型ResourceBundle類型定義的bean的注冊方法杨刨。
我感覺該方法不是特別靈活晤柄,想了解可以查看這篇文章Spring設(shè)置與讀取.properties配置文件的bean

4.spring boot 讀取自定義roperties配置文件

實際開發(fā)中為了不破壞spring boot核心文件的原生態(tài),但又需要有自定義的配置信息存在拭嫁,一般情況下會選擇自定義配置文件來放這些自定義信息可免,這里在resources/config目錄下創(chuàng)建配置文件test.properties

內(nèi)容如下:

test.port=8082
test.siteName=無憂2
創(chuàng)建管理配置的實體類
@PropertySource(value={"classpath:config/test.properties"})
@ConfigurationProperties(prefix = "test")
@Component
public class SpringReadProperties {

    private String port;
    private String siteName;

    public static void main(String[] args) {

    }
    public String getPort() {
        return port;
    }
    public void setPort(String port) {
        this.port = port;
    }
    public String getSiteName() {
        return siteName;
    }
    public void setSiteName(String siteName) {
        this.siteName = siteName;
    }
    @Override
    public String toString() {
        return "SpringReadProperties{" +
                "port='" + port + '\'' +
                ", siteName='" + siteName + '\'' +
                '}';
    }
}

創(chuàng)建測試Controller
@Controller
public class TestController {
    @Autowired
    private SpringReadProperties properties;
    @RequestMapping(value = "/test")
    public  void readProperties()  {
        System.out.println(properties.toString());

    }
}

注意:由于在SpringReadProperties類上加了注釋@Component,所以可以直接在這里使用@Autowired來創(chuàng)建其實例對象做粤。

訪問:http://localhost:8080/test 時將得到

SpringReadProperties{port='8082', siteName='無憂2'}

三、利用第三方配置工具owner讀取配置文件

1捉撮、添加maven 依賴

<dependency>
    <groupId>org.aeonbits.owner</groupId>
    <artifactId>owner</artifactId>
    <version>1.0.9</version>
</dependency>

2.在resources/config目錄下創(chuàng)建配置文件test.properties

內(nèi)容如下:

test.port=8082
test.siteName=無憂2

3.創(chuàng)建配置管理 ConfigCenter

@Config.Sources({"classpath:config/test.properties"})
public interface ConfigCenter extends Config {

ConfigCenter I = ConfigFactory.create(ConfigCenter.class);
@Key("test.port")
@DefaultValue("")
String getPort();

@Key("test.siteName")
@DefaultValue("無憂")
String getSiteName();

}

@Sources里面可以配置多個文件
配置文件之間還可以相互繼承

4怕品、測試

        ConfigCenter cfg = ConfigFactory.create(ConfigCenter.class);
        System.out.println(cfg.getPort());

        ConfigCenter instance = ConfigCache.getOrCreate(ConfigCenter.class);

        System.out.println(instance.getSiteName());

建議使用configCache獲取,單例巾遭。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肉康,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子灼舍,更是在濱河造成了極大的恐慌吼和,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件骑素,死亡現(xiàn)場離奇詭異炫乓,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門末捣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侠姑,“玉大人莽红,你說我怎么就攤上這事邦邦。” “怎么了柳畔?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵薪韩,是天一觀的道長捌锭。 經(jīng)常有香客問我,道長拉盾,這世上最難降的妖魔是什么豁状? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任泻红,我火速辦了婚禮,結(jié)果婚禮上谊路,老公的妹妹穿的比我還像新娘。我一直安慰自己缠劝,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布秉馏。 她就那樣靜靜地躺著脱羡,像睡著了一般免都。 火紅的嫁衣襯著肌膚如雪琴昆。 梳的紋絲不亂的頭發(fā)上馆揉,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音舷暮,去河邊找鬼噩茄。 笑死,一個胖子當(dāng)著我的面吹牛沥割,可吹牛的內(nèi)容都是我干的凿菩。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼椒拗,長吁一口氣:“原來是場噩夢啊……” “哼蚀苛!你這毒婦竟也來了玷氏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤兴溜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后刨沦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡召庞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了忘古。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诅诱。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡娘荡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出争群,到底是詐尸還是另有隱情,我是刑警寧澤换薄,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布轻要,位于F島的核電站遏餐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏柏蘑。R本人自食惡果不足惜粹庞,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望革半。 院中可真熱鬧流码,春花似錦、人聲如沸六敬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽审编。三九已至,卻和暖如春砰嘁,著一層夾襖步出監(jiān)牢的瞬間伤溉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工板祝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留走净,地道東北人。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓橘洞,卻偏偏與公主長得像炸枣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子适肠,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容