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實現本身。
添加回答
舉報