亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解五種方式讓你在java中讀取properties文件內(nèi)容不再是難題

 更新時(shí)間:2016年12月26日 17:03:31   作者:程序猿到攻城獅之旅  
這篇文章主要介紹了詳解五種方式讓你在java中讀取properties文件內(nèi)容不再是難題 ,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。

一、背景

最近,在項(xiàng)目開發(fā)的過程中,遇到需要在properties文件中定義一些自定義的變量,以供java程序動(dòng)態(tài)的讀取,修改變量,不再需要修改代碼的問題。就借此機(jī)會(huì)把Spring+SpringMVC+Mybatis整合開發(fā)的項(xiàng)目中通過java程序讀取properties文件內(nèi)容的方式進(jìn)行了梳理和分析,先和大家共享。

二、項(xiàng)目環(huán)境介紹

  • Spring 4.2.6.RELEASE
  • SpringMvc 4.2.6.RELEASE
  • Mybatis 3.2.8
  • Maven 3.3.9
  • Jdk 1.7
  • Idea 15.04

三、五種實(shí)現(xiàn)方式

方式1.通過context:property-placeholder加載配置文件jdbc.properties中的內(nèi)容

<context:property-placeholder location="classpath:jdbc.properties" ignore-unresolvable="true"/>

上面的配置和下面配置等價(jià),是對(duì)下面配置的簡(jiǎn)化

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="ignoreUnresolvablePlaceholders" value="true"/>
  <property name="locations">
   <list>
     <value>classpath:jdbc.properties</value>
   </list>
  </property>
</bean>

注意:這種方式下,如果你在spring-mvc.xml文件中有如下配置,則一定不能缺少下面的紅色部分,關(guān)于它的作用以及原理.

<!-- 配置組件掃描,springmvc容器中只掃描Controller注解 -->
<context:component-scan base-package="com.hafiz.www" use-default-filters="false">
  <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

方式2.使用注解的方式注入,主要用在java代碼中使用注解注入properties文件中相應(yīng)的value值

<bean id="prop" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
  <!-- 這里是PropertiesFactoryBean類,它也有個(gè)locations屬性,也是接收一個(gè)數(shù)組,跟上面一樣 -->
  <property name="locations">
    <array>
     <value>classpath:jdbc.properties</value>
    </array>
  </property>
</bean>

方式3.使用util:properties標(biāo)簽進(jìn)行暴露properties文件中的內(nèi)容

<util:properties id="propertiesReader" location="classpath:jdbc.properties"/>

注意:使用上面這行配置,需要在spring-dao.xml文件的頭部聲明以下紅色的部分

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.2.xsd
    http://www.springframework.org/schema/util 
     http://www.springframework.org/schema/util/spring-util.xsd">

方式4.通過PropertyPlaceholderConfigurer在加載上下文的時(shí)候暴露properties到自定義子類的屬性中以供程序中使用

<bean id="propertyConfigurer" class="com.hafiz.www.util.PropertyConfigurer">
  <property name="ignoreUnresolvablePlaceholders" value="true"/>
  <property name="ignoreResourceNotFound" value="true"/>
  <property name="locations">
    <list>
     <value>classpath:jdbc.properties</value>
    </list>
  </property>
</bean>

自定義類PropertyConfigurer的聲明如下:

package com.hafiz.www.util;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;

import java.util.Properties;

/**
 * Desc:properties配置文件讀取類
 * Created by hafiz.zhang on 2016/9/14.
 */
public class PropertyConfigurer extends PropertyPlaceholderConfigurer {

  private Properties props;    // 存取properties配置文件key-value結(jié)果

  @Override
  protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props)
              throws BeansException {
    super.processProperties(beanFactoryToProcess, props);
    this.props = props;
  }

  public String getProperty(String key){
    return this.props.getProperty(key);
  }

  public String getProperty(String key, String defaultValue) {
    return this.props.getProperty(key, defaultValue);
  }

  public Object setProperty(String key, String value) {
    return this.props.setProperty(key, value);
  }
}

使用方式:在需要使用的類中使用@Autowired注解注入即可。

