? ? MyBatis作為一種優(yōu)秀的持久層框架,在不少項目中都有使用。最近抽時間看了看MyBatis的源碼,今天在這里聊聊MyBatis的啟動解析過程,希望能對大家有所幫助。
?一、 demo及代碼。
? ? 1.MyBatis ?config 配置文件。?
? ? 2.sql映射Mapper配置文件。
? ? 3.User類以及user建表語句。
? ? 4.測試代碼如下:
? 二、MyBatis的啟動。
? ? 最關(guān)鍵的就是解析xml文件,生成configuration對象。SqlSessionFactoryBuilder對象的build(reader)方法將會觸發(fā)MyBatis的啟動,具體過程如下:
? ? 1.在build方法內(nèi)部將會創(chuàng)建一個XMLConfigBuilder類型的parser對象,之后將會調(diào)用parser的parse方法返回Configuration對象,再調(diào)用build方法生成DefaultSqlSessionFactory并返回。
? ? 2.XMLConfigBuilder構(gòu)造函數(shù)。函數(shù)會先創(chuàng)建XMLMapperEntityResolver對象,再創(chuàng)建XPathParser對象,最后調(diào)用重載構(gòu)造方法(見第5點)。
? ? 3.XMLMapperEntityResolver類。XMLMapperEntityResolver內(nèi)部定義了MyBatis的dtd。主要是“CONFIG”以及“MAPPER”。
? ? 4.XPathParser構(gòu)造函數(shù)。利用commonConstructor方法設(shè)置屬性,并利用createDocument方法把InputStream封裝成document對象。
? ? 5.XMLConfigBuilder構(gòu)造函數(shù)_2。在這個方法內(nèi)部,首先會創(chuàng)建一個Configuration對象,并調(diào)用父類BaseBuilder的構(gòu)造函數(shù),設(shè)置configuration、typeAliasRegistry、typeHandlerRegistry屬性。
? ? 6.Configuration類。Configuration內(nèi)部定義了一些重要的對象,其實MyBatis的啟動就是根據(jù)配置文件對Configuration屬性設(shè)置不同的值。重要的屬性如typeHandlerRegistry、typeAliasRegistry、mappedStatements、caches、parameterMaps等。在TypeHandlerRegistry與TypeAliasRegistry構(gòu)造函數(shù)內(nèi)部,注冊了許多常見的TypeHandler和TypeAlias。并且在Configuration的構(gòu)造函數(shù)也注冊了許多常見MyBatis的TypeAlias。
? ? 7.parse方法。XMLConfigBuilder對象創(chuàng)建好以后,就調(diào)用parse方法根據(jù)配置文件設(shè)置configuration對象。parse方法方法如下,關(guān)鍵是調(diào)用parseConfiguration方法。
? ? 8.parseConfiguration方法。parseConfiguration解析了configuration的配置文件,parseConfiguration方法和configuration配置文件相對應(yīng)。基本上,每個元素都是一個單獨的方法。
? ? 9.mapperElement方法。parseConfiguration方法里,這里重點分析MyBatis如何解析sql映射文件,即mapperElement方法。根據(jù)“package”、“resource”、“url”、“class”采取不同的解析策略。package和class用MapperAnnotationBuilder解析,resource與url利用XMLMapperBuilder解析。由于demo是配置的resource,所以在此分析XMLMapperBuilder。
? ? 10.XMLMapperBuilder構(gòu)造函數(shù)。其實XMLMapperBuilder與前面的XMLConfigBuilder非常相似。會先生成XMLMapperEntityResolver對象和XPathParser對象。在利用父類BaseBuilder的構(gòu)造函數(shù)設(shè)置configuration、typeAliasRegistry、typeHandlerRegistry屬性。
? ? 11.XMLMapperBuilder的parse方法。在parse方法內(nèi)部,關(guān)鍵是調(diào)用configurationElement方法解析mapper配置文件。
? ? 12.configurationElement方法。在方法內(nèi)部解析"cache","cache-ref","resultMap","parameterMap","sql","insert","update","delete","select"標(biāo)簽。
? ? 13.Statement的添加。configurationElement方法調(diào)用buildStatementFromContext方法。buildStatementFromContext調(diào)用XMLStatementBuilder.parseStatementNode()方法,在XMLStatementBuilder.parseStatementNode()方法內(nèi)部解析"insert"、"update"、"delete"、"select"標(biāo)簽的屬性(這里代碼有點長),后面通過builderAssistant.addMappedStatement()把statement添加到configuration。
? ? 至此,demo中xml對象的解析過程基本上就完了。后面把Configuration返回給build方法,創(chuàng)建并返回DefaultSqlSessionFactory對象。關(guān)于MyBatis如何是管理session的下次在介紹。