public <T extends ExtensionPoint, R> Mono<R> invokeExtensionPointsSequentially(
            Class<T> extensionPointClass,
            Method method,
            @Nullable R initialValue,
            SequentialExtensionPointInvoker<T, R> invoker) {
        List<T> extensionPoints = pluginRepository.getExtensionPoints(extensionPointClass);
        if (extensionPoints.isEmpty()) {
            return initialValue == null
                    ? Mono.empty()
                    : Mono.just(initialValue);
        }
        Mono<R> result = initialValue == null
                ? Mono.empty()
                : Mono.just(initialValue);
        for (ExtensionPoint extensionPoint : extensionPoints) {
            TurmsExtension extension = (TurmsExtension) extensionPoint;
            if (!extension.isRunning()) {
                continue;
            }
            try {
                result = invoker.invoke((T) extensionPoint, result)
                        .onErrorMap(t -> translateException(t, method, extension));
            } catch (Exception e) {
                Mono<R> error = Mono.error(translateException(e, method, extension));
                return result.then(error);
            }
        }
        return result;
    }
@implNote Start plugins after all beans are ready so that plugins can get any bean when
          starting.
turms-server-common/src/main/java/im/turms/server/common/infra/plugin/PluginManager.java