

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在代码中配置服务客户端 AWS SDK for Java 2.x
<a name="configuring-service-clients-code"></a>

除了（或作为替代方案）[通过外部方式配置服务客户端](configuring-service-clients-ext.md)之外，您还可以在代码中以编程方式对其进行配置。

通过在代码中配置服务客户端，您可以精细地控制许多可用的选项。可以通过外部方式设置的大多数配置也可以在代码中进行设置。

## 代码中的基本配置
<a name="conf-service-client-code-basic"></a>

例如，以下代码段在代码中 AWS 区域 将 `EU_SOUTH_2` Amazon S3 服务客户端的设置为：

```
S3Client s3Client = S3Client.builder()
        .region(Region.EU_SOUTH_2)
        .build();
```

前面的代码段显示了静态工厂方法 `builder()`。`builder()` 方法返回一个允许您自定义服务客户端的 `builder` 对象。fluent setter 方法会返回 `builder` 对象（在本例中为 [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3ClientBuilder.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3ClientBuilder.html) 实例），这样就可以将多个方法调用链式地写在一起，使代码更简洁、更易读。在配置了所需属性后，可以调用 `build()` 方法创建客户端。

## 代码中的高级配置
<a name="conf-service-client-code-several"></a>

下面的代码段显示了额外配置选项：

```
ClientOverrideConfiguration clientOverrideConfiguration =
        ClientOverrideConfiguration.builder()
                .apiCallAttemptTimeout(Duration.ofSeconds(1))
                .addMetricPublisher(CloudWatchMetricPublisher.create())
                .build();

S3Client s3Client = S3Client.builder()
        .region(Region.EU_SOUTH_2)
        .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
        .overrideConfiguration(clientOverrideConfiguration)
        .httpClientBuilder(
                ApacheHttpClient.builder()
                        .maxConnections(100)
                        .connectionTimeout(Duration.ofSeconds(5))
                        .proxyConfiguration(ProxyConfiguration.builder()
                                .endpoint(URI.create("http://proxy:8080"))
                                .build())
        ).build();
```

在前面的代码段中，您可以看到配置服务客户端的几个入口点：
+ 提供所有服务客户端通用的配置选项的 [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/client/config/ClientOverrideConfiguration.Builder.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/client/config/ClientOverrideConfiguration.Builder.html)。这些设置是与 AWS任何 HTTP 实现无关的特定行为。
+ **通过单独的 HTTP 客户端生成器实现来配置 HTTP 客户端。**`ApacheHttpClient.Builder` 就是一个这样的例子。服务客户端提供 `httpClientBuilder()` 方法，将配置好的 HTTP 客户端关联到服务客户端。
+ **[客户端生成器](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/services/s3/S3ClientBuilder.html)本身的方法，**例如 `region()` 和 `credentialsProvider()`

### 使用配置块来实现相同的配置
<a name="service-client-config-lambda"></a>

不是创建单独的对象然后将它们传递给服务客户端方法，而是 AWS SDK for Java 2.x 提供了接受 lambda 表达式来内联构建这些对象的方法。生成器上的配置方法名称相同，但具有不同的签名。例如：
+ [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/client/builder/SdkClientBuilder.html#overrideConfiguration(software.amazon.awssdk.core.client.config.ClientOverrideConfiguration)](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/client/builder/SdkClientBuilder.html#overrideConfiguration(software.amazon.awssdk.core.client.config.ClientOverrideConfiguration))
+ [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/client/builder/SdkClientBuilder.html#overrideConfiguration(java.util.function.Consumer)](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/core/client/builder/SdkClientBuilder.html#overrideConfiguration(java.util.function.Consumer))

前面所示的 S3 客户端配置，如果使用这种方法，可以用一个代码块来完成：

```
S3Client s3Client = S3Client.builder()
        .region(Region.EU_SOUTH_2)
        .credentialsProvider(EnvironmentVariableCredentialsProvider.create())
        .overrideConfiguration(b -> b
                .apiCallAttemptTimeout(Duration.ofSeconds(1))
                .addMetricPublisher(CloudWatchMetricPublisher.create()))
        .httpClientBuilder(ApacheHttpClient.builder()
                .maxConnections(100)
                .connectionTimeout(Duration.ofSeconds(5))
                .proxyConfiguration(ProxyConfiguration.builder()
                        .endpoint(URI.create("http://proxy:8080"))
                        .build()))
        .build();
```

## 代码中不可用的配置选项
<a name="conf-servic-client-only-ext"></a>

由于以下设置会影响 SDK 中的基本初始化过程，因此只能通过外部方式而不能在代码中设置以下配置设置：

### 文件位置设置
<a name="code-only-conf-file-loc"></a>

这些设置控制共享配置和凭证文件的位置，在 SDK 加载这些设置后无法以编程方式对其进行覆盖：
+ **AWS\$1CONFIG\$1FILE**（环境变量）/**aws.configFile**（JVM 系统属性）
+ **AWS\$1SHARED\$1CREDENALS\$1FILE****（环境变量）/aws。 sharedCredentialsFile**（JVM 系统属性）

因为这些设置决定了 SDK 在哪里查找配置，所以必须在 SDK 加载配置文件之前进行设置。SDK 初始化完成后，更改这些值将不再生效。

### 实例元数据服务禁用
<a name="code-only-conf-imds"></a>
+ **AWS\$1EC2\$1METADATA\$1DISABLED**（环境变量）/a **w** s.disableec2Metadata（JVM 系统属性）

此设置用于控制 SDK 是否会尝试使用 EC2 实例元数据服务。SDK 初始化完成后，就无法以编程方式更改此设置。

### 配置文件选择
<a name="code-only-conf-profile"></a>
+ **AWS\$1PROFILE**（环境变量）/**aws.profile**（JVM 系统属性）

此设置告诉 SDK 从共享配置和凭证文件中加载哪个配置文件。加载后，更改此值将不再生效。

### 容器凭证路径
<a name="code-only-conf-container-cred-path"></a>
+ **AWS\$1CONTAINER\$1凭证\$1相对\$1URI**
+ **AWS\$1CONTAINER\$1凭证\$1完整的 URI**
+ **AWS\$1CONTAINER\$1授权\$1令牌**
+ **AWS\$1CONTAINER\$1Authorization\$1TOKEN\$1FILE**

使用这些环境变量告诉 SDK 如何从容器服务获取凭证。在服务客户端初始化期间建立凭证提供程序链后，无法再更改这些设置。

### 默认 HTTP 实现选择
<a name="code-only-conf-http-impl"></a>
+ **SYNC\$1HTTP\$1SERVICE\$1IMPL**（环境变量）/**software.amazon.awssdk.http.service.impl**（JVM 系统属性）
+ **ASYNC\$1HTTP\$1SERVICE\$1IMPL**（环境变量）/**software.amazon.awssdk.http.async.service.impl**（JVM 系统属性）

这些全局设置决定了 SDK 在所有服务客户端中默认使用哪个 HTTP 客户端实现，除非在代码中为单个服务客户端覆盖了该设置。您必须在 SDK 初始化其 HTTP 客户端之前进行设置，之后不能再更改。