我要管理bean实例和某种类型的资源之间的关联。更具体地说,当我收到与资源A相关的一些数据时,每次收到与指定资源相关的数据时,我都必须将数据分派给创建某种bean类型的实例。例如,如果我收到一些与资源“a”相关的数据,那么我必须将此数据分派给与“a”相关联的Bean实例。如果没有与资源“a”关联的Bean实例,则必须创建它。资源的数量不是静态知道的,只有在执行期间才会知道。
我知道我需要某种类型的字典来存储Resource id和bean实例之间的关联,构建类似Factory的东西来管理bean的创建。 我怎样才能在Spring中实现它?什么是正确的方法?
答案 0 :(得分:0)
春天ApplicationContext
可以在这个词典中被引用'时尚。也就是说,您指定应用程序上下文以设置'资源豆'。然后,您可以映射“已接收的数据”。通过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;
}
}
代表&#39; service负责从地图检索正确的服务以处理正确的数据(按类名称键入)
这里是支持的弹簧配置
<?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>
此配置执行以下操作;
这种模式不是这样做的唯一方式,但是给你以下内容;
您可以将Spring ApplicationContext视为一个巨大的工厂,但(在很多方面)设置起来要简单得多。