方式5.自定義工具類PropertyUtil,并在該類的static靜態(tài)代碼塊中讀取properties文件內(nèi)容保存在static屬性中以供別的程序使用

package com.hafiz.www.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.util.Properties;

/**
 * Desc:properties文件獲取工具類
 * Created by hafiz.zhang on 2016/9/15.
 */
public class PropertyUtil {
  private static final Logger logger = LoggerFactory.getLogger(PropertyUtil.class);
  private static Properties props;
  static{
    loadProps();
  }

  synchronized static private void loadProps(){
    logger.info("開始加載properties文件內(nèi)容.......");
    props = new Properties();
    InputStream in = null;
    try {
       <!--第一種,通過類加載器進(jìn)行獲取properties文件流-->
      in = PropertyUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
       <!--第二種,通過類進(jìn)行獲取properties文件流-->
      //in = PropertyUtil.class.getResourceAsStream("/jdbc.properties");
      props.load(in);
    } catch (FileNotFoundException e) {
      logger.error("jdbc.properties文件未找到");
    } catch (IOException e) {
      logger.error("出現(xiàn)IOException");
    } finally {
      try {
        if(null != in) {
          in.close();
        }
      } catch (IOException e) {
        logger.error("jdbc.properties文件流關(guān)閉出現(xiàn)異常");
      }
    }
    logger.info("加載properties文件內(nèi)容完成...........");
    logger.info("properties文件內(nèi)容:" + props);
  }

  public static String getProperty(String key){
    if(null == props) {
      loadProps();
    }
    return props.getProperty(key);
  }

  public static String getProperty(String key, String defaultValue) {
    if(null == props) {
      loadProps();
    }
    return props.getProperty(key, defaultValue);
  }
}

說明:這樣的話,在該類被加載的時(shí)候,它就會(huì)自動(dòng)讀取指定位置的配置文件內(nèi)容并保存到靜態(tài)屬性中,高效且方便,一次加載,可多次使用。

四、注意事項(xiàng)及建議

以上五種方式,前三種方式比較死板,而且如果你想在帶有@Controller注解的Bean中使用,你需要在SpringMVC的配置文件spring-mvc.xml中進(jìn)行聲明,如果你想在帶有@Service、@Respository等非@Controller注解的Bean中進(jìn)行使用,你需要在Spring的配置文件中spring.xml中進(jìn)行聲明。

我個(gè)人比較建議第四種和第五種配置方式,第五種為最好,它連工具類對(duì)象都不需要注入,直接調(diào)用靜態(tài)方法進(jìn)行獲取,而且只一次加載,效率也高。而且前三種方式都不是很靈活,需要修改@Value的鍵值。

五、測(cè)試驗(yàn)證是否可用

1.首先我們創(chuàng)建PropertiesService

package com.hafiz.www.service;

/**
 * Desc:java程序獲取properties文件內(nèi)容的service
 * Created by hafiz.zhang on 2016/9/16.
 */
public interface PropertiesService {

  /**
   * 第一種實(shí)現(xiàn)方式獲取properties文件中指定key的value
   *
   * @return
   */
  String getProperyByFirstWay();

  /**
   * 第二種實(shí)現(xiàn)方式獲取properties文件中指定key的value
   *
   * @return
   */
  String getProperyBySecondWay();

  /**
   * 第三種實(shí)現(xiàn)方式獲取properties文件中指定key的value
   *
   * @return
   */
  String getProperyByThirdWay();

  /**
   * 第四種實(shí)現(xiàn)方式獲取properties文件中指定key的value
   *
   * @param key
   *
   * @return
   */
  String getProperyByFourthWay(String key);

  /**
   * 第四種實(shí)現(xiàn)方式獲取properties文件中指定key的value
   *
   * @param key
   *
   * @param defaultValue
   *
   * @return
   */
  String getProperyByFourthWay(String key, String defaultValue);

  /**
   * 第五種實(shí)現(xiàn)方式獲取properties文件中指定key的value
   *
   * @param key
   *
   * @return
   */
  String getProperyByFifthWay(String key);

