BasicDataSourceFactory實現了javax.naming.spi.ObjectFactory接口。
因此,先從ObjectFactory學習。
一、ObjectFactory接口
該接口需要實現方法:getObjectInstance(Object object,Name name,Context namCtx,HashTable<?,?> enviroment)
該方法線程安全,作用為使用本地或引用的特殊信息,創建一個對象。而此類對象的特殊性體現在於具體的環境
(代碼中的HashTable入參)。
參數解釋: Object:為所創對象提供相關的信息,可為空;
name:與參數namCtx相關的名字,可為空;
namCtx:與規定參數相關的上下文內容,可為空;
environment:被用來創造對象的環境,可為空。
二、BasicDataSourceFactory類
該類一共有3個比較主要的方法,分別為getOjectInstance、createDataSource以及getProperties三個方法。下面具體學習這三個方法。
1、public Object getOjectInstance(Ojbect object,Name name,Context namCtx,HashTable<?,?> enviroment)方法
該方法主要是實現ObjectFactory提供的抽象方法。其中Object入參必須是Reference類的一個實例,即必須為一個符合Java規范(命名)的Object,同時該參數也必須實現javax.sql.DataSource接口。
此外,該方法還將BasicDataFactory中的一些與數據源(即參數Object對象)相關的參數集合成一個Properties對象;具體的參數會在下文介紹。
獲取數據源中的參數及參數值的具體實現過程如下:
Reference(javax.naming.Reference)類有點類似與C語言的指針;當Object被強制轉換為一個Reference對象之后,會通過Reference的實例方法get(String propertyName)獲取指定的屬性值;而此處的屬性值,並不是真正的屬性值,而是屬性值的一個引用值,即一個RefAddr對象,該對象就相當於C語言的指針;如要通過‘指針’獲取‘指針指向的內容’時,只需調用RefAddr對象的getContent()方法即可。
如此就獲取到指定屬性的屬性值了。
最后調用createDataSource(Properties properties)方法創建數據源。
2、public static DataSource createDataSource(Properties properties)方法
該方法主要有三個步驟,第一步是new一個新的BasicDataSource對象,第二步根據properties入參,設置該BasicDataSource的一些相關參數;第三步則是將設置好參數的BasicDataSource返回。
3、getProperty(String propText)方法
將格式為key=value;...的字符串解析為Properties實例。在createDataSource方法之中,會調用此方法,將connectionProperties參數(String類型),轉化為Properties實例。
三、總結
BasicDataSourceDataFactory主要根據一個實現了DataSource接口的對象,獲取該對象的相關數據源配置參數(通過Reference對象,采用類似指針的方法),然后將new一個BaiscDataSource對象,結合獲取的參數,形成一個BasicDataSource對象,並將之返回。
————————————————
原文鏈接:https://blog.csdn.net/xiaogutou1/java/article/details/18465069