Java中依赖注入的继承(后期绑定)

Chi*_*iri 13 java soa inheritance spring late-binding

我正在使用Spring DI连接我的组件,我遇到了这个问题.

我有一个BaseService类,它有多个实现.它上面的层有一个构建器,它调用服务来获取数据来填充POJO.我需要调用的服务实现(ServiceA,ServiceB)根据我需要构建的POJO的类型进行更改.

在这种情况下,我如何自动装配服务,因为它需要后期绑定服务.我该如何处理这种情况?(Spring DI中的例子真有帮助)

生成器调用服务

我读了类似的问题,但找不到答案.我读到服务主机等SOA模式为确切的用例提供了不同的解决方案.

请帮忙.谢谢

dre*_*ore 7

如何使用FactoryBean:

public class BuilderFactory implements FactoryBean<Builder> {

  @Autowired
  private ApplicationContext appContext;

  ...

  @Override
  public Builder getObject() {
      Builder builder = new Builder();      
      switch(something()) { 
         case "foo":
             builder.service = new ServiceA(); 
             break;
         case "bar":
             builder.service= new ServiceB();
             break;
         ...
         default:
             //handle cases where it's unclear which type to create

         }
     return builder;
  }

}
Run Code Online (Sandbox Code Playgroud)

其中Builder实例有一个public/package-private字段BaseService service,可以在其中调用getData(),buildPojos()也可以在其他任何方法中调用.

(Builder如果希望此字段为私有,也可以使用静态工厂方法进行实例化)

  • 我忘记了FactoryBeans. (2认同)

geo*_*and 5

您可以使用ServiceLocatorFactoryBean.在你的情况下你会做这样的事情:

public interface BaseServiceLocator {

   BaseService lookup(String qualifier); //use whatever qualifier type makes sense here
}

<bean id="serviceLocatorFactoryBean"
    class="org.springframework.beans.factory.config.ServiceLocatorFactoryBean">
    <property name="serviceLocatorInterface"
              value="your.package.BaseServiceLocator" />
</bean>
Run Code Online (Sandbox Code Playgroud)

那么你的构建器看起来像这样:

public class Builder {

  @Autowired
  private BaseServiceLocator baseServiceLocator;

  @Override
  public YourReturnType businessMethod() {
      SomeData data = getData();
      BaseService baseService = baseServiceLocator(data.getType()); //here I am assuming that getType() is a String

      //whatever
  }
Run Code Online (Sandbox Code Playgroud)