• Springboot之NamedJdbcTemplate源码实例化过程


    一、需要对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管理,至此原理全部通了。

    第一次自己分析不懂得源码,过程很曲折,随着知识积累,以后估计会好点,以此做个记录吧。

      

  • 相关阅读:
    Java 多线程同步的五种方法
    MySQL中的内连接、左连接、右连接、全连接、交叉连接
    java中线程安全和非线程安全的集合
    hashCode和equal
    MySQL中char、varchar和nvarchar的区别
    MySQL存储引擎
    String在内存中如何存储(Java)
    String、StringBuffer、StringBuilder区别
    MySQL中的事务
    gbk、utf-8、utf8mb4区别
  • 原文地址:https://www.cnblogs.com/zxg-blog/p/14485295.html
Copyright © 2020-2023  润新知