Why can't DataSource be auto-updated in spring boot application?

I know that spring boot will automatically create a dataSource Bean if the appropriate settings are set in application.properties , for example:

 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 

Application Code:

 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); } } } 

If the @Autowired DataSource comment is commented out, Bean information will be printed:

 org.apache.tomcat.jdbc.pool.DataSource@1800a575 {ConnectionPool[defaultAutoCommit=null; defaultReadOnly=null; ....} 

So, I think spring Boot really created a Bean.

But if @Autowried DataSource is used, an exception is thrown to complain about 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)} 
+5
source share
1 answer

Your variable should be declared as a standard JDBC DataSource (i.e. javax.sql.DataSource ), and not as a specific implementation of this interface.

+4
source

Source: https://habr.com/ru/post/1233491/


All Articles