为什么在 Spring 中构建 DataSource 需要 @ConfigurationProperties?

Why is @ConfigurationProperties needed in building a DataSource in Spring?

如果@ConfigurationProperties将属性绑定到一个对象中,@ConfigurationProperties在构建DataSource时有什么用?

application.properties

#Database
database1.datasource.url=jdbc:mysql://localhost/testdb
database1.datasource.username=root
database1.datasource.password=root
database1.datasource.driver-class-name=com.mysql.jdbc.Driver

数据源 Bean:

@Bean(name = "datasource1")
@ConfigurationProperties("database1.datasource")
@Primary
public DataSource dataSource(){
    return DataSourceBuilder.create().build();
}

此外,如果数据源属性已经在单独的 bean 中使用 @ConfigurationProperties 绑定,我们是否还需要将相同的注释放在数据源构建器 bean 中?

@Bean
@ConfigurationProperties("database1.datasource")
public DataSourceProps dataSourceProps(){
    return new DataSourceProps();
}

@Bean(name = "datasource1")
// @ConfigurationProperties("database1.datasource") Is this necessary?
@Primary
public DataSource dataSource(){
    return dataSourceProps().initializeDataSourceBuilder().type(HikariDataSource.class).build();
}

不,您不需要将 @ConfigurationProperties("database1.datasource") 放在第二个 bean 上。它不会服务于任何目的。但是,如果您将 @ConfigurationProperties("database1.datasource.hikari") 放在第二个 bean 上,它将配置您的 HikariDataSource。例如,您有一个类似于

的属性文件
mysql.datasource.url=jdbc:mysql://localhost:3306/test
mysql.datasource.username=root
mysql.datasource.password=password
mysql.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

mysql.datasource.hikari.minimum-idle=3
mysql.datasource.hikari.maximum-pool-size=8

你的配置就像

    @Bean
    @ConfigurationProperties("mysql.datasource")
    public DataSourceProperties mysqlDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean
    @ConfigurationProperties("mysql.datasource.hikari")
    public DataSource mysqlDataSource() {
        return mysqlDataSourceProperties().initializeDataSourceBuilder()
                .type(HikariDataSource.class).build();
    }

第一个 bean 使用数据库 url、用户名和密码创建一个 DataSourceProperties,它们由 mysql.datasource.* 提供。如果你不添加 @ConfigurationProperties("mysql.datasource.hikari") spring 将使用默认值配置 hikari 数据连接池,你将无法通过更改 属性 文件来更改它们。所以两个配置属性服务器有两个不同的用途。