我想根据请求对象中的信息,在每个父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注释或创建不同的引用?如何调用各自实现的方法而不是任何条件块?
答案 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;
}
}
在我看来,第一个选项是更清晰和可扩展的