2.1マッピングファイルの解析プロセス分析
次に、<プロパティ>、<設定>、<typeAliases>ピア・ノードを解析parseConfiguration XMLConfigBuilder、によって解析MyBatisの設定ファイル。<マッパー>ノードとして、parseConfigurationは、その分析方法の終わりにしています。解析ロジックは、部分mapperElementメソッドにカプセル化されます。
。1 プライベート ボイド mapperElement(XNode親)がスロー例外{ 2を IF(!親= ヌル){ 。3 用(XNode子供:parent.getChildren()){ 。4 IF( "パッケージ" .equals(child.getName())){ 5 // <パッケージ> name属性ノードを取得し 6 列mapperPackage = child.getStringAttribute(「名前」); 7 // マッピング構成に従って解析するためのインターフェイスマッパーとマッパーインタフェースから指定されたパケットを検索 8。 configuration.addMappers(mapperPackage) ; 9 } 他{ 10 // リソース/ URL /クラス属性を取得します 11。 文字列リソースchild.getStringAttribute =( "リソース" ); 12は、ある 文字列= child.getStringAttribute URL( "URL" ); 13は、ある 文字列mapperClass = child.getStringAttribute( "クラス" ); 14 15 // リソースが空でない、他の2つが空である、装填構成指定されたパスから 16 IF(リソース!= NULL && URL == NULL && mapperClass == NULL ){ 17 ErrorContext.instance()リソース(リソース); 18である InputStream InputStreamは=Resources.getResourceAsStream(リソース); 19 XMLMapperBuilder mapperParser = 新新XMLMapperBuilder(InputStreamの、設定、リソース、configuration.getSqlFragments()); 20はある // パースマップファイル 21れ mapperParser.parse(); 22は 23です // URLは空ではなく、他の2つの構成のURLロードすることにより、空である 24 } 他 IF(リソース== NULL && URL =!ヌル && mapperClass == NULL ){ 25 ;. ErrorContext.instance()リソース(URL) 26である InputStream InputStreamは=Resources.getUrlAsStream(URL); 27 XMLMapperBuilder mapperParser = 新新XMLMapperBuilder(InputStreamの、設定、URL、configuration.getSqlFragments()); 28 // 解像度マッピングファイル 29 mapperParser.parse(); 30 31はある // mapperClass空ではない、と他の2つはmapperClassによって構成される空、次いで解像度マッピングで 32 } 他 IF(リソース== NULL && URL == NULL!&& mapperClass = NULL ){ 33である クラスmapperInterface = <?> Resources.classForName(mapperClass); 34れます configuration.addMapper(mapperInterface); 35 36 // 上記の条件が満たされていない、例外がスローされた 37 [ } 他{ 38は スロー 新しい新 BuilderException(「A要素マッパーでは、最後の一つの中にほかのURL、またはリソースクラスを指定し、ないかもしれませんが。」); 39 } 40 } 41 } 42 } 43 }
上記のコードは、メインロジックの子ノードは、マッパーを横断し、ノードの属性値に応じて負荷マップファイルまたはマップ情報を意味するものによって決定されています。ここでは、私が呼ば注釈コンテンツに設定を入れ映射信息
キャリア設定はXMLと呼ばれるように映射文件
。MyBatisのでは、4つのロードマップファイルやメッセージの仕方の合計。最初のマップファイルはファイルシステムからロードされ、第二の方法は、ローディングによるもので、URLマッピングファイルを解析し、インターフェイスマッパーマッピング情報によって第三のローディング、マッピング情報は、注釈に配置されてもよい、マップに配置されてもよいですファイル。最後に、全ての走査方法でパッケージをコーティングすることにより得られるクラス、及び解像度マッピング情報を用いて、各クラスの第三のモードがあります。
Javaアノテーションは、コメントの仕方やMyBatisののほぼ十分ではないことで、表現力と柔軟性を制限しました。だから、より複雑な設定情報の一部について、我々はXMLの方法を使用して設定する必要があります。
次の部分は、解析処理XMLマッピングファイル、最初のエントリを解析する以下の分析マッピングファイルに基づいて、分析の焦点であります:
1 公共 ボイド解析(){ 2 // マッピングファイルが解析されているかどうかを検出する 3。 IF(!{Configuration.isResourceLoaded(リソース)) 4。 // 解析マッパノード 5。 のConfigurationElement(parser.evalNode( "/マッパー" )); 6 // 「解像度リソースセットにリソースルートを追加 。7 ; configuration.addLoadedResource(リソース) 。8つの // バインドマッパーインターフェイス名前空間 9。 bindMapperForNamespace(); 10 } 11 12である // 未完成処理ノード分析 13 parsePendingResultMaps(); 14 parsePendingCacheRefs(); 15 parsePendingStatements()。 16 }
上記のように、マッピング・ロジックは、3つのエントリファイル解析演算コアを含み、以下の通りです。
- マッパーノードの解析
- 名前空間バインディングマッパーインタフェースにより、
- 処理ノード未完成の解析
ロジックに対応するこれらの3つの操作は、私は、以降の章で連続的に分析されます。ここでは、最初に対応する論理演算を取ります。
2.2パースマップファイル
各コンフィギュレーション・ファイル内の各ノードを解析するように構成されたロジックは、対応する方法でカプセル化され、統一された方法XMLMapperBuilderのConfigurationElementクラスによって呼び出され、これらの方法。以下の方法のロジックがあります。
1つの プライベート ボイドのConfigurationElement(XNodeコンテキスト){ 2 のtry { 3。 // 名前空間マッパーを取得 4。 文字列の名前空間= context.getStringAttribute( "名前空間" ) 。5 IF(名前空間== NULL || namespace.equals( "" )){ 6 スロー 新しい新 BuilderException( "マッパーAPOS名前空間空にすることはできません" ); 7 } 8を 9 // builderAssistantに、名前空間設定 10 builderAssistant.setCurrentNamespace(名前空間) 。11 12である //分析<キャッシュ-ref>をノード 13である cacheRefElement(context.evalNode( "キャッシュ-REF" )); 14 15 // 分析<キャッシュ>ノード 16 cacheElement(context.evalNode( "キャッシュ" )); 17 18がある // 廃止設定は、ここで分析されない 19。 parameterMapElement(context.evalNodes( "/マッパー/なparameterMap" )); 20は 21である // 分析<このresultMap>ノード 22である resultMapElements(context.evalNodes( "/マッパー/このresultMap" )); 23である 24 / / 分析<SQL>ノード 25 sqlElement(context.evalNodes( "/マッパー/ SQL" ))。 26 27 // 解析<選択>、...、<削除>等节点 28 buildStatementFromContext(context.evalNodesは( "を選択|挿入|更新|削除" )); 29 } キャッチ(例外e){ 30 投 新しい BuilderException( "エラーマッパーXMLを解析するXML位置がある。 '"資源+ +:+ "'原因" E、E)。 31 } 32 }
更新します。。。