Spring 配置元数据

Spring Configuration Metadata

我正在使用 spring 引导设置两个数据源,如此处所示 http://docs.spring.io/spring-boot/docs/1.3.0.M2/reference/htmlsingle/#howto-two-datasources,但是这样做时我的 application.properties 显示警告,例如 x.x.username 是未知 属性。这在某种程度上是正确的,因为 javax.sql.DataSource 不包含 url、用户名、密码等,但实现 类 包含。我设置了注释处理器,在处理具体 类 时它工作正常。

我注意到 org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$NonEmbeddedConfiguration 同时使用 DataSourceProperties 并在 dataSource() 上注释了 @ConfigurationProperties。这可能会消除我的警告,但这样做有什么意义。这样设置属性不就是两次吗?

配置:

@Bean
@Primary
@ConfigurationProperties(prefix="datasource.primary")
public DataSource primaryDataSource() {
    return DataSourceBuilder.create().build();
}

@Bean
@ConfigurationProperties(prefix="datasource.secondary")
public DataSource secondaryDataSource() {
    return DataSourceBuilder.create().build();
}

有警告的属性:

datasource.primary.url=jdbc:...
datasource.primary.username=user
datasource.primary.password=password

datasource.secondary.url=jdbc:...
datasource.secondary.username=user
datasource.secondary.password=password

既然有人不厌其烦地为这个问题 +1,我想我会 post 一个解决方案。请注意,我认为 DataSource 上的 @ConfigurationProperties 本身是不必要的,因为它们已经设置在用于构建 DataSourceDataSourceProperties 上,但我将其留在这是因为 Spring 团队在 org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$NonEmbeddedConfiguration 中就是这样做的。我唯一的猜测是,如果您的 DataSource 具有可以设置的其他属性而不是 DataSourceProperties 中公开的属性,那么您会在 "Spring Boot application.properties editor" 中收到这些属性的警告。

请注意,如果在类路径中找到 DataSourceDataSourceBuilder 将按此顺序使用 Tomcat、HikariCP 或 Commons DBCP,除非您使用 dataSourceBuilder.type(Class<? extends DataSource>)[= 指定其他内容22=]

属性:

datasource.primary.url=jdbc:...
datasource.primary.username=user
datasource.primary.password=password

datasource.secondary.url=jdbc:...
datasource.secondary.username=user
datasource.secondary.password=password

Java 配置:

@Bean
@Primary
@ConfigurationProperties(prefix = "datasource.primary")
public DataSourceProperties primaryProps() {
    return new DataSourceProperties();
}

@Bean
@ConfigurationProperties(prefix = "datasource.secondary")
public DataSourceProperties secondaryProps() {
    return new DataSourceProperties();
}

@Bean
@ConfigurationProperties(prefix = "datasource.primary")
public DataSource secondaryDataSource() {
    DataSourceProperties props = secondaryProps();
    return DataSourceBuilder.create(props.getClassLoader())
            .driverClassName(props.getDriverClassName())
            .url(props.getUrl())
            .username(props.getUsername())
            .password(props.getPassword())
            .build();
}

@Bean
@ConfigurationProperties(prefix = "datasource.primary")
public DataSource secondaryDataSource() {
    DataSourceProperties props = secondaryProps();
    return DataSourceBuilder.create(props.getClassLoader())
            .driverClassName(props.getDriverClassName())
            .url(props.getUrl())
            .username(props.getUsername())
            .password(props.getPassword())
            .build();
}