# 79.2 配置两个数据源

如果你需要配置多个数据源，你可以应用上一节描述的技巧。但是，你必须把其中的一个`数据源`标注为`@Primary`，因为之后有各种不同的自动配置，至少需要通过类型得到一个。

如果你创建了你自己的`数据源`，自动配置将会后退。在下面的例子中，我们提供完全相同的特性，而不是自动配置提供的主要的数据源：

```java
@Bean
@Primary
@ConfigurationProperties("app.datasource.first")
public DataSourceProperties firstDataSourceProperties() {
    return new DataSourceProperties();
}

@Bean
@Primary
@ConfigurationProperties("app.datasource.first")
public DataSource firstDataSource() {
    return firstDataSourceProperties().initializeDataSourceBuilder().build();
}

@Bean
@ConfigurationProperties("app.datasource.second")
public BasicDataSource secondDataSource() {
    return DataSourceBuilder.create().type(BasicDataSource.class).build();
}
```

**提示** `firstDataSourceProperties`必须被标记为`@Primary`。这样，数据库初始化器特性会使用你的拷贝（如果你使用初始化器）。

两个数据源也都绑定到了高级的自定义。例如你应当如下配置它们：

```
app.datasource.first.type=com.zaxxer.hikari.HikariDataSource
app.datasource.first.maximum-pool-size=30

app.datasource.second.url=jdbc:mysql://localhost/test
app.datasource.second.username=dbuser
app.datasource.second.password=dbpass
app.datasource.second.max-total=30
```

你也可以应用相同的观念到第二个`数据源`：

```java
@Bean
@Primary
@ConfigurationProperties("app.datasource.first")
public DataSourceProperties firstDataSourceProperties() {
    return new DataSourceProperties();
}

@Bean
@Primary
@ConfigurationProperties("app.datasource.first")
public DataSource firstDataSource() {
    return firstDataSourceProperties().initializeDataSourceBuilder().build();
}

@Bean
@ConfigurationProperties("app.datasource.second")
public DataSourceProperties secondDataSourceProperties() {
    return new DataSourceProperties();
}

@Bean
@ConfigurationProperties("app.datasource.second")
public DataSource secondDataSource() {
    return secondDataSourceProperties().initializeDataSourceBuilder().build();
}
```

这个最后的例子用相同的逻辑，在自定义的命名空间配置了两个数据源，而没有使用Spring Boot的自动配置。