  /**
   * 第五種實(shí)現(xiàn)方式獲取properties文件中指定key的value
   *
   * @param key
   *
   * @param defaultValue
   *
   * @return
   */
  String getProperyByFifthWay(String key, String defaultValue);
}

2.創(chuàng)建實(shí)現(xiàn)類PropertiesServiceImpl

package com.hafiz.www.service.impl;

import com.hafiz.www.service.PropertiesService;
import com.hafiz.www.util.PropertyConfigurer;
import com.hafiz.www.util.PropertyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

/**
 * Desc:java程序獲取properties文件內(nèi)容的service的實(shí)現(xiàn)類
 * Created by hafiz.zhang on 2016/9/16.
 */
@Service
public class PropertiesServiceImpl implements PropertiesService {

  @Value("${test}")
  private String testDataByFirst;

  @Value("#{prop.test}")
  private String testDataBySecond;

  @Value("#{propertiesReader[test]}")
  private String testDataByThird;

  @Autowired
  private PropertyConfigurer pc;

  @Override
  public String getProperyByFirstWay() {
    return testDataByFirst;
  }

  @Override
  public String getProperyBySecondWay() {
    return testDataBySecond;
  }

  @Override
  public String getProperyByThirdWay() {
    return testDataByThird;
  }

  @Override
  public String getProperyByFourthWay(String key) {
    return pc.getProperty(key);
  }

  @Override
  public String getProperyByFourthWay(String key, String defaultValue) {
    return pc.getProperty(key, defaultValue);
  }

  @Override
  public String getProperyByFifthWay(String key) {
    return PropertyUtil.getPropery(key);
  }

  @Override
  public String getProperyByFifthWay(String key, String defaultValue) {
    return PropertyUtil.getProperty(key, defaultValue);
  }
}

3.控制器類PropertyController

package com.hafiz.www.controller;

import com.hafiz.www.service.PropertiesService;
import com.hafiz.www.util.PropertyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * Desc:properties測(cè)試控制器
 * Created by hafiz.zhang on 2016/9/16.
 */
@Controller
@RequestMapping("/prop")
public class PropertyController {
  @Autowired
  private PropertiesService ps;

  @RequestMapping(value = "/way/first", method = RequestMethod.GET)
  @ResponseBody
  public String getPropertyByFirstWay(){
    return ps.getProperyByFirstWay();
  }

  @RequestMapping(value = "/way/second", method = RequestMethod.GET)
  @ResponseBody
  public String getPropertyBySecondWay(){
    return ps.getProperyBySecondWay();
  }

  @RequestMapping(value = "/way/third", method = RequestMethod.GET)
  @ResponseBody
  public String getPropertyByThirdWay(){
    return ps.getProperyByThirdWay();
  }

  @RequestMapping(value = "/way/fourth/{key}", method = RequestMethod.GET)
  @ResponseBody
  public String getPropertyByFourthWay(@PathVariable("key") String key){
    return ps.getProperyByFourthWay(key, "defaultValue");
  }

  @RequestMapping(value = "/way/fifth/{key}", method = RequestMethod.GET)
  @ResponseBody
  public String getPropertyByFifthWay(@PathVariable("key") String key){
    return PropertyUtil.getProperty(key, "defaultValue");
  }
}

4.jdbc.properties文件

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.1.196:3306/dev?useUnicode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=123456
jdbc.maxActive=200
jdbc.minIdle=5
jdbc.initialSize=1
jdbc.maxWait=60000
jdbc.timeBetweenEvictionRunsMillis=60000
jdbc.minEvictableIdleTimeMillis=300000
jdbc.validationQuery=select 1 from t_user
jdbc.testWhileIdle=true
jdbc.testOnReturn=false
jdbc.poolPreparedStatements=true
jdbc.maxPoolPreparedStatementPerConnectionSize=20
jdbc.filters=stat
#test data
test=com.hafiz.www

5.項(xiàng)目結(jié)果圖

  

6.項(xiàng)目下載:demo http://xiazai.jb51.net/201612/yuanma/propertiesConfigurer_jb51.zip

7.測(cè)試結(jié)果

第一種方式

  

