我有一个简单的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的自动配置会自动将这些东西捆绑在一起。
提前感谢您提供的任何帮助。
答案 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实例。