如何从application.properties中读取外部文件的配置值
从application.properties读取外部文件配置值的实现方法
可以实现,以下是几种常见方案,适配不同场景和文件格式:
1. 用Spring Boot原生的spring.config.import(推荐,Spring Boot 2.4+)
这是最简单的原生方式,直接在主配置文件中导入外部配置文件,外部文件的属性会自动加载到Spring环境中,主配置文件可通过占位符引用这些属性。
配置示例:
- application.properties:
# 导入外部properties文件(路径按需调整,支持绝对/相对路径) spring.config.import=file:./mysecondfile.properties # 引用外部文件中的属性 spring.datasource.url=${spring.datasource.url} spring.datasource.username=${spring.datasource.username} spring.datasource.password=${spring.datasource.password}
- mysecondfile.properties:
spring.datasource.url=mydb spring.datasource.username=myuser spring.datasource.password=mypwd
如果不需要在主文件重复声明属性,外部文件的属性会直接覆盖或补充主配置,也可省略主文件里的spring.datasource.*配置,直接由外部文件提供。
2. 使用@PropertySource注解加载外部文件
在Spring配置类上添加@PropertySource注解,指定外部配置文件路径,即可将外部属性加载到环境中,主配置文件同样可用占位符引用。
代码示例:
创建配置类:
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; @Configuration @PropertySource(value = "file:./mysecondfile.properties") // 路径按需调整 public class ExternalConfig { }
application.properties中引用属性的写法和第一种方法一致。
3. 自定义PropertySource加载非标准格式文件(如TXT、XML)
如果外部文件是txt、xml等非properties/yml格式,需要自定义PropertySource解析文件内容,转换为键值对后加入Spring环境。
示例:加载XML格式配置
假设myconfig.xml内容:
<config> <db> <url>mydb</url> <username>myuser</username> <password>mypwd</password> </db> </config>
自定义PropertySource类:
import org.springframework.core.env.PropertySource; import org.springframework.core.io.Resource; import org.w3c.dom.Document; import org.xml.sax.InputSource; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; public class XmlPropertySource extends PropertySource<Resource> { private final Document document; public XmlPropertySource(String name, Resource resource) throws Exception { super(name, resource); DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); try (InputStreamReader reader = new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8)) { this.document = builder.parse(new InputSource(reader)); } } @Override public Object getProperty(String name) { if ("spring.datasource.url".equals(name)) { return document.getElementsByTagName("url").item(0).getTextContent(); } else if ("spring.datasource.username".equals(name)) { return document.getElementsByTagName("username").item(0).getTextContent(); } else if ("spring.datasource.password".equals(name)) { return document.getElementsByTagName("password").item(0).getTextContent(); } return null; } }
创建配置类注册该PropertySource:
import org.springframework.context.annotation.Configuration; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.io.ResourceLoader; import javax.annotation.PostConstruct; @Configuration public class CustomConfig { private final ConfigurableEnvironment environment; private final ResourceLoader resourceLoader; public CustomConfig(ConfigurableEnvironment environment, ResourceLoader resourceLoader) { this.environment = environment; this.resourceLoader = resourceLoader; } @PostConstruct public void registerXmlPropertySource() throws Exception { XmlPropertySource xmlSource = new XmlPropertySource("xmlConfig", resourceLoader.getResource("file:./myconfig.xml")); environment.getPropertySources().addLast(xmlSource); } }
之后application.properties中同样可以用${spring.datasource.url}这类占位符引用XML中的配置值。
内容的提问来源于stack exchange,提问作者jkfe
相关产品推荐
相关产品推荐

