Spring根据请求值使用不同的bean

时间:2017-10-03 11:09:03

标签: java spring spring-mvc spring-boot inversion-of-control

我想根据请求对象中的信息,在每个父bean中的根级bean和bean中使用特定(合格) bean。

我们说我有特定类型的请求的具体工具,我在运行时(request-body对象中的信息)获得决策值。我需要构建我的代码,这将完整 - 满足我的以下要求。

请考虑以下示例网页示例,如果请求中的 标识 值要求B的实施和C&#39,我需要打印B&B方法; s方法,如果请求专门用于C&C的实现。 InputPayload具有标识属性systemType以决定系统特定的实现。

----------Controller class---------

@RestController
public class ResourceController {
  @Autowired
  private RootInterface i;   //Class A will be injected here

  @PostMapping(path = "/update", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
  public Result callInterfaceMethod(@RequestBody InputPayload inputPayload) {
    return i.callRootInterfaceMethod(inputPayload);
  }
}

----------Service classes---------

@Service
public class A implements RootInterface {
  @Autowired
  private D d;

  @override
  public Result callRootInterfaceMethod(InputPayload inputPayload) {
    return d.methodToImplement(inputPayload);
  }
}

public interface D {
  Result methodToImplement(InputPayload inputPayload);
}

@Service
public class B implements D {
  @override
  private Result methodToImplement(InputPayload inputPayload) {
    system.out.println("Class B method is called");
    ....
  }
}

@Service
public class C implements D {
  @override
  private Result methodToImplement(InputPayload inputPayload) {
    system.out.println("Class C method is called");
    ....
  }
}

如果我没有。服务类,它们被注入另一个父服务类(假设最小深度为5)。如何使用调用相应的服务类而不是使用带有多个变量声明的@Qualifier注释或创建不同的引用?如何调用各自实现的方法而不是任何条件块?

1 个答案:

答案 0 :(得分:0)

你可以:

  • 在D接口上引入方法,该方法将检查实现是否可以根据输入的属性处理输入

    public interface D {
      Result methodToImplement(InputPayload inputPayload);
      boolean canProcessInput(InputPayload inputPayload);
    }
    
    //autowire all beans of type D
    @Autowired
    private List<D> dList;
    
    @Override
    public Result callRootInterfaceMethod(InputPayload inputPayload) {
      for(D d: dList) {
        if(d.canProcessInput(inputPayload)) {
          return d.methodToImplement(inputPayload);
        }
      }
      // if there is no bean that is capable of processing the input payload
      return null;
    }
    
  • 自动装配所有服务,并为每种类型的服务添加切换条件,例如

    // autowire all beans with their names
    @Autowired
    private Map<String, D> dMap;
    
    @Override
    public Result callRootInterfaceMethod(InputPayload inputPayload) {
      switch(inputPayload.getType()) {
        case A: { 
          return dMap.get("A").methodToImplement(inputPayload); 
        }
        case B: { 
          return dMap.get("B").methodToImplement(inputPayload); 
        }
        // if there is no bean that is capable of processing the input payload
        default: return null;
      }
    }
    

在我看来,第一个选项是更清晰和可扩展的