为啥 DataSource 不能在 Spring Boot 应用程序中自动装配?
Posted
技术标签:
【中文标题】为啥 DataSource 不能在 Spring Boot 应用程序中自动装配?【英文标题】:Why DataSource cannot be autowired in spring boot application?为什么 DataSource 不能在 Spring Boot 应用程序中自动装配? 【发布时间】:2016-01-09 09:10:39 【问题描述】:我知道如果在application.properties
中设置了相关配置,spring boot会自动创建一个dataSource
Bean,比如:
spring.datasource.url = jdbc:mysql://192.168.10.103:3306/hms?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
spring.datasource.username=root
spring.datasource.password=test@123
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
申请代码:
package com.synline.mdataserver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.apache.tomcat.jdbc.pool.DataSource;
@SpringBootApplication
public class Application implements CommandLineRunner
@Autowired
AnnotationConfigApplicationContext context;
/*@Autowired
DataSource dataSource;*/
public static void main(String[] args) throws InterruptedException
SpringApplication.run(Application.class, args);
@Override
public void run(String... args) throws Exception
DataSource dataSource = (DataSource)context.getBean("dataSource");
System.out.println(dataSource);
while (true)
Thread.sleep(5000);
如果@Autowired DataSource被注释掉,会打印Bean信息:
org.apache.tomcat.jdbc.pool.DataSource@1800a575ConnectionPool[defaultAutoCommit=null; defaultReadOnly=null; ....
所以我认为 Spring Boot 确实创建了 Bean。
但是如果使用@Autowried DataSource,则会出现异常抱怨No such Bean
Error creating bean with name 'application': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: org.apache.tomcat.jdbc.pool.DataSource com.synline.mdataserver.Application.dataSource; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.apache.tomcat.jdbc.pool.DataSource] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: @org.springframework.beans.factory.annotation.Autowired(required=true)
【问题讨论】:
请发布不起作用的完整案例,而不仅仅是sn-p。此外,您应该使用javax.sql.DataSource
而不是特定的 tomcat 类型。
谢谢。我重新编辑帖子并添加完整代码。
啊,Deinum,你明白了。在我“import javax.sql.DataSource”而不是“import org.apache.tomcat.jdbc.pool.DataSource;”之后,就没有问题了!
您能否再解释一下,如果我使用特定的 tomcat 类型,为什么 Autowired 会失败,但 getBean() 没问题?非常感谢!
【参考方案1】:
您的变量应声明为标准 JDBC 数据源(即javax.sql.DataSource
),而不是该接口的特定实现。
【讨论】:
是的,这是根本原因。谢谢!以上是关于为啥 DataSource 不能在 Spring Boot 应用程序中自动装配?的主要内容,如果未能解决你的问题,请参考以下文章
Spring中为啥@Transactional注解打在Controller层的方法上不起作用
在mybatis跟spring集成的时候,为啥还要导入spring-jdbc的包呢,这里面不是