如何在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项目中读取属性文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring 从属性文件中读取

Spring Boot如何读取jar外的属性文件

@ServiceActivator 如何在 Spring Boot 中从属性文件中读取 inputChannel?

如何在 Spring Boot 中从应用程序属性文件中读取 jpa 命名查询?

如何将 Spring Boot 项目迁移到旧 Spring MVC 项目。面临的问题,如何在遗留 Spring MVC 项目中读取 application.properties 文件

如何让是spring启动时加载一个类。这里类实现了读取xml配置数据到内存中(不是属性文件)