1 回答
TA贡献1877条经验 获得超6个赞
您可以@Autowireda Listof MyService,这将创建一个List实现该MyService接口的所有 bean。然后您可以添加一个方法来MyService接受一个MyRequest对象并决定它是否可以处理该请求。List然后,您可以过滤MyService以找到MyService可以处理请求的第一个对象。
例如:
public interface MyService {
public boolean canHandle(MyRequest request);
// ...existing methods...
}
@Service
public class ActivateUserService extends ServiceBase {
@Override
public boolean canHandle(MyRequest request) {
return Action.ACTIVATE.equals(request.getAction()) && UserType.USER.equals(request.getUserType());
}
// ...existing methods...
}
@Component
public class ServiceFactory {
@Autowired
private List<MyService> myServices;
public Optional<MyService> getService(MyRequest request) {
return myServices.stream()
.filter(service -> service.canHandle(request))
.findFirst();
}
}
请注意,ServiceFactory上面的实现使用 Java 8+。如果 Java 8 或更高版本无法实现,则可以ServiceFactory通过以下方式实现该类:
@Component
public class ServiceFactory {
@Autowired
private List<MyService> myServices;
public Optional<MyService> getService(MyRequest request) {
for (MyService service: myServices) {
if (service.canHandle(request)) {
return Optional.of(service);
}
}
return Optional.empty();
}
有关使用@Autowiredwith的更多信息List,请参阅Autowire 将 bean 引用到按类型列表中。
该解决方案的核心是将决定MyService实现是否可以处理MyRequest来自ServiceFactory(外部客户端)的逻辑转移到MyService实现本身。
添加回答
举报