读取配置文件随想

简介:

   无论项目大小,数据库、开发环境、测试环境....这些信息,肯定不能在程序中硬编码。

   硬编码有百坏而无一利,每次信息变动都要重新编译项目,不能分离运维和开发。

   而且配置散落在项目的程序中,无法做到准确集中管理,拖慢项目进度。

   我想这也是配置文件出现的原因,配置文件比较主流的格式 properties(键值对形式)、xml(对象,复杂数据结构,只有你想不到没有xml 表达不了的) 等。

   本文已比较常见、简单的 properties 格式的配置文件为例,来看看读取配置文件几种不同的姿势,关注其中的实现和使用,设计模式另表。

1. Spring 和 Apache Commons Configuration

   如果项目中没什么特殊的个性化读取配置文件需求,可以使用 Spring 管理配置文件信息,然后注入到需要的地方。

   配置文件中需要添加(PS :多配置文件,添加 ignore-unresolvable 参数)。

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

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

   然后在后端服务器需要的地方:

    @Value("${uploadpath}")
    protected String uploadPath;

   动态读入可以使用 Spring 提供了默认的配置文件读取实现类  org.springframework.core.io.DefaultResourceLoader。

   当然你也可以实现  org.springframework.core.io.ResourceLoader 接口自定义配置文件载入实现类。

   org.springframework.core.io.DefaultResourceLoader 核心方法 getResource:

复制代码
public Resource getResource(String location) {
        Assert.notNull(location, "Location must not be null");
        Iterator ex = this.protocolResolvers.iterator();
        Resource resource;
        do {
            if(!ex.hasNext()) {
                if(location.startsWith("/")) {
                    return this.getResourceByPath(location);
                }
                if(location.startsWith("classpath:")) {
                    return new ClassPathResource(location.substring("classpath:".length()), this.getClassLoader());
                }
                try {
                    URL ex1 = new URL(location);
                    return new UrlResource(ex1);
                } catch (MalformedURLException var5) {
                    return this.getResourceByPath(location);
                }
            }
            ProtocolResolver protocolResolver = (ProtocolResolver)ex.next();
            resource = protocolResolver.resolve(location, this);
        } while(resource == null);
        return resource;
    }
复制代码

   可以看出 Spring 能支持入参路径的很多方式,包括已 " /"、"classpath" 开头。 

   如果你想在项目中使用 Spring 提供的默认配置文件载入实现,可以这样书写你的代码。

            ResourceLoader resourceLoader = new DefaultResourceLoader();
            Resource resource = resourceLoader.getResource("log4j.properties");
            Properties props = new Properties();
            props.load(resource.getInputStream());

   当然你也可以引入 Apache Commons Configuration jar 内部设计相当考究。

   整个 jar 不超过 400K,如果时间充裕,你也可以反编译看看源码。

   使用方式也特别简洁,两行代码就 OK:

  PropertiesConfiguration configuration  = new PropertiesConfiguration("log4j.properties");
  configuration.getString("log4j.appender.file");

   Apache Commons Configuration 默认载入配置文件核心实现类 org.apache.commons.configuration.AbstractFileConfiguration 载入方法:

复制代码
    public void load(String fileName) throws ConfigurationException {
        try {
            URL e = ConfigurationUtils.locate(this.fileSystem, this.basePath, fileName);
            if(e == null) {
                throw new ConfigurationException("Cannot locate configuration source " + fileName);
            } else {
                this.load(e);
            }
        } catch (ConfigurationException var3) {
            throw var3;
        } catch (Exception var4) {
            throw new ConfigurationException("Unable to load the configuration file " + fileName, var4);
        }
    }
复制代码

2. JDK 经典手写

   如果你项目对读取配置文件没有太多个性化的需求,如果你有足够时间,如果你嫌弃第三方 Jar 占据你 lib 目录的一席之地,还有如果你热爱编程。

   仔细一点,你会发现,这些开源框架底层都是已 java.net.URL 载入配置文件。

   在载入配置文件的过程中应项目需求采用了恰当的设计模式,使能够支持一些对配置文件的特定操作。

   载入文件后,实例化为 java.util.Properties 对象,进行配置文件获取。

   那就完全可以撸段纯 JDK 的写法,作为工具类放入项目中,编译后不超过 5K,核心的几句代码如下:

          URL resource = Thread.currentThread().getContextClassLoader().getResource("log4j.properties");
          Properties properties = new Properties();
          properties.load(resource.openStream());
          properties.getProperty(key);

  因为  java.util.Properties 的 load 进行了方法的重载,你也可以不用 URL 方式读取配置文件,也可以这样写:

