objectFactory
標籤給咱們配置的。在Configuration
中有以下代碼protected ObjectFactory objectFactory = new DefaultObjectFactory();
DefaultObjectFactory
public interface ObjectFactory { /** * 設置一些額外的屬性 經過在mybatis-config.xml中objectFactory中properties屬性標籤設置 , 在初始化mybatis是就會觸發這個方法 */ void setProperties(Properties properties); /** * 已默認的構造函數(無參構造)實例化對象 * @return */ <T> T create(Class<T> type); /** * 指定的構造函數實例化對象 * @param type Object type * @param constructorArgTypes Constructor argument types * @param constructorArgs Constructor argument values * @return */ <T> T create(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs); /** * 判斷是不是集合類型。只要能存儲其餘元素的都叫作集合 * 內部經過isAssignableFrom判斷是否繼承值Collection類 * @param type Object type * @return whether it is a collection or not * @since 3.1.0 */ <T> boolean isCollection(Class<T> type); }
instantiateClass
.private <T> T instantiateClass(Class<T> type, List<Class<?>> constructorArgTypes, List<Object> constructorArgs);
首先若是沒有構造參數和類型的話。經過constructor = type.getDeclaredConstructor();
獲取到構造器。而後經過次構造器進行實例化對象。這裏有可能會被私有化,mybatis作的補救措施是在報錯時候添加獲取私有的權限。微信
若是不爲空,則說明須要按照指定類型的參數的構造器去構造mybatis
constructor = type.getDeclaredConstructor(constructorArgTypes.toArray(new Class[constructorArgTypes.size()]));
上面這段代碼就是獲取指定類型的構造器。而後拿到構造器後再根據對應的參數進行實例化。函數
總結一句話就是代用符合的構造器進行實例化對象。spa