Springboot之NamedJdbcTemplate源码实例化过程
⼀、需要对spring机制有所了解才能看懂
⼆、如果只是看这个template的实例化,其实还是⽐较容易的,⼤家都知道springboot是⾃动装载,那么就去springboot包autoconfigure包中⼀探究竟
template是操作数据库的那么肯定和jdbc有联系,所以看看有没有,还真有:
这就顺藤摸⽠吧,果然有个autoconfiguration,点进去看看
这⾥我们姑且不去分析这些注解条件的满⾜与否,假设满⾜,然后此类中代码,通过@Bean的⽅式就会把NameParameterJdbcTemplate实例化,并交给spring管理。
如果只是看到这⾥似乎觉得太简单了,那么此时我注意到⼀个点就this.dataSource对象,这个对象是怎么来的呢,没错就是通过构造当前类对象的时候,通过构造器来的,
这⾥可能很多⼈不理解,需要去看spring源码中的实例化,其中有⼀步骤会对参数进⾏getBean操作,从⽽拿到参数对象,达到注⼊的⽬的。springboot原理pdf
public JdbcTemplateAutoConfiguration(DataSource dataSource) {
this.dataSource = dataSource;
}
那么这就算完了吗?仔细想,调⽤getBean的时候,是第⼀次实例化,还是从缓存中中取呢,我就为了这个⽬的,了两天的代码,也怪我对springboot不太熟悉,他么的。跟断点发现,缓存中已经存在了,那么说明在其他地⽅进⾏了实例化,在哪呢?肯定是通过某个@Autoconfiguration注解的⽅式加@Bean⽅式,所以按照这个思路就吧,
看到这个类,名字不禁⼼⾥⼤爽,就是它了,结果啪啪打脸,对这个类中⽅法巡视⼀圈没发现啥啊,然后对着import标签⼀顿死磕,死磕到最后,服了,没到。
算了,换个类吧,然后就发现这个类像是⼀个具体的类,名字也很符合我想要的那种⽓质,没错就是它
刚进⼊这个类,并没有直接对reateDataSource有感觉,不觉得它就是需要的那个⽅法,知道我看见⼀个@ConditionalOnProperty注解中使⽤了tomcat连接池熟悉,因为springboot1.5.x默认是使⽤tomcat连接池的,所以这个⽅法肯定是被使⽤了,然后就跟总内部代码,发现了此处调⽤了createDataSource⽅
法,原来这个对象是从这创建的,上⾯的⽅法有泛型,其实是对连接池的⼀个可扩展,除了tomcat连接池还有很多,⽐如dbcp。然⽽,这个创建的过程其实⼤概已经清晰了,但是,凡是就怕但是,这个类是个抽象类
并且没有任何注解,我的天呐,搞什么,没办法,只能最笨的办法,看看哪⾥使⽤了这个类,会不会有
什么⼦类集成啥的,就搜了⼀下
DataSourceConfiguration 这个名称然后有意思的事情发⽣了,这个类在之前那个DataSourceAutoConfiguration类中使⽤了,赶紧过去看看
这个很有灵性啊,直接调⽤的是静态类,不⽤刚才抽象类怎么样,根据import标签的作⽤就可以将⼀个类实例化,交给spring管理,⾄此原理全部通了。第⼀次⾃⼰分析不懂得源码,过程很曲折,随着知识积累,以后估计会好点,以此做个记录吧。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论