如何在Spring MVC 4中设置全局配置/变量?

时间:2015-03-21 20:42:44

标签: java spring spring-mvc

我正在使用Spring MVC 4.1.4

我有一些全局设置可以在整个应用程序中共享

只应在启动服务器时加载这些设置

我知道我可以使用context-param

<context-param>
    <param-name>configA</param-name>
    <param-value>valueA</param-value>
</context-param>
<context-param>
    <param-name>configB</param-name>
    <param-value>valueB</param-value>
</context-param>

但我希望存储一些复杂的对象,比如这个

HashMap myConfig = new HashMap();

String[] cfgB={"b1", "b2"};

HashMap<String, String> cfgC=new HashMap<String, String>();
cfgC.put("C1", "1");
cfgC.put("C2", "2");

MyConfigD cfgD = new MyConfigD();

myConfig.put("configA", "A");
myConfig.put("configB",cfgB);
myConfig.put("configC",cfgC);
myConfig.put("configD",cfgD);

context-param不可能这样做,我还可以在Java或Spring中使用什么?

2 个答案:

答案 0 :(得分:9)

如果您不受限制且可以灵活决定如何设置属性,则有两种选择。

首先是在@Configuration类中定义Beans in Java code。对于大多数对象,您可以使用@Autowired的Bean。所有bean仅在运行时加载。 对于Maps(和Lists等),您可以将它们定义为bean,然后使用@Resource注释访问它们。请注意,对于这些类型,您无法使用@Autowired Spring uses @Resource访问地图。

与对另一个答案的评论相反,我认为设置也可以在代码中定义,因为它是用XML编写的并不会使它有任何不同,它们被认为是等价的。通过使用Java编写配置和设置,您可以获得OOP的强大功能,这在您进行复杂配置时非常棒。

示例Bean声明:

@Bean
public MyConfig myConfig() {
    final MyConfig myConfig = new MyConfig();
    myConfig.put("configA", "A");
    ...
    return myConfig;
}

@Bean
public Map<String, String> myMap() {
    final Map<String, String> myMap = new HashMap<>();
    myMap.put("A", "a");
    return myMap;
}

使用示例:

@Autowired
private MyConfig myConfig;

@Resource(name = "myMap")
private Map<String, String> myMap;

其次是使用properties文件中定义的全局系统属性。您可以在YAML或地图类型配置中编写属性。提供的链接中的详细信息。 的修改 您可以命名属性,然后使用@Value注释引用它们。您也可以在YAML中拥有collections

application.properties

myConfig.configA:A
myConfig.configB:B
myConfig.coll.cA:['a','b','c']
myConfig.coll.cB:{a:A,b:B,c:C}
...

代码

@Value("${myConfig.configA}")
private String configA;

答案 1 :(得分:0)

您只需在applicationContext.xml中使用<util:map>声明地图即可。

范围应该是单身

类型/类可以是java.util.HashMap

然后,您可以在组件中@Autowired那个bean。

<util:map id="utilmap" map-class="java.util.HashMap">
    <entry key="key1" value="value1"/>
    <entry key="key2" value="value2"/>
</util:map>