package com.mossle.core.spring; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; import com.mossle.core.util.IoUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.support.PropertiesLoaderSupport; public class ApplicationPropertiesFactoryBean extends PropertiesLoaderSupport implements FactoryBean<Properties>, InitializingBean { private static Logger logger = LoggerFactory .getLogger(ApplicationPropertiesFactoryBean.class); private ResourceLoader resourceLoader = new DefaultResourceLoader(); private String propertiesListLocation = "classpath:/properties.lst"; private Properties properties; public boolean isSingleton() { return true; } public void afterPropertiesSet() throws IOException { // 判断加载哪些properties this.readProperties(); // 默认设置找不到资源也不会报错 this.setIgnoreResourceNotFound(true); // 加载properties this.properties = mergeProperties(); } public Properties getObject() throws IOException { return properties; } public Class<Properties> getObjectType() { return Properties.class; } protected void readProperties() throws IOException { Resource propertiesListResource = resourceLoader .getResource(propertiesListLocation); List<Resource> resources = new ArrayList<Resource>(); if (!propertiesListResource.exists()) { logger.info("use default properties"); resources.add(resourceLoader .getResource("classpath:/application.properties")); resources.add(resourceLoader .getResource("classpath:/application.local.properties")); resources.add(resourceLoader .getResource("classpath:/application.server.properties")); } else { String text = IoUtils.readString(propertiesListResource); for (String str : text.split("\n")) { str = str.trim(); if (str.length() == 0) { continue; } resources.add(resourceLoader.getResource(str)); } } setLocations(resources.toArray(new Resource[0])); } public Map<String, Object> getMap() { Map<String, Object> map = new HashMap<String, Object>(); for (String key : properties.stringPropertyNames()) { map.put(key, properties.get(key)); } return map; } public String getPropertiesListLocation() { return propertiesListLocation; } public void setPropertiesListLocation(String propertiesListLocation) { this.propertiesListLocation = propertiesListLocation; } }