Spring關於druid使用注入的深度理解

pdsu__Snail發表於2021-01-01
在eclipse使用Druid時,我們都是通過DruidDataSourceFactory的createDataSource(Properties p)方法建立 dataSource;
而在Spring依賴注入(DI) (如下邊) DataSource物件時,用的卻是DruidDataSource,而 
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="username" value="root"/> 很明顯是set注入,在DruidDataSource裡是沒有setUsername等方法的,而且
有的話又是如何實現呢?

測試

<!--Dbutils 通過構造器注入-->
<bean id="queryRunner" class="org.apache.commons.dbutils.QueryRunner">
    <constructor-arg name="ds" ref="dataSource"/>
</bean>
<!--DruidDataSource set注入-->
<!--
    去DruidDataSource找setUsername等   該類繼承了DruidAbstractDataSource,
    實際呼叫的是DruidAbstractDataSource裡邊的set方法,
    建立dataSource物件,
    這個過程具體如何實現?
    猜測: Spring反射機制,有了這些引數後,建立物件時會自動呼叫,包括factory的create,也是將Properties物件引數載入,建立是呼叫
    驗證: 正確
           對於DruidDataSourceFactory,呼叫createDataSource(Properties p),該方法呼叫createDataSource(Map properties)
           ,會用一個config方法配置屬性,在config方法拿到Properties的username等屬性後,呼叫DruidDataSource的setUsername方法,
           後面內容也就同上,在DruidDataSource類的setUsername方法為父類DruidAbstractDataSource的
-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
    <property name="username" value="root"/>
    <property name="password" value="root"/>
    <property name="url" value="jdbc:mysql://localhost:3306/dabenmanager"/>
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
</bean>

總結:我們不管是使用DruidDataSourceFactory的create…方法傳入Properties物件,還是DruidDataSource直接設定相關屬性,最後都會將獲取的值傳入
DruidAbstractDataSource裡。後邊建立流程相同,只是方法不同,那麼寫工具類時一般用工廠,Spring注入時考慮DruidDataSource直接設定屬性。
擴充套件:Spring 獲取DataSource時,也應該可以先獲取工廠物件,後通過普通工廠或工廠的靜態方法來獲取

相關文章