分析java
MyBatis整合Spring的實現(3)中能夠知道,XMLConfigBuilder類讀取MyBatis的全局配置文件信息轉成Document,具體的把Document轉成JAVA類,作了哪些操做呢?下面就來分析XMLConfigBuilder的解析。app
MyBatis整合Spring的實現(1)中代碼實現的4.7,建立事務在後面文章會介紹。ide
1 入口
ui
public Configuration parse() { if (parsed) { throw new BuilderException("Each XMLConfigBuilder can only be used once."); } parsed = true; parseConfiguration(parser.evalNode("/configuration")); return configuration; }
上述代碼,若是文件已經被解析,也就是會拋出異常。這裏解析直接返回Configuration(全局配置類),由於Configuration(全局配置類)是成員變量,因此在方法parseConfiguration中進行設置值也是沒有問題的。下面就分析一下具體解析代碼。
url
2 方法parseConfigurationspa
private void parseConfiguration(XNode root) { try { propertiesElement(root.evalNode("properties")); //issue #117 read properties first typeAliasesElement(root.evalNode("typeAliases")); pluginElement(root.evalNode("plugins")); objectFactoryElement(root.evalNode("objectFactory")); objectWrapperFactoryElement(root.evalNode("objectWrapperFactory")); settingsElement(root.evalNode("settings")); environmentsElement(root.evalNode("environments")); // read it after objectFactory and objectWrapperFactory issue #631 databaseIdProviderElement(root.evalNode("databaseIdProvider")); typeHandlerElement(root.evalNode("typeHandlers")); mapperElement(root.evalNode("mappers")); } catch (Exception e) { throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e); } }
上述代碼太多了,看着頭暈,因此來進行分解,對propertiesElement(root.evalNode("properties"));進行分析(這裏的解析是對MyBatis的全局配置文件而不是Spring的配置文件)。上面的方法都是XMLConfigBuilder類的內部方法。.net
3 方法propertiesElementcode
private void propertiesElement(XNode context) throws Exception { if (context != null) { Properties defaults = context.getChildrenAsProperties(); String resource = context.getStringAttribute("resource"); String url = context.getStringAttribute("url"); if (resource != null && url != null) { throw new BuilderException("The properties element cannot specify both a URL and a resource based property file reference. Please specify one or the other."); } if (resource != null) { defaults.putAll(Resources.getResourceAsProperties(resource)); } else if (url != null) { defaults.putAll(Resources.getUrlAsProperties(url)); } Properties vars = configuration.getVariables(); if (vars != null) { defaults.putAll(vars); } parser.setVariables(defaults); configuration.setVariables(defaults); } }
做者沒有使用過properties,根據上面代碼,反推出下面配置信息。從全局配置文件中獲取有哪些配置信息,在讀取properties文件,resource與url只能設置一個,不然拋異常。最後把"全局配置類"原有的屬性和獲取的屬性合併。orm
4 MyBatis全局配置XML文件xml
<configuration> <properties resource="dbc.properties"> <property name="test" value="test"/> </properties> </configuration>
總結:
MyBatis的解析是最重要的一部分,目前只是對全局配置文件進行解析,後面還有對SQL進行解析,解析的步驟也很是的多,類的嵌套也很是多,可是思路必定要清晰。
Configuration(全局配置類)是最後解析全部配置所存在的最終信息。裏面的不一樣屬性,在MyBatis內部有不一樣的功能,這裏的parseConfiguration方法內部的方法,分解成每一個小方法去分析,這樣就不會看了後面而不知道,當前變量究竟是哪裏來的,變量是要作什麼的。