<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的配置处理、ZooKeeper的使用以及两者结合的实现过程。理解并掌握这一技术,有助于提升...
动态加载配置文件** - **目的**: 根据部署环境的不同,动态地更改应用使用的配置文件,从而实现环境间的灵活切换。 - **实现方式**: 通过扩展`PropertyPlaceholderConfigurer`并重写其方法,根据特定条件选择加载...
`PropertyPlaceholderConfigurer`允许我们在Spring的配置文件中引用外部的properties文件,以实现配置信息的灵活管理和动态加载。以下是一个基本的配置示例: ```xml class="org.springframework.beans.factory....
本文将详细介绍如何在Spring项目中实现`application.xml`配置文件的加解密。 首先,我们需要理解加密的基本概念。加密是将明文数据转换为密文的过程,以防止未经授权的访问。常用的加密算法有AES(高级加密标准)、...
在Spring框架中,读取和使用...在Spring的配置文件中,首先需要定义一个`PropertyPlaceholderConfigurer` bean,这是Spring用来解析Properties文件并将其值注入到其他bean中的关键组件。如示例所示: ```xml ...
BeanFactoryPostProcessor接口是Spring框架提供的一个接口,用于扩展Spring容器的功能。该接口只有一个方法`postProcessBeanFactory`,该方法在容器加载完成之后被调用,可以用来改变容器中的配置或做一些初始化工作...
8. **Spring Boot的资源配置**:在Spring Boot中,`application.properties`或`application.yml`是主要的全局配置文件,它们可以覆盖默认配置,也可以被外部化到环境变量或命令行参数中。 9. **环境和配置源**:...
在Spring框架中,属性文件是用于存储配置信息的关键组件,特别是在进行环境特定的配置时。它们使得我们可以将应用程序的配置细节从代码中分离出来,从而提高可维护性和可移植性。下面将详细介绍如何在Spring中使用...
Spring DM是Spring框架在OSGi(Open Service Gateway Initiative)环境下的扩展,它允许在模块化环境中管理Spring应用程序。 首先,让我们了解什么是Fragment Bundle。在OSGi框架中,Bundle是基本的部署单元,类似...
- **环境适应性**:利用系统环境变量或特定的属性文件,根据当前运行环境动态加载配置。 - **安全性和性能**:对于高并发场景,考虑使用缓存策略减少属性文件的频繁读取;同时,确保敏感信息的安全存储和访问控制。 ...
它不仅包含了对传统占位符处理的支持,如`PropertyPlaceholderConfigurer`,还引入了更强大的`PropertySource`概念,允许从多种来源加载配置属性,如XML文件、属性文件、系统环境变量、JNDI等。 2. **Spring ...
这个类是Spring中用来加载XML配置文件的上下文类。在创建`ApplicationContext`实例时,通常会调用带有`configLocations`参数的构造函数,这个参数指定了Spring XML配置文件的位置。例如,`"applicationContext.xml"`...
2. **配置文件改进**:将`jdbc.properties`移动到合适的位置,如`src/main/resources`,并使用Spring的`PropertyPlaceholderConfigurer`或者`@Value`注解读取配置,以实现数据库连接参数的动态加载。 3. **使用...
总结起来,Spring通过`PropertyPlaceholderConfigurer`或`PropertySourcesPlaceholderConfigurer`提供了一种灵活的方式来加载和读取多个Properties文件,使得应用可以根据不同的配置文件进行初始化,从而实现配置的...
在Java开发领域,尤其是SSM(Spring、SpringMVC、MyBatis)框架的使用中,配置文件的管理是至关重要的。"SSM 读取properties文件"这个话题聚焦于如何在项目中有效地读取和使用这些配置文件。properties文件通常用于...
首先,Spring的初始化主要是通过ApplicationContext接口来完成的,它提供了加载配置文件并创建Bean实例的能力。这里提到了三种方式: 1. `ClassPathXmlApplicationContext`:这是最常见的初始化方式,用于从类路径...
为了使用这些Bean,需要通过`ApplicationContext`接口来加载配置文件并获取Bean的实例。例如: ```java ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); Hello h = (Hello...
2. **配置环境**:编写`web.xml`,`applicationContext.xml`和`lxm-servlet.xml`等配置文件。 3. **编写Controller**:创建控制器类,使用`@Controller`注解,定义处理请求的方法,使用`@RequestMapping`注解指定...
1. **PropertyPlaceholderConfigurer**:用于在配置文件中解析占位符,将占位符替换为实际值。 2. **PropertyOverrideConfigurer**:用于覆盖已存在的Bean定义属性,通常用于环境特定的配置。 3. **自定义...