第二種方式

 

第三種方式

  

第四種方式

  

第五種方式

  

六、總結(jié)

通過本次的梳理和測(cè)試,我們理解了Spring和SpringMVC的父子容器關(guān)系以及context:component-scan標(biāo)簽包掃描時(shí)最容易忽略的use-default-filters屬性的作用以及原理。能夠更好地定位和快速解決再遇到的問題。總之,棒棒噠~~~

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • JavaWeb三大組件之Filter過濾器詳解

    JavaWeb三大組件之Filter過濾器詳解

    這篇文章主要介紹了JavaWeb三大組件之Filter過濾器詳解,過濾器Filter是Java?Web應(yīng)用中的一種組件,它在請(qǐng)求到達(dá)Servlet或JSP之前或者響應(yīng)送回客戶端之前,對(duì)請(qǐng)求和響應(yīng)進(jìn)行預(yù)處理和后處理操作,需要的朋友可以參考下
    2023-10-10
  • 圖數(shù)據(jù)庫(kù)NebulaGraph的Java 數(shù)據(jù)解析實(shí)踐與指導(dǎo)詳解

    圖數(shù)據(jù)庫(kù)NebulaGraph的Java 數(shù)據(jù)解析實(shí)踐與指導(dǎo)詳解

    這篇文章主要介紹了圖數(shù)據(jù)庫(kù)NebulaGraph的Java 數(shù)據(jù)解析實(shí)踐與指導(dǎo)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Spring IOC控制反轉(zhuǎn)的實(shí)現(xiàn)解析

    Spring IOC控制反轉(zhuǎn)的實(shí)現(xiàn)解析

    這篇文章主要介紹了Spring IOC控制反轉(zhuǎn)的實(shí)現(xiàn),IOC是Spring的核心思想之一,它通過將對(duì)象的創(chuàng)建、依賴注入和生命周期管理交給容器來實(shí)現(xiàn)解耦,使開發(fā)者能夠更專注于業(yè)務(wù)邏輯的實(shí)現(xiàn),需要的朋友可以參考下
    2025-02-02
  • Java將Exception信息轉(zhuǎn)為String字符串的方法

    Java將Exception信息轉(zhuǎn)為String字符串的方法

    今天小編就為大家分享一篇Java將Exception信息轉(zhuǎn)為String字符串的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • LambdaQueryWrapper與QueryWrapper的使用方式

    LambdaQueryWrapper與QueryWrapper的使用方式

    這篇文章主要介紹了LambdaQueryWrapper與QueryWrapper的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • 在java代碼中獲取JVM參數(shù)的方法

    在java代碼中獲取JVM參數(shù)的方法

    下面小編就為大家?guī)硪黄趈ava代碼中獲取JVM參數(shù)的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-01-01
  • 詳解Java中的增強(qiáng) for 循環(huán) foreach

    詳解Java中的增強(qiáng) for 循環(huán) foreach

    foreach 是 Java 中的一種語法糖,幾乎每一種語言都有一些這樣的語法糖來方便程序員進(jìn)行開發(fā),編譯期間以特定的字節(jié)碼或特定的方式來對(duì)這些語法進(jìn)行處理。能夠提高性能,并減少代碼出錯(cuò)的幾率。
    2017-05-05
  • Jenkins+Maven+SVN自動(dòng)化部署java項(xiàng)目

    Jenkins+Maven+SVN自動(dòng)化部署java項(xiàng)目

    這篇文章主要介紹了Jenkins+Maven+SVN自動(dòng)化部署java項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • 淺析Java進(jìn)制轉(zhuǎn)換、輸入、命名問題

    淺析Java進(jìn)制轉(zhuǎn)換、輸入、命名問題

    這篇文章主要介紹了Java進(jìn)制轉(zhuǎn)換、輸入、命名問題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07
  • vue 實(shí)現(xiàn)刪除對(duì)象的元素 delete

    vue 實(shí)現(xiàn)刪除對(duì)象的元素 delete

    這篇文章主要介紹了vue 實(shí)現(xiàn)刪除對(duì)象的元素delete,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評(píng)論