复制代码
          String url = this.getClass().getClassLoader().getResource("").getPath().replaceAll("%20", " ");
          String path = url.substring(0, url.indexOf("classes")) + filePath; //该 path 为你配置文件的路径

          InputStream inputStream = new FileInputStream(path);
          BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
          prop.load(bufferedReader);prop.getProperty(key);
复制代码

 上述代码都为实例核心的几句代码,其中的判空和异常都没有进行处理,仅作为参考。

 最后贴上自己封装的配置文件载入类,不使用任何第三方 jar,有需要的拿走放入项目即可用。

  View Code

  使用方式也很简单,支持多路径读入,如果存在相同 Key 后面的覆盖前面的:

        PropertiesLoader propertiesLoader = new PropertiesLoader("log4j.properties");
        System.out.println(propertiesLoader.getProperty("log4j.appender.file"));

 本文转自Orson博客园博客,原文链接:http://www.cnblogs.com/java-class/p/5786473.html,如需转载请自行联系原作者

相关文章
|
12月前
|
XML Java 数据格式
我滴妈!人事竟然问我Spring BeanDefinition是如何帮我们解析和加载的?
我滴妈!人事竟然问我Spring BeanDefinition是如何帮我们解析和加载的?
51 0
我滴妈!人事竟然问我Spring BeanDefinition是如何帮我们解析和加载的?
|
存储 Shell C语言
一学就会的fasta文件解析
一学就会的fasta文件解析
240 0
|
JavaScript Dubbo 小程序
求你别自己瞎写工具类了,Spring自带的这些他不香麽?
求你别自己瞎写工具类了,Spring自带的这些他不香麽?
求你别自己瞎写工具类了,Spring自带的这些他不香麽?
|
IDE Java 中间件
521我发誓读完本文,再也不会担心Spring配置类问题了(上)
521我发誓读完本文,再也不会担心Spring配置类问题了(上)
521我发誓读完本文,再也不会担心Spring配置类问题了(上)
|
Java 容器 Spring
521我发誓读完本文,再也不会担心Spring配置类问题了(中)
521我发誓读完本文,再也不会担心Spring配置类问题了(中)
521我发誓读完本文,再也不会担心Spring配置类问题了(中)
|
Java 容器 Spring
521我发誓读完本文,再也不会担心Spring配置类问题了(下)
521我发誓读完本文,再也不会担心Spring配置类问题了(下)
521我发誓读完本文,再也不会担心Spring配置类问题了(下)
|
Java Spring 容器
配置类需要标注@Configuration却不知原因?那这次就不能给你涨薪喽(上)
配置类需要标注@Configuration却不知原因?那这次就不能给你涨薪喽(上)
配置类需要标注@Configuration却不知原因?那这次就不能给你涨薪喽(上)
|
Java Spring 容器
【SSM直击大厂】第二章:Spring配置文件详解
Spring的重点配置 <bean>标签 id属性:在容器中Bean实例的唯一标识,不允许重复 class属性:要实例化的Bean的全限定名 scope属性:Bean的作用范围,常用是Singleton(默认)和prototype <property>标签:属性注入 name属性:属性名称 value属性:注入的普通属性值 ref属性:注入的对象引用值 <list>标签 <map>标签 <properties>标签 <constructor-arg>标签 <import>标签:导入其他的Spring的分文件
105 0
|
XML 运维 前端开发
《Spring 手撸专栏》第 5 章:一鸣惊人,为Bean对象注入属性和依赖Bean的功能实现
实现 1. 工程结构 2. 定义属性 3. Bean定义补全 4. Bean 属性填充 测试 1. 事先准备 2. 测试用例 3. 测试结果
148 0
《Spring 手撸专栏》第 5 章:一鸣惊人,为Bean对象注入属性和依赖Bean的功能实现
|
Cloud Native Java Spring
配置类需要标注@Configuration却不知原因?那这次就不能给你涨薪喽(下)
配置类需要标注@Configuration却不知原因?那这次就不能给你涨薪喽(下)