`
qstar
  • 浏览: 33018 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

扩展Spring PropertyPlaceholderConfigurer实现根据环境加载配置文件

阅读更多

<div class="iteye-blog-content-contain" style="font-size: 14px">

package com.alibaba.china.wdc.config;

 

import java.io.IOException;

import java.io.InputStream;

import java.io.InputStreamReader;

import java.util.ArrayList;

import java.util.List;

import java.util.Properties;

 

import org.apache.commons.lang.StringUtils;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

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

import org.springframework.core.io.Resource;

import org.springframework.util.DefaultPropertiesPersister;

import org.springframework.util.PropertiesPersister;

 

public class ModeSupportPlaceHolderConfigurer extends PropertyPlaceholderConfigurer {

 

    private static Logger         logger                  = LoggerFactory.getLogger(ModeSupportPlaceHolderConfigurer.class);

 

    private static final String   PRODUCTION_MODE         = "production.mode";

 

    private Resource[]            locations;

 

    private PropertiesPersister   propertiesPersister     = new DefaultPropertiesPersister();

 

    private boolean               ignoreResourceNotFound  = false;

 

    public static final String    PROPERTY_FILE_EXTENSION = ".properties";

 

    private String                fileEncoding;

 

    private static final String[] allowModes              = new String[] { "daily", "publish" };

 

    public static final boolean isOnline() {

        return "publish".equalsIgnoreCase(System.getProperty(PRODUCTION_MODE));

    }

 

    /**

     * Load properties into the given instance.

     * 

     * @param props the Properties instance to load into

     * @throws java.io.IOException in case of I/O errors

     * @see #setLocations

     */

    @Override

    protected void loadProperties(Properties props) throws IOException {

        if (this.locations != null) {

            String mode = System.getProperty(PRODUCTION_MODE);

            if (StringUtils.isEmpty(mode)) {

                mode = "daily";

            }

            mode = mode.toLowerCase();

            if (logger.isDebugEnabled()) {

                logger.debug("production model is " + mode);

            }

 

            for (Resource location : this.locations) {

                if (logger.isInfoEnabled()) {

                    logger.info("Loading properties file from " + location);

                }

                InputStream is = null;

                try {

                    String filename = null;

                    try {

                        filename = location.getFilename();

                    } catch (IllegalStateException ex) {

                        // resource is not file-based. See SPR-7552.

                    }

                    is = location.getInputStream();

                    if (filename != null && filename.endsWith(PROPERTY_FILE_EXTENSION)

                        && !isExcludeProperty(mode, filename)) {

                        if (this.fileEncoding != null) {

                            this.propertiesPersister.load(props, new InputStreamReader(is, this.fileEncoding));

                        } else {

                            this.propertiesPersister.load(props, is);

                        }

                    }

                } catch (IOException ex) {

                    if (this.ignoreResourceNotFound) {

                        if (logger.isWarnEnabled()) {

                            logger.warn("Could not load properties from " + location + ": " + ex.getMessage());

                        }

                    } else {

                        throw ex;

                    }

                } finally {

                    if (is != null) {

                        is.close();

                    }

                }

            }

        }

    }

 

    private String[] getExcludeMode(String mode) {

        if (StringUtils.isEmpty(mode)) {

            return allowModes;

        }

        List<String> excludeModes = new ArrayList<String>();

        mode = mode.toLowerCase();

        for (String m : allowModes) {

            if (!m.equals(mode)) {

                excludeModes.add(m);

            }

        }

        return excludeModes.toArray(new String[] {});

    }

 

    private boolean isExcludeProperty(String mode, String filename) {

        String[] excludeModes = getExcludeMode(mode);

        for (String m : excludeModes) {

            if (filename.endsWith(m + PROPERTY_FILE_EXTENSION)) {

                return true;

            }

        }

        return false;

    }

 

    public void setLocations(Resource[] locations) {

        this.locations = locations;

    }

 

    public void setPropertiesPersister(PropertiesPersister propertiesPersister) {

        this.propertiesPersister = propertiesPersister;

    }

 

    public void setIgnoreResourceNotFound(boolean ignoreResourceNotFound) {

        this.ignoreResourceNotFound = ignoreResourceNotFound;

    }

 

    public void setFileEncoding(String fileEncoding) {

        this.fileEncoding = fileEncoding;

    }

 

}

 

</div>

 

分享到:
评论

相关推荐

    Spring PropertyPlaceholderConfigurer配置文件加载器集成ZooKeeper来实现远程配置读取

    以上就是关于"Spring PropertyPlaceholderConfigurer配置文件加载器集成ZooKeeper来实现远程配置读取"的详细解释,涵盖了Spring的配置处理、ZooKeeper的使用以及两者结合的实现过程。理解并掌握这一技术,有助于提升...

    spring 启动时加载不同的文件

    动态加载配置文件** - **目的**: 根据部署环境的不同,动态地更改应用使用的配置文件,从而实现环境间的灵活切换。 - **实现方式**: 通过扩展`PropertyPlaceholderConfigurer`并重写其方法,根据特定条件选择加载...

    SPRING:bean配置properties

    `PropertyPlaceholderConfigurer`允许我们在Spring的配置文件中引用外部的properties文件,以实现配置信息的灵活管理和动态加载。以下是一个基本的配置示例: ```xml class="org.springframework.beans.factory....

    Spring项目application.xml配置文件加解密

    本文将详细介绍如何在Spring项目中实现`application.xml`配置文件的加解密。 首先,我们需要理解加密的基本概念。加密是将明文数据转换为密文的过程,以防止未经授权的访问。常用的加密算法有AES(高级加密标准)、...

    spring读取properties

    在Spring框架中,读取和使用...在Spring的配置文件中,首先需要定义一个`PropertyPlaceholderConfigurer` bean,这是Spring用来解析Properties文件并将其值注入到其他bean中的关键组件。如示例所示: ```xml ...

    Spring 容器后处理器

    BeanFactoryPostProcessor接口是Spring框架提供的一个接口,用于扩展Spring容器的功能。该接口只有一个方法`postProcessBeanFactory`,该方法在容器加载完成之后被调用,可以用来改变容器中的配置或做一些初始化工作...

    spring资源文件

    8. **Spring Boot的资源配置**:在Spring Boot中,`application.properties`或`application.yml`是主要的全局配置文件,它们可以覆盖默认配置,也可以被外部化到环境变量或命令行参数中。 9. **环境和配置源**:...

    spring使用属性文件

    在Spring框架中,属性文件是用于存储配置信息的关键组件,特别是在进行环境特定的配置时。它们使得我们可以将应用程序的配置细节从代码中分离出来,从而提高可维护性和可移植性。下面将详细介绍如何在Spring中使用...

    SpringDM笔记6-Fragment及配置Log4j Fragment Bundle

    Spring DM是Spring框架在OSGi(Open Service Gateway Initiative)环境下的扩展,它允许在模块化环境中管理Spring应用程序。 首先,让我们了解什么是Fragment Bundle。在OSGi框架中,Bundle是基本的部署单元,类似...

    属性占位符配置器

    - **环境适应性**:利用系统环境变量或特定的属性文件,根据当前运行环境动态加载配置。 - **安全性和性能**:对于高并发场景,考虑使用缓存策略减少属性文件的频繁读取;同时,确保敏感信息的安全存储和访问控制。 ...

    第十九章 Spring Environment 抽象(Environment Abstraction)1

    它不仅包含了对传统占位符处理的支持,如`PropertyPlaceholderConfigurer`,还引入了更强大的`PropertySource`概念,允许从多种来源加载配置属性,如XML文件、属性文件、系统环境变量、JNDI等。 2. **Spring ...

    Spring源码学习四:BeanDefinition装载前奏曲1

    这个类是Spring中用来加载XML配置文件的上下文类。在创建`ApplicationContext`实例时,通常会调用带有`configLocations`参数的构造函数,这个参数指定了Spring XML配置文件的位置。例如,`"applicationContext.xml"`...

    spring源码经典实例

    2. **配置文件改进**:将`jdbc.properties`移动到合适的位置,如`src/main/resources`,并使用Spring的`PropertyPlaceholderConfigurer`或者`@Value`注解读取配置,以实现数据库连接参数的动态加载。 3. **使用...

    Spring中配置和读取多个Properties文件的方式方法

    总结起来,Spring通过`PropertyPlaceholderConfigurer`或`PropertySourcesPlaceholderConfigurer`提供了一种灵活的方式来加载和读取多个Properties文件,使得应用可以根据不同的配置文件进行初始化,从而实现配置的...

    SSM 读取properties文件

    在Java开发领域,尤其是SSM(Spring、SpringMVC、MyBatis)框架的使用中,配置文件的管理是至关重要的。"SSM 读取properties文件"这个话题聚焦于如何在项目中有效地读取和使用这些配置文件。properties文件通常用于...

    Spring整理1

    首先,Spring的初始化主要是通过ApplicationContext接口来完成的,它提供了加载配置文件并创建Bean实例的能力。这里提到了三种方式: 1. `ClassPathXmlApplicationContext`:这是最常见的初始化方式,用于从类路径...

    最新spring框架学习笔记(全)资料 (2).pdf

    为了使用这些Bean,需要通过`ApplicationContext`接口来加载配置文件并获取Bean的实例。例如: ```java ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); Hello h = (Hello...

    Spring MVC 入门教程

    2. **配置环境**:编写`web.xml`,`applicationContext.xml`和`lxm-servlet.xml`等配置文件。 3. **编写Controller**:创建控制器类,使用`@Controller`注解,定义处理请求的方法,使用`@RequestMapping`注解指定...

    spring-reference.pdf

    1. **PropertyPlaceholderConfigurer**:用于在配置文件中解析占位符,将占位符替换为实际值。 2. **PropertyOverrideConfigurer**:用于覆盖已存在的Bean定义属性,通常用于环境特定的配置。 3. **自定义...

Global site tag (gtag.js) - Google Analytics