MyBatisの解析ソースコード解析(第II)------マッピング・ファイル(1)

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つのエントリファイル解析演算コアを含み、以下の通りです。

  1. マッパーノードの解析
  2. 名前空間バインディングマッパーインタフェースにより、
  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 }

 

  

 

 

 

 

 

 

 

 

 

 

 

 

更新します。

 

おすすめ

転載: www.cnblogs.com/Emiyaa/p/11325239.html