private void loadNetworkPlugins(NetworkProperties properties) {
        List<NetworkPluginProperties> propertiesList = properties.getPlugins();
        if (propertiesList.isEmpty()) {
            return;
        }
        ConnectionProvider connectionProvider = ConnectionProvider.newConnection();
        HttpClient client = HttpClient.create(connectionProvider);
        ProxyProperties proxy = properties.getProxy();
        if (proxy.isEnabled()) {
            client = client.proxy(spec -> {
                String host = proxy.getHost();
                if (StringUtil.isBlank(host)) {
                    throw new IllegalArgumentException("The host must not be blank");
                }
                ProxyProvider.Builder builder = spec.type(ProxyProvider.Proxy.HTTP)
                        .host(host)
                        .port(proxy.getPort())
                        .connectTimeoutMillis(proxy.getConnectTimeoutMillis());
                String username = proxy.getUsername();
                String password = proxy.getPassword();
                if (StringUtil.isNotBlank(username)) {
                    builder.username(username);
                }
                if (StringUtil.isNotBlank(password)) {
                    builder.password(s -> password);
                }
            });
        }
        List<Mono<?>> monos = new ArrayList<>(propertiesList.size());
        for (NetworkPluginProperties pluginProperties : propertiesList) {
            monos.add(loadNetworkPlugin(client, pluginProperties));
        }
        Mono.when(monos)
                .doFinally(type -> connectionProvider.dispose())
                // No need timeout here because we use the request timeout
                .block();
    }
@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