SpringBoot数据源自动配置不起作用

时间:2016-07-27 21:54:23

标签: spring-boot datasource

我有一个简单的SpringBoot应用程序,我想使用AutoConfiguration配置Tomcat jdbc池数据源。

我正在使用这些Spring依赖项:

// Spring Boot
compile 'org.springframework.boot:spring-boot-starter-web:1.3.5.RELEASE'
compile 'org.springframework.boot:spring-boot-starter-jdbc:1.3.5.RELEASE'

以下是我的application.yml文件中的数据源属性:

spring:
    datasource:
        url: jdbc:mysql://my.host/mydb
        username: user
        password: pwd
        driver-class-name: com.mysql.jdbc.Driver
        initialSize: 5

我确定正在加载属性,因为应用程序正在获取其他值。

我在配置文件中将bean定义为:

@Bean(name="myDataSource")
@ConfigurationProperties(prefix="spring.datasource")
public DataSource getDataSource() {
    DataSource dataSource = DataSourceBuilder.create().build()
    return dataSource
}

我将数据源注入我的DAO中:

@Slf4j
@Repository
class MyDAO {

    @Autowired
    DataSource dataSource

    public void getFoo() {
        log.info("DB URL: ${dataSource.getUrl()}")
    }
}

如果我在getDataSource()方法中设置断点,DataSourceBuilder将创建一个DataSource实例。但是,该对象的所有属性(如URL,用户和密码)都是null。此外,当我调用getFoo()时,dataSource变量为null。我已经尝试在AppConfig中注释掉bean定义。 dataSource仍然为null。有什么建议吗?

我查看了Spring Boot文档和Spring书,但我没有看到这样的例子。我看到自己创建DataSource的示例。但是我希望Spring的自动配置会自动将这些东西捆绑在一起。

提前感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:2)

通过创建自己的bean,您实际上是关闭了Boot DataSource的自动配置。您可以删除getDataSource方法,然后让Boot自动配置一个。

答案 1 :(得分:2)

根据Andy的评论我发现我有两个问题。首先,我需要将JPA依赖项包含在项目中。我将此行添加到build.gradle文件中:

compile 'org.springframework.boot:spring-boot-starter-data-jpa:1.3.5.RELEASE'

其次,我使用new()创建了MyDAO的实例。我通过创建一个使用@Autowired注入MyDAO实例的服务类来解决这个问题。一旦DAO成为Spring托管bean,它就能够从Tomcat连接池注入DataSource实例。