MyBatis로 구문 분석 소스 코드 분석 (제 II) ------ 매핑 파일 (1)

2.1 매핑 파일을 구문 분석 프로세스 분석

이번에는 <속성>을 구문 분석하는 parseConfiguration XMLConfigBuilder, <설정>, <typeAliases> 피어 노드에 의해 구문 분석의 MyBatis 설정 파일. <맵퍼> 노드로서 parseConfiguration이었다 그 분석 방법의 끝에있다. 파싱 ​​로직은 부 mapperElement 방법 캡슐화된다 :

. (1)  개인  무효 mapperElement (XNode의 부모) 가 발생 예외 {
 2      IF (부모 =! ) {
 3.          대한 (XNode 아이 : parent.getChildren ()) {
 네.              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                  // 자원이 비어 있지 않고, 다른 두 경로 지정된 적재 구조에서, 비어 
(16)를                  IF (자원! = null의 && URL ==  && mapperClass == ) {
 . 17                      ErrorContext.instance (). 자원 ( 리소스)
 (18)은                      = InputStream 인 inputStream을Resources.getResourceAsStream (자원)
 . 19                      XMLMapperBuilder mapperParser는 = 새로운 새로운 XMLMapperBuilder (inputStream을, 구성, 자원, configuration.getSqlFragments ());
 (20)는                      // 맵 파일 구문 분석 
(21)이다                      ; mapperParser.parse ()
 (22)는  
23                  // URL이 비어되지 않으며, 다른 두 구성 URL 로딩함으로써, 비어 
(24)                  } 다른  IF (자원 ==  && URL =!  && mapperClass == {)
 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 비어 있지 및 다른 두 비어 후 mapperClass 구성한 해상도 맵핑 
32                  } 밖의는  IF (자원 ==  && URL은 ==  && mapperClass =! ) {
 33은                      클래스 mapperInterface = <?> Resources.classForName (mapperClass)
 34 인                     configuration.addMapper (mapperInterface)
 (35)  
(36)                  // 위의 조건이 충족되지 않은 예외가 발생 
37                  } 다른 {
 38 인                      던져  새로운 새로운 ". a 요소 매퍼에 만에 대한 URL, 또는 자원 클래스, 그러나 마지막 내에 있지 더 지정할 수 있습니다"BuilderException ( )
 39                  }
 40              }
 41          }
 42      }
 43 }

위의 코드는 메인 로직의 자식 노드가 매퍼를 통과하고,로드 맵 파일을 의미 또는 노드의 값이 결정되는 속성에 따라 정보를 매핑하는 것을 기준으로한다. 자, 내가 언급 된 주석 내용의 구성을 넣어 映射信息캐리어 구성이 XML 호출로 映射文件. MyBatis로, 네 개의로드 맵 파일 또는 메시지 방식의 총에서. 첫 번째 맵 파일은 파일 시스템에서로드, 두 번째 방법은 로딩 및 URL 매핑 파일을 구문 분석하는 것입니다; 인터페이스 매퍼 매핑 정보를 제공하는 세 번째로드, 매핑 정보를 주석으로 배열 될 수있다,지도가 배치 될 수있다 파일. 마지막으로, 모든 주사 방식으로 패키지를 코팅하여 얻은 클래스, 해상도 매핑 정보를 사용하여 각 클래스에 대한 세 번째 모드가 있습니다.

자바 주석 거의 충분히 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 }

위와 같이, 매핑 로직은 세 가지 항목 파일을 구문 분석 작업 코어를 포함하는 다음과 같습니다 :

  1. 매퍼 노드를 구문 분석
  2. 네임 스페이스 매퍼 인터페이스 바인딩
  3. 프로세싱 노드 미완성 파싱

로직에 해당하는이 세 가지 작업은, 나는 다음 장에서 연속적으로 분석됩니다. 여기서, 제 대응하는 논리 연산을 수행.

2.2 구문 분석 맵 파일

각각의 구성 파일에서의 각 노드를 파싱하도록 구성된 로직은 대응하는 방식으로 밀봉되어, 통합 방법 XMLMapperBuilder있는 ConfigurationElement 클래스 호출이 방법. 다음과 같이 방법의 논리는 :

. 한  개인  무효 있는 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)가          //분석은 <캐시 심판> 노드 
(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      } 캐치 (예외 전자) {
 30          던져  새로운 BuilderException ( "오류가 매퍼 XML 구문 분석 XML 위치입니다. '"자원 + + : + "'원인." 전자, 전자);
31      }
 32 }

 

  

 

 

 

 

 

 

 

 

 

 

 

 

업데이트합니다. . .

 

추천

출처www.cnblogs.com/Emiyaa/p/11325239.html