想象一下具有不同阶段的分阶段应用程序上下文。我们从早期阶段开始定义必要的基础结构。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 (强制性)
使用已定义的map exampleMapping
,无论它是自定义配置的还是仍然是空的声明的map。
<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合并(春季文档),但这没有帮助。是否有可能在以后使用值之前在地图/列表中添加值?
谢谢!
您 可以 定义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
提取映射。
它比您已经拥有的工作要多一些,但是它更加灵活并且不易出错。如果您要构建某种可扩展的框架,则这特别有价值。您希望对人们的使用方式施加更少的限制。
问题内容: 您可以在不使用元素的情况下在Spring application-context.xml文件中创建列表吗? 我有一个其构造函数带有对象的bean,并且我想通过“ value”属性传递整个列表。原因是此值来自.properties文件,您无法在.properties文件中定义列表。 我想做这样的事情…可能吗? MyClass.java: application-context.xml:
问题内容: 我正在使用应用程序工厂模式来设置我的Flask应用程序。我的应用程序使用Flask- Babel扩展程序,该扩展程序也在工厂中设置。但是,我想以蓝图的形式访问该扩展程序以便使用它, 工厂在。 我想添加以下内容: 不幸的是,无法从应用程序工厂访问变量。我应该如何解决这个问题? 问题答案: 正是这种情况下,Flask扩展被设计为无需应用程序实例即可实例化。在工厂外,定义扩展。在工厂内部,致
我们有四个具有适当项目依赖关系的Eclipse项目:Web、Business、Common(包含域对象、DTOs、异常等)、DataAccess。 我想尽可能地使用注释,并且已经使用JDBC模板创建了一个MVC控制器、一个带有接口的新服务和一个带有接口的新dao,这一切都很好用。 现在我的问题是: 我的设置有任何意义吗? 谢谢你的洞察力。
我有一个spring boot应用程序abc.myapp.war,它部署在外部tomcat服务器上。默认情况下,tomcat使用war文件名作为部署的应用程序的上下文路径,因此它变成http://localhost:8080/abc.myapp,但我希望有一个自定义的上下文路径,如http://localhost:8080/abc/myapp。我阅读了其他帖子,他们建议在tomcat的server
根据要求,我必须创建一个自定义对象列表,其中包含集合中的id、名称、地址等细节(数组、列表、映射等)。如何遍历集合列表以获取基于id的唯一记录? 我创建了一个List对象,它包含不同的集合变量,如arraylist,set,map等。在将自定义对象值分配给List之后,它将被转换为对象类Object。例如,我创建了一个hashmap形式的自定义对象,键为1,值为ID=1,Name=AAA,Addr
/library/frameworks/mono.framework/external/xbuild/xamarin/android/xamarin.android.common.targets:错误:执行任务生成器时出错JavaStubs:应用程序不能同时具有[Application]属性和[assembly:Application]属性的类型。(MyApp.Droid) 如果I applica