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 }
위와 같이, 매핑 로직은 세 가지 항목 파일을 구문 분석 작업 코어를 포함하는 다음과 같습니다 :
- 매퍼 노드를 구문 분석
- 네임 스페이스 매퍼 인터페이스 바인딩
- 프로세싱 노드 미완성 파싱
로직에 해당하는이 세 가지 작업은, 나는 다음 장에서 연속적으로 분석됩니다. 여기서, 제 대응하는 논리 연산을 수행.
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 }
업데이트합니다. . .