jpa mybatisspringboot中DataSource数据源实例产⽣时机及所需环境
今天学习springboot中数据源配置时想到⼀些问题:
仅配置mysql的username、password、url时,springboot会默认使⽤连接池管理数据连接源吗?
为了解惑,直接在当前项⽬下(已配置mysql、mybatis可以顺利访问数据库)写了个启动初始化类:
@Component
@Log4j2
public class InitRunner implements CommandLineRunner {
@Autowired
private DataSource dataSource;
@Override
public void args)throws Exception {
<("当前所⽤数据库连接池为:"+dataSource);
}
}
可以看到,默认不对数据源加任何配置情况下,springboot(2.x版本)默认会使⽤HikariDataSource。作为新⼿很⾼兴,没配置也⽤上了,暗⾃窃喜。可是上⾯的案例中,⼜产⽣了⼏个疑问:
疑问1:为什么DataSource可以⾃动装配
我的简单理解:springboot默认提供HikariDataSource数据连接池,这意味着项⽬启动时便会创建对应的bean实例,通过HikariDataSource实例化DataSource,所以可以直接注⼊。
疑问2:DataSource什么时候产⽣实例bean的
使⽤@Autowired来注⼊DataSource时,编译器可以检测到是否可以注⼊的。⼀个空⽩项⽬——新建springboot项⽬,只加⼊springboot-starter与web依赖是⽆法注⼊该实例的(编译不通过),为什么上例可以直接注⼊?
最开始想到的是与mybatis有关,⽐如我使⽤了@Mapper注解?,亦或是我使⽤了JPA的@Table注解,springboot扫描到相关注解时候产⽣?
⾃⼰进⾏了⼀些测试:
1. 把当前项⽬的@Mapper或@MapperScan或@Table等等与DAO层相关注解全匿了,发现还是能正常产⽣HikariDataSource实例;
2. 于是⼜把@Service相关注解也匿了,还正常输出;
3. 此时的我陷⼊了沉思…
4. 思路错了,既然是编译时检测,肯定与注解⽆关了,,,毕竟项⽬启动时才会解析注解
5. 重新建了个空sprinboot项⽬,先把InitRunner放进去,加⼊mysql的配置项,及mysql驱动jar包,发现InitRunner代码检测未通过
6. 然后引⼊mybatis依赖
7. 代码检测通过了…
当然这⾥只是编译通过,实际产⽣实例还是在运⾏时产⽣,⾄于为什么引⼊依赖就可编译通过嘛(我还没到对应源码),其实这有点像你不配置HikariDataSource就可以使⽤差不多的道理(),只要你引⼊了该依赖,springboot会默认给你加载该数据源,实际上spring是有@ConditionalOnClass(xxx.class)这种注解的,其作⽤在某个XXX类上,当xxx.class类存在时,XXX类才会实例化bean,所以引⼊了相应的jar包,也就能检测到所需类是存在的。
疑问3:为什么HikariDataSource (null)
到底HikariDataSource是否为null,测试⼀下:
@Override
public void args)throws Exception {
<("当前所⽤数据库连接池为:"+dataSource);
System.out.println(dataSource);
System.out.println("数据源是否为null:"+dataSource==null);
}
结果返回false,debug⼀下,发现有数值
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论