1

我有一个带有键值对的属性文件:

key1=value1
key2=value2

现在,在我的控制器中,我想直接打印属性文件的值(当然是在使用 web.xml / app-servlet.xml 加载属性文件之后),例如:

System.out.printl(${key1});

有可能这样做吗?

如果没有,我想创建一个包含所有常量变量的接口来从属性文件中读取值。我该怎么做??

public interface MyConstants
{
      @Value("${key1}")
      public static final KEY_1="";
}

但正如预期的那样,只分配了空字符串。

我该如何解决这个问题?或者,使用属性文件检索值的最佳方法是什么?提前致谢...

4

3 回答 3

5

使用“MyConstants”而不是类的接口不正确的原因有两个:

1) Spring 不能向没有实现的接口注入值。仅仅因为您将无法实例化接口。请记住,Spring 只是一个工厂,它只能处理可以实例化的“事物”。

2)另一个原因是拥有一个用于存储常量的接口本身就是一种反模式。这不是接口的设计目的。您可能需要参考 Constant 接口反模式。

http://en.wikipedia.org/wiki/Constant_interface

于 2013-06-03T06:10:12.770 回答
4

这是可能的!您需要使用如下util命名空间app-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd">

    <util:properties id="props" location="classpath:yourfile.properties" />

    <!-- other -->
</beans>

controller的就像

@org.springframework.beans.factory.annotation.Value("#{props.key1}")
public void setFoo(String foo) {
    System.out.println("props.key1: " + foo);
}

以另一种方式更新:

您还可以使用命名空间context

<context:property-placeholder location="classpath:yourfile.properties" />

在控制器中,声明一个属性如下

@Value("${pros.key1}")
private String foo;
于 2013-06-04T16:24:14.367 回答
1

创建“常量”类/接口是一种广泛使用的方法,但我认为这是一种有缺陷的方法。它创建了一种奇怪的耦合,系统中不同层的类突然开始依赖于一个常量类。通过查看常量类也变得难以理解,谁正在使用哪个常量?更不用说它完全模拟了抽象。您突然有了一个常量类,其中包含有关要在 jsp 上显示的错误消息、第三方 api 的用户名和密码、线程池大小等信息。所有这些都在一个“我知道一切”类中

所以尽量避免使用常量类/接口。查看您的控制器/服务,如果特定服务类需要您希望在属性文件中公开的特定配置值,请将其注入类并将其存储为实例级常量。从抽象的角度来看,这种设计更加简洁,它也有助于轻松地对这个类进行单元测试。

在 Spring 中,您可以创建属性文件的句柄,如下所示:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations" value="classpath:my-application.properties" />       
</bean>

正如代码所示,您可以在此处提及多个属性文件。完成此操作后,您可以在上下文中的其他位置引用上述属性文件中的密钥,如下所示:

<bean id="xx" class="com.xx.SomeClass" p:imageUrl="${categories.images}"/>

这里的SomeClass实例有一个名为的属性imageUrl,现在注入了针对categories.images名为的属性文件中的键提到的值my-application.properties

希望这可以帮助。

于 2013-06-03T07:01:51.830 回答