一、需要对spring机制有所了解才能看懂
二、如果只是看这个template的实例化,其实还是比较容易的,大家都知道springboot是自动装载,那么就去springboot包autoconfigure包中一探究竟
template是操作数据库的那么肯定和jdbc有联系,所以看看有没有,还真有:
这就顺藤摸瓜吧,果然有个autoconfiguration,点进去看看
这里我们姑且不去分析这些注解条件的满足与否,假设满足,然后此类中代码,通过@Bean的方式就会把NameParameterJdbcTemplate实例化,并交给spring管理。
如果只是看到这里似乎觉得太简单了,那么此时我注意到一个点就this.dataSource对象,这个对象是怎么来的呢,没错就是通过构造当前类对象的时候,通过构造器来的,
这里可能很多人不理解,需要去看spring源码中的实例化,其中有一步骤会对参数进行getBean操作,从而拿到参数对象,达到注入的目的。
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管理,至此原理全部通了。
第一次自己分析不懂得源码,过程很曲折,随着知识积累,以后估计会好点,以此做个记录吧。