基于spring框架中的实体对象调用不同的Service api

时间:2010-12-09 06:04:59

标签: java spring inheritance service class-hierarchy

我正在使用spring框架设计的Web服务应用程序,其中我有不同的实体类(ActivityA,ActivityB,ActivityC ...),它们继承自基类“activity”

现在我已经在基类和所有子类的服务层中编写了不同的服务API。 (名称,ActivityService,ActivityAService,ActivityBService,ActivityCService ..)

所有为每个活动操作类似的方法都放在基类(ActivityService)的服务api中,并在各自的服务中休息。

我通常知道我正在处理哪个对象,并且我将相应的服务api称为。但在特定情况下,我有活动对象(不知道它是哪个子类),并且必须编写一个对所有实体对象都不同的方法。

问题:有没有办法,我可以根据我拥有的实体对象调用不同的服务。(我拥有的对象是实体,而不是服务,我不能做任何硬编码来获取服务对象)

1 个答案:

答案 0 :(得分:1)

  

但在特定情况下,我有活动对象(不知道它是哪个子类),必须编写一个对所有实体对象都不同的方法。

只需使基类抽象化并定义每个子类必须实现的抽象方法:

public abstract class ActivityService{
    public abstract Foo processEntity(Entity entity);
}
  

问题:有没有办法,我可以根据我拥有的实体对象调用不同的服务。(我拥有的对象是实体,而不是服务,我不能进行任何硬编码)

这是您应该尽量避免的情况。通常,您应该只将实体发送给知道如何处理它的服务,而不是发送给一堆服务,其中一个服务负责。但我要做的是使用一个调度程序服务来保存服务所负责的类的映射。它使用如下逻辑:

private Map<Class<? extends Entity>,
    Class<? extends ActivityService>> serviceMap =
        new ConcurrentHashMap<Class<? extends Entity>,
                              Class<? extends ActivityService>>();
private ApplicationContext context;
private ActivityService getServiceForEntity(Entity e){
    Class<? extends Entity> entityClass = e.getClass();
    Class<? extends ActivityService> serviceClass =
        serviceMap.get(entityClass);
    if(serviceClass==null){
        for(Map.Entry<Class<? extends Entity>,
                      Class<? extends ActivityService>> entry :
            serviceMap.entrySet()){
            if(entry.getKey().isAssignableFrom(entityClass)){
                serviceClass = entry.getValue();
                break;
            }
        }
        if(serviceClass==null){
            // throw a suitable exception
        }
        serviceMap.put(entityClass, serviceClass);
    }
    return context.getBean(serviceClass);
}