想象一下具有不同阶段的分阶段应用程序上下文。我们从早期阶段开始定义必要的基础结构。 xml应用程序上下文按顺序加载。
拆分这些文件的原因是扩展/插件机制。
阶段01-default-configuration.xml
我们准备并声明ID为exampleMapping
的地图,以便稍后使用数据对其进行增强。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="[...]">
<util:map id="exampleMapping" />
</beans>
阶段02-custom-configuration.xml (可选)
我们配置exampleMapping
并添加一个条目。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="[...]">
<util:map id="exampleMapping">
<entry key="theKey" value="theValue" />
</util:map>
</beans>
阶段03-make-use-of-configuration.xml (强制性)
使用定义的映射exampleMapping
,无论它是自定义配置的还是仍然是空的声明映射。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="[...]">
<bean id="exampleService" class="com.stackoverflow.example.ExampleService">
<property name="mapping" ref="exampleMapping" />
</bean>
</beans>
这里的问题是,在第一阶段之后无法将条目添加到exampleMapping
映射中。 Spring抛出一个异常,即ID为exampleMapping
的地图已经存在。如果我们省略了第一阶段,则未声明映射,第三阶段无法解析exampleMapping
,这也会产生异常。
我该如何解决这个问题?我读了Collection merging(春天的文档),但这没有帮助。是否有可能在以后使用值之前在地图/列表中添加值?
谢谢!
参考方案
您可以定义exampleMapping
,第二个定义在单独的文件中,然后使用<import resource="..."/>
将一个文件导入另一个文件,但这是一种脆弱的方法,很容易被破坏。
我建议采取更有效的策略。将exampleMapping
替换为Registry
类,该类又包含并管理映射:
public MappingRegistry<K,V> {
private final Map<K,V> mappings = new HashMap<K,V>();
public void addMapping(K key, V value) {
mappings.put(key, value);
}
public Map<K,V> getMappings() {
return Collections.unmodifiableMap(mappings);
}
}
然后,编写一个向注册表注册映射的类:
public class MappingRegistrar<K,V> {
private final MappingRegistry<K,V> registry;
private K key;
private V value;
@Autowired
public MappingRegistrar(MappingRegistry<K,V> registry) {
this.registry = registry;
}
public void setKey(K key) {
this.key = key;
}
public void setValue(V value) {
this.value = value;
}
@PostConstruct
public void registerMapping() {
registry.addMapping(key, value);
}
}
您的配置将如下所示:
<bean id="mappingRegistry" class="com.xyz.MappingRegistry"/>
<bean id="mappingA" class="com.xyz.MappingRegistrar" p:key="keyA" p:value="valueA"/>
<bean id="mappingB" class="com.xyz.MappingRegistrar" p:key="keyB" p:value="valueB"/>
<bean id="mappingC" class="com.xyz.MappingRegistrar" p:key="keyC" p:value="valueC"/>
这些映射现在可以按照您认为合适的任何方式散布在您的配置中,并且它们将自动组装。然后将ExampleServcie
注入MappingRegistry
并相应地提取映射。
它比您已经拥有的工作要多一些,但是它更加灵活并且不易出错。如果您要构建某种可扩展的框架,则这特别有价值。您希望对人们的使用方式施加更少的限制。
Java Applet的URLConnection与PHP无效 - java我已经研究了Oracle文档和示例,但仍然无法正常工作。我有一个Java Applet,它只是尝试使用URLConnection和OutputStreamWriter通过POST将文本字段发送到PHP脚本。 Java方面似乎工作正常,没有引发异常,但是PHP在我的页面上未显示任何输出。我是PHP新手,因此请耐心等待。这是相关的Java部分: try { UR…
页面加载而不是提交时发生struts验证 - java请原谅我;我对Struts有点陌生。我遇到一个问题,即页面加载而不是我实际提交表单时发生了验证。我整天都在论坛上搜寻和搜寻,没有任何运气。我显然做错了一些事情,应该很容易确定,但是我还没有发现问题所在。这是我的struts.xml的片段:<action name="*Test" method="{1}" clas…
DataSourceTransactionManager和JndiObjectFactoryBean和JdbcTemplate的用途是什么? - java以下的用途是什么:org.springframework.jdbc.core.JdbcTemplate org.springframework.jdbc.datasource.DataSourceTransactionManager org.springframework.jndi.JndiObjectFactoryBean <tx:annotatio…
Struts2中的错误处理 - java我对如何在Struts2中进行错误处理感到困惑。我希望在发生错误时将用户引导到一个中心页面。此外,当发生错误时,我希望将其记录下来,因为我使用的是log4j,因此我将其记录为log.error(e.getMessage(), e);但是,在动作类中,如果我捕获到错误(将我的所有代码放入try / catch中),则不会出现中央/常见错误页面。因此,我决定不捕…
在XSL中访问Hashmap时出现问题 - java假设,我有一段代码: Map mappingId = new HashMap(); mappingId.put("1", "1000"); transformer.setParameter("mappingId", mappingId); transformer.transform(...); 我有…