

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 覆寫服務用戶端組態
<a name="override-client-config"></a>

[建立服務用戶端](creating-clients.md)之後，服務用戶端會針對所有操作使用固定組態。不過，有時您可能需要覆寫一或多個特定操作的組態。

每個服務用戶端都有`withConfig`擴充功能，讓您可以修改現有組態的副本。`withConfig` 延伸項目會傳回具有修改後組態的新服務用戶端。原始用戶端獨立存在，並使用其原始組態。

下列範例顯示建立呼叫兩個操作的`S3Client`執行個體。

```
val s3 = S3Client.fromEnvironment {
    logMode = LogMode.LogRequest
    region = "us-west-2"
    // ...other configuration settings...
}

s3.listBuckets { ... }
s3.listObjectsV2 { ... }
```

下列程式碼片段顯示如何覆寫單一`listObjectV2`操作的組態。

```
s3.withConfig {
    region = "eu-central-1"
}.use { overriddenS3 ->
    overriddenS3.listObjectsV2 { ... }
}
```

`s3` 用戶端上的操作呼叫會使用建立用戶端時指定的原始組態。其組態包含 `us-west-2 region` 區域的[請求記錄](logging.md#sdk-log-mode)和 。

`overriddenS3` 用戶端上的`listObjectsV2`調用使用與原始`s3`用戶端相同的設定，但 區域除外，現在為 `eu-central-1`。

## 覆寫用戶端的生命週期
<a name="override-client-lifecycle"></a>

在先前的範例中，`s3`用戶端和`overriddenS3`用戶端彼此獨立。只要操作保持開啟狀態，就可以在任一用戶端上叫用操作。每個 使用單獨的組態，但除非這些組態也被覆寫，否則它們可以共用基礎資源 （例如 HTTP 引擎）。

您可以分別關閉具有覆寫組態的用戶端和原始用戶端。您可以在關閉原始用戶端之前或之後，關閉具有覆寫組態的用戶端。除非您需要長時間使用具有覆寫組態的用戶端，否則建議您使用 `use`方法包裝其生命週期。`use` 方法可確保在發生例外狀況時關閉用戶端。

## 用戶端之間共用的資源
<a name="override-client-shared-res"></a>

當您使用 建立服務用戶端時`withConfig`，它可能會與原始用戶端共用資源。相反地，當您使用 [fromEnvironment](creating-clients.md#loading-from-the-environment) 建立用戶端或[明確設定用戶端](creating-clients.md#programmatic-config)時，用戶端會使用獨立資源。除非在 `withConfig`區塊中覆寫，否則會共用 HTTP 引擎和登入資料提供者等資源。

由於每個用戶端的生命週期都是獨立的，共用資源會保持開啟和可用，直到最後一個用戶端關閉為止。因此，當您不再需要覆寫的服務用戶端時，請務必將其關閉。這可防止共用資源保持開啟並耗用系統資源，例如記憶體、連線和 CPU 週期。

下列範例顯示共用和獨立資源。

`s3` 和 `overriddenS3`用戶端共用相同的登入資料提供者執行個體，包括其快取組態。如果快取值仍是`s3`用戶端所進行呼叫的目前值，則透過`overriddenS3`重複使用登入資料進行的呼叫。

 HTTP 引擎不會在兩個用戶端之間共用。每個用戶端都有獨立的 HTTP 引擎，因為它在`withConfig`呼叫中遭到覆寫。

```
val s3 = S3Client.fromEnvironment {
    region = "us-west-2"
    credentialsProvider = CachedCredentialsProvider(CredentialsProviderChain(...))
    httpClientEngine = OkHttpEngine { ... }
}

s3.listBuckets { ... }

s3.withConfig {
    httpClientEngine = CrtHttpEngine { ... }
}.use { overriddenS3 ->
    overriddenS3.listObjectsV2 { ... }
}
```