1

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

我知道我需要某种类型的字典来存储资源 id 和 bean 实例之间的关联,构建类似工厂的东西来管理 bean 创建。如何在 Spring 中实现这一点?什么是正确的方法?

4

1 回答 1

0

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 视为一个巨大的工厂,但(在许多方面)设置起来要简单得多。

于 2013-07-22T11:27:00.867 回答