如何在春季项目中读取属性文件?

在发布这个问题之前,我谷歌从Spring项目(它不是基于Web的项目)获取属性。我很困惑,因为每个人都在谈论应用程序上下文.xml并且具有像

但是,我正在使用Spring(没有Web应用程序之类的东西)处理正常的Java项目。但是我想从属性文件中获取一些通用属性,这需要在JAVA文件中使用。如何使用弹簧/弹簧注释来实现此目的?

我应该在哪里配置 myprops.properties 文件在我的项目下,以及如何通过 spring 调用?

我的理解是应用程序上下文.xml仅用于基于Web的项目。如果没有,我应该如何配置此应用程序上下文.xml因为我没有 Web.xml来定义应用程序上下文.xml


答案 1

您可以创建基于 XML 的应用程序上下文,如下所示:

ApplicationContext ctx = new ClassPathXmlApplicationContext("conf/appContext.xml");

如果 xml 文件位于类路径上。或者,您可以使用文件系统上的文件:

ApplicationContext ctx = new FileSystemXmlApplicationContext("conf/appContext.xml");

更多信息,请参阅春季参考文档。您还应该注册一个关机挂钩以确保正常关机:

 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>

最后,如果您更喜欢基于注释的配置,则可以使用注释将属性注入到 Bean 中:@Value

@Component
public class SomeBean {

    @Value("${jdbc.url}") 
    private String jdbcUrl;
}

答案 2

从 Spring 4 开始,您可以在 Spring 类中使用@PropertySource注释:@Configuration

@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