在 Java 中通过依赖注入进行继承(后期绑定)

2022-09-04 20:26:07

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

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

在这种情况下,我如何自动连接服务,因为它需要后期绑定服务。如何应对这种情况?(春季DI中的示例确实会有所帮助)

Builder calling Services

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

请帮忙。谢谢


答案 1

使用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;
  }

}

其中,实例有一个公共/包私有字段,该字段在其 和其他方法中的任何位置被调用。BuilderBaseService servicegetData()buildPojos()

(如果您希望此字段是私有的,也可以使用静态工厂方法来实例化)Builder


答案 2

您可以使用 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>

然后你的构建器将看起来像这样:

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
  }

推荐