如何在spring项目中读取属性文件?
Posted
技术标签:
【中文标题】如何在spring项目中读取属性文件?【英文标题】:how to read properties file in spring project? 【发布时间】:2013-01-12 06:57:21 【问题描述】:在发布这个问题之前,我谷歌从 Spring 项目(它不是基于 Web 的项目)中获取属性。我很困惑,因为每个人都在谈论 application-context.xml 并且有类似的配置
但是,我正在使用 Spring 开发普通的 Java 项目(没有 Web 应用程序和类似的东西)。但我想从属性文件中获取一些需要在 JAVA 文件中使用的通用属性。如何使用 Spring/Spring Annotations 实现这一点?
我的项目下应该在哪里配置myprops.properties文件以及如何通过spring调用?
我的理解是 application-context.xml 仅用于基于 Web 的项目。如果没有,我应该如何配置这个 application-context.xml,因为我没有 web.xml 来定义 application-context.xml
【问题讨论】:
你如何定义你的 Spring 上下文?每个 Spring 应用程序都有一个 Spring 上下文。 XML 配置不仅适用于基于 Web 的项目 是的。你是对的。我的问题是该 XML 文件需要放在 Java 项目中的项目工作区(spring.xml 或 other.xml)下的确切位置 【参考方案1】:在您的 src/main/resources/
目录中创建新的属性文件,文件扩展名必须是 .properties
,例如db.properties
在你的 spring xml 配置文件中写入以下上下文属性:
<context:property-placeholder location="db.properties"/>
用法: $property-key
【讨论】:
【参考方案2】:从 Spring 4 开始,您可以在 Spring @Configuration
类中使用 @PropertySource 注释:
@Configuration
@PropertySource("application.properties")
public class ApplicationConfig
// more config ...
如果你想让你的配置在你的类路径之外,你可以使用file:
前缀:
@PropertySource("file:/path/to/application.properties")
或者,您可以使用环境变量来定义文件
@PropertySource("file:$APP_PROPERTIES")
其中APP_PROPERTIES
是一个环境变量,它具有属性文件位置的值,例如/path/to/application.properties
。
请阅读我的博文Spring @PropertySource,了解有关@PropertySource
、其用法、如何覆盖属性值以及如何指定可选属性源的更多信息。
【讨论】:
【参考方案3】:您能弄清楚您的项目将如何在整个应用程序中使用吗?如果你的项目是作为一个web应用的构建路径,而你的项目中的配置是通过spring注解来实现的,那么毫无疑问你会疑惑如何添加application.xml
文件。我的建议是你必须宣布将使用你的项目的人,告诉他们你需要什么,你只需要在你的代码中添加@Value("$valuename")
。
【讨论】:
【参考方案4】:您不必使用 Spring。 您可以像这样使用纯 java 阅读:
Properties properties = new Properties();
properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(fileName));
【讨论】:
【参考方案5】:您可以创建一个基于 XML 的应用程序上下文,例如:
ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/appContext.xml");
如果 xml 文件位于您的类路径中。或者,您可以使用文件系统上的文件:
ApplicationContext ctx = new FileSystemXmlApplicationContext("conf/appContext.xml");
更多信息请访问Spring reference docs。您还应该注册一个shutdown hook 以确保正常关闭:
ctx.registerShutdownHook();
接下来,您可以使用 PropertyPlaceHolderConfigurer 从“.properties”文件中提取属性并将它们注入到您的 bean 中:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations" value="classpath:com/foo/jdbc.properties"/>
</bean>
<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="$jdbc.driverClassName"/>
<property name="url" value="$jdbc.url"/>
<property name="username" value="$jdbc.username"/>
<property name="password" value="$jdbc.password"/>
</bean>
最后,如果您更喜欢基于注解的配置,您可以使用@Value
注解将属性注入到您的 bean 中:
@Component
public class SomeBean
@Value("$jdbc.url")
private String jdbcUrl;
【讨论】:
感谢您的回复。但是如何从java代码中获取属性呢? 如果您想填充Properties 对象,请查看here(不要忘记添加finally
块以关闭流)。
精彩的解释。我非常感谢您的回复和您的时间。但我有一个简单的问题,比如需要在 Workspace 下的哪里进行 XML 映射(spring.xml 或 application-context.xml 或 other.xml) 命名 XML 文件的最佳方法是什么,以及什么是***架构那个?
Afaik,没有一般规则,但这里有一些建议。对于一个小项目,我认为您的建议 spring.xml 或 application-context.xml 是有道理的。对于包含多个子项目的大型项目,我可能会根据子域命名它们,例如core-context.xml、backend-context.xml、client-context.xml等。如果你出于某种原因想将数据库配置、db-context.xml等外部化...
我正在开发一个独立的 java 应用程序,打包为 JAR。我必须在 o JAR 之外提供属性文件,即属性文件将驻留在 jar 文件旁边。我怎样才能给出这个属性文件的路径?以上是关于如何在spring项目中读取属性文件?的主要内容,如果未能解决你的问题,请参考以下文章
@ServiceActivator 如何在 Spring Boot 中从属性文件中读取 inputChannel?
如何在 Spring Boot 中从应用程序属性文件中读取 jpa 命名查询?
如何将 Spring Boot 项目迁移到旧 Spring MVC 项目。面临的问题,如何在遗留 Spring MVC 项目中读取 application.properties 文件