如何扩展Spring Boot的DataSourceAutoConfiguration

时间:2014-04-23 22:53:34

标签: java spring spring-boot

我希望能够利用Spring Boot数据源自动配置。但是,它并不支持我使用的所有功能,特别是logValidationErrors

spring:
  datasource:
    driverClassName: oracle.jdbc.OracleDriver
    url: jdbc:jtds:sqlserver://111.11.11.11/DataBaseName
    username: someuser
    password: somepass
    testOnBorrow: true
    testWhileIdle: true
    validationQuery: select /* validationQuery */ 1 from dual
    minEvictableIdleTimeMillis: 1000    
    validationInterval: 30000

这些目前尚未使用:

    logValidationErrors: true
    maxAge: 1800000 # //30 Minute idle age
    removeAbondoned: true

我可以抓住创建的DataSource bean并手动设置这些值吗?或者有更好的方法来扩展或包装自动配置?

有关logValidationErrors等的更多信息,请参阅此处:https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html

3 个答案:

答案 0 :(得分:2)

我用BeanPostProcessor解决了这个问题,类似于Dave Syer的建议:

@Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    if (bean instanceof DataSource) {
        DataSource ds = (DataSource) bean;
        ds.setLogValidationErrors(true);
        ds.setRemoveAbandoned(true);
        ds.setMaxAge(1800000);
    }
    return bean;
}

我也可能会提交PR以将属性添加到Spring Boot本身。

答案 1 :(得分:1)

有多种方法可以解决此问题。

首先,您可能希望针对the spring boot project提交针对TomcatDataSourceConfiguration的提款请求。添加这些依赖项非常简单(请参阅validationInterval in the source code以获取示例。

或者,您可以按照自己的方式创建自己的数据源。如果存在DataSource bean,则boot不会尝试创建自己的bean。然后,您可以从TomcatDataSourceConfiguration延伸,并通过覆盖dataSource添加所需的任何属性。最后,您应该导入扩展类,以便注册bean,这将禁用它的自动配置。

如果您选择了最后一个选项并且对您有用,那么如果您认为这些属性对更广泛的受众感兴趣,则仍然值得report an issue

答案 2 :(得分:1)

如果我是你,我会@Autowire现有的DataSource,根据需要投降,然后设置额外的属性。对某些豆子来说这可能是危险的(如果他们从他们的属性初始化),但我怀疑这是否会成为问题。