SpringApplicationContext
可以用这种“字典”的方式来引用。也就是说,您指定应用程序上下文来“设置”“资源 bean”。然后,您通过Map
对象的方式映射“接收到的数据”,该对象又持有对 bean 的引用。一旦数据映射到 bean,您就可以检索 bean 并处理接收到的数据。这是一个简短的例子
这是一个资源服务接口
package de.incompleteco.spring.service;
public interface ResourceService {
public void processData(Object data);
}
这是处理“TypeA”数据的实现
package de.incompleteco.spring.service;
public class TypeAResourceService implements ResourceService {
public void processData(Object data) {
//do something for 'type A' data
}
}
这是一个“代表”服务
package de.incompleteco.spring.service;
import java.util.Map;
import de.incompleteco.spring.domain.TypeA;
import de.incompleteco.spring.domain.TypeB;
public class DelegateResourceService implements ResourceService {
private Map<String,ResourceService> services;
public void processData(Object data) {
if (data instanceof TypeA) {
services.get(TypeA.class.getSimpleName()).processData(data);
} else if (data instanceof TypeB) {
services.get(TypeA.class.getSimpleName()).processData(data);
} else {
throw new IllegalArgumentException("...");
}
}
public void setServices(Map<String, ResourceService> services) {
this.services = services;
}
}
“委托”服务负责从映射中检索正确的服务以处理正确的数据(由类名键入)
这是要支持的弹簧配置
<?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:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<!-- type 'a' bean -->
<bean id="typeA" class="de.incompleteco.spring.service.TypeAResourceService"/>
<!-- type 'b' bean -->
<bean id="typeB" class="de.incompleteco.spring.service.TypeBResourceService"/>
<util:map id="dictionary">
<entry key="TypeA" value-ref="typeA"/>
<entry key="TypeB" value-ref="typeB"/>
</util:map>
<bean class="de.incompleteco.spring.service.DelegateResourceService">
<property name="services" ref="dictionary"/>
</bean>
</beans>
此配置执行以下操作;
- 为 A 类和 B 类数据设置服务
- 将这些服务映射到键
- 设置委托服务,设置要使用的地图
这种模式不是唯一的方法,而是为您提供以下内容;
- 独立配置服务 bean 的能力
- 代表只需要一张地图来处理
- 约束是服务对象必须具有相同的接口
您可以将 Spring ApplicationContext 视为一个巨大的工厂,但(在许多方面)设置起来要简单得多。