管理spring beans创建和字典

时间:2013-07-22 08:30:11

标签: spring spring-bean

我要管理bean实例和某种类型的资源之间的关联。更具体地说,当我收到与资源A相关的一些数据时,每次收到与指定资源相关的数据时,我都必须将数据分派给创建某种bean类型的实例。例如,如果我收到一些与资源“a”相关的数据,那么我必须将此数据分派给与“a”相关联的Bean实例。如果没有与资源“a”关联的Bean实例,则必须创建它。资源的数量不是静态知道的,只有在执行期间才会知道。

我知道我需要某种类型的字典来存储Resource id和bean实例之间的关联,构建类似Factory的东西来管理bean的创建。 我怎样才能在Spring中实现它?什么是正确的方法?

1 个答案:

答案 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>

此配置执行以下操作;

  • 为A类和B类数据设置服务
  • 将这些服务映射到密钥
  • 设置委托服务,设置要使用的地图

这种模式不是这样做的唯一方式,但是给你以下内容;

  • 独立配置服务bean的能力
  • 委托只需要一张地图来处理
  • 约束是服务对象必须是相同的接口

您可以将Spring ApplicationContext视为一个巨大的工厂,但(在很多方面)设置起来要简单得多。