Spring按prefix注入自定义@ConfigurationProperties无需逐建Bean方案问询
实现方案
完全可以实现,你可以直接使用Spring Boot 2.0及以上版本提供的Binder API,直接从Spring环境变量中绑定指定前缀的配置到你的DatabaseProperties实例,既不需要为每个数据源单独注册配置Bean,也不需要手动写@Value注入单个属性。
实现步骤
- 首先保证你的
DatabaseProperties是标准的配置属性类,包含对应配置字段的getter、setter方法(如果用不可变类可以搭配@ConstructorBinding注解):
@ConfigurationProperties(prefix = "datasource", ignoreUnknownFields = false) public class DatabaseProperties { private String url; private String username; private String password; private String driverClassName; // 省略所有字段的getter、setter方法 }
- 在JdbcTemplate的配置类中注入
Environment对象,在每个JdbcTemplate的Bean方法中通过Binder绑定对应前缀的配置即可:
@Configuration public class JdbcTemplateConfig { private final Environment environment; // 构造注入Spring环境对象 public JdbcTemplateConfig(Environment environment) { this.environment = environment; } @Bean public JdbcTemplate database1JdbcTemplate() { // 绑定datasource.database1前缀的配置到DatabaseProperties实例 DatabaseProperties db1Props = Binder.get(environment) .bind("datasource.database1", DatabaseProperties.class) .orElseThrow(() -> new IllegalArgumentException("缺失database1相关数据源配置")); // 基于配置构造数据源,生成JdbcTemplate HikariDataSource dataSource = new HikariDataSource(); dataSource.setJdbcUrl(db1Props.getUrl()); dataSource.setUsername(db1Props.getUsername()); dataSource.setPassword(db1Props.getPassword()); dataSource.setDriverClassName(db1Props.getDriverClassName()); return new JdbcTemplate(dataSource); } @Bean public JdbcTemplate database2JdbcTemplate() { // 绑定datasource.database2前缀的配置到DatabaseProperties实例 DatabaseProperties db2Props = Binder.get(environment) .bind("datasource.database2", DatabaseProperties.class) .orElseThrow(() -> new IllegalArgumentException("缺失database2相关数据源配置")); HikariDataSource dataSource = new HikariDataSource(); dataSource.setJdbcUrl(db2Props.getUrl()); dataSource.setUsername(db2Props.getUsername()); dataSource.setPassword(db2Props.getPassword()); dataSource.setDriverClassName(db2Props.getDriverClassName()); return new JdbcTemplate(dataSource); } }
方案优势
- 不需要在Spring上下文中注册多个
DatabaseProperties类型的Bean,避免了同类型Bean需要限定注入的问题 - 完全复用
@ConfigurationProperties的原生能力,支持类型转换、配置校验、宽松绑定等特性,不需要手动写大量@Value注入单个属性 - 扩展成本低,新增数据源只需要新增对应的JdbcTemplate Bean方法,修改绑定前缀即可
内容的提问来源于stack exchange,提问作者Serhii Kachan
相关产品推荐
相关产品推荐

