MyBatis로 스프링 시동 프로세스 및 프로 시저 호출

우리를 위해 무엇을 할 수 MyBatis로 스프링

MyBatis로 워크가 매우 좋았다, 그것을 구성하고 SQL 초록을 실행하는 일반적인 방법이다. 당신이 인터페이스의 메서드를 실행할 때보다도 우리가 올바른 구성을 한 다음 모델, 인터페이스 층, SQL 문을있다, 프레임 워크의 요구 사항을 충족하고, 빈 정의 인터페이스 및 SQL 동료를 할만큼 MyBatis로, 다음, 프레임 워크는 MyBatis로합니다 당신을 위해 실행 해당 SQL 문을 발견 한 후 그 결과를 실행하고 반환합니다.

그러나 가장 큰 문제는 많은 빈 정의는, 손으로 쓴 하나 하나이어야하며, 이름과 인터페이스와 SQL의 위치를 ​​정확하게 작성 될 수 있도록한다는 것입니다, 충분하지 않습니다. 가장 큰 기여는 그 MyBatis로 스프링 빈 스캐닝 메커니즘에있다 음이 적절하게 사용 한, 그것은 자동으로 모든 인터페이스와 SQL 문을 검색 할 수 있습니다, 그들을 동료 bean 정의를 설정할 수 있습니다. 봄도 매우 멋지다 동적 캐시 Bean 정의를 만들 수 있습니다.

또한, 스프링 프레임 워크에 통합하기 때문에, 구성 정보 및 정보 SqlSessionFactory는 등을 MyBatis로도 봄 콩을 관리 할 수 ​​있습니다. 봄의 수준을 캐싱 몇 가지 작업을 수행 할 수 있습니다.

MyBatis로 SQL의 전체 프로세스를 수행

우리는 하나의 메커니즘 MyBatis로, 부하의 전체 과정과 SQL의 구성을 실행 되돌아 본다.

// 구성 생성, 구성 파일을 구문 분석 
문자열 자원 = "MyBatis로 - 더 config.xml에" , 
해, InputStream inputStream을 = Resources.getResourceAsStream (자원); 

// 구성하는 빌드 SqlSessionFactory는에 따르면 
= A SqlSessionFactory는 SqlSessionFactory는 새로운 새로운 SqlSessionFactoryBuilder를 () 구축 (inputStream을);   

//이 SQLSESSION 진정으로 사용할 수 
SQLSESSION SQLSESSION = sqlSessionFactory.openSession (); 

//은 SQLSESSION의 인터페이스에서 에이전트를 가져옵니다 
. (ArticleMapper ArticleMapper articleMapperProxy = sqlSession.getMapper 클래스 ); 

//는 프록시 클래스의 방법을 수행 
= 제 기사 articleMapperProxy을. selectByPrimaryKey ( "123" ); 

// 다음 작업은 기사를 생략한다

 

MyBatis로 스프링 부팅 프로세스

의 시작 프로세스 MyBatis로 스프링 프레임을 가정 해 봅시다. MyBatis로-봄 SqlSessionFactory는 SQLSESSION를 인수하고, 프록시 클래스 sqlSessionProxy을 만들기로 결정이 SQLSESSION입니다. 또한, 스프링의 MyBatis 스캔 가능한 인터페이스 맵퍼 모든 계층의 모든 프록시 클래스 위에 다음 맵퍼. 2 라인의 휴식 내려.

행 1 : SqlSessionFactory는 초기화 및 SQLSESSION

  1. sqlSessionFactoryBean 만들기, 그것은 Spring 관리 빈 공장이 될 것입니다
  2. 스프링 빈에 의해 관리됩니다 만들기 SqlSessionFactory는은, 카테고리의 MyBatis에 속하는
  3. SqlSessionFactory는 할 sqlSessionTemplate를, 만들기, 카테고리 MyBatis로 스프링에 속하는
  4. sqlSessionProxy 만들기

SqlSessionFactory는 매우 중요한 팩토리 클래스이며, 이제 SqlSessionFactory는이 정보가 무엇인지 살펴 보자 :

중요 정보 #의 SqlSessionFactory는 

SqlSessionFactory는이 
    구성 
        환경 #이는 dataSource 정보 
        mapperRegistry의 
            구성 정보의 내부 구성 # 
            knownMappers 번호 모든 매퍼가있는 
        모든 메소드의 모든 매퍼 mappedStatements 번호가 
        resultMaps # 모든 XML 모든적인 resultMap 있습니다 
        sqlFragments # 내부를 모든 세그먼트는 SQL을

이 정보는 중요하고, 필요가 가까운 미래에 내부 정보를 사용하는 경우 sqlSessionProxy mapperProxy은 미래에서 만든 만듭니다.

MyBatis로 스프링 프레임, Spring에 의해 관리 SqlSessionFactory는에서의이 SqlSessionFactory는을 만드는 방법을 살펴 보자.

1 @Bean (NAME = "SqlSessionFactory는이" )
 2  공개 SqlSessionFactory는 SqlSessionFactory는 (데이터 소스 데이터 소스)이 발생 예외 {
 3      SqlSessionFactoryBean = 공장을 새로운 SqlSessionFactoryBean ();
4      factory.setDataSource (는 dataSource);
도 5      의 경우 (StringUtils.hasText ( .properties.getConfig ())) {
 6          factory.setConfigLocation (  .resourceLoader.getResource ( .properties.getConfig ()));
7      } 다른 {
 8          경우 ( ! = .interceptors  &&  .interceptors.length> 0 ) {
 9              factory.setPlugins ( .interceptors);
10          }
 11          factory.setTypeAliasesPackage ( .properties.getTypeAliasesPackage ());
12          factory.setTypeHandlersPackage ( .properties.getTypeHandlersPackage ());
13          factory.setMapperLocations ( .properties.getMapperLocations ());
14      }
 15      리턴 factory.getObject ();
16 }

참고 : SqlSessionFactoryBean 역할은 구성 MyBatis로 (소스 데이터, 별명 등)을 분석하는 것입니다, 다음 GetObject 메서드에 의해 SqlSessionFactory는 인스턴스를 반환하는 식물 콩입니다. 우리는 초기화 중에 무슨 일 SqlSessionFactoryBean 봐.

우리가 SqlSessionFactoryBean 소스를 살펴 보자 :

1 개  공용  클래스 SqlSessionFactoryBean은 구현 의 FactoryBean <SqlSessionFactory는> InitializingBean 표시, 만약 ApplicationListener <가 ApplicationEvent> {
 2      개인  정적  최종 로그인 LOGGER = LogFactory.getLog (SqlSessionFactoryBean. 클래스 );
3      개인 리소스 configLocation;
4      개인 설정 구성;
5      개인 리소스 [] mapperLocations;
6      개인 데이터 소스 데이터 소스;
7      개인 TransactionFactory transactionFactory;
8      개인등록 configurationProperties;
9      개인 SqlSessionFactoryBuilder를 SqlSessionFactoryBuilder를 = 새로운 SqlSessionFactoryBuilder를 ();
10      개인 SqlSessionFactory는 SqlSessionFactory는;
(11)      개인 문자열 환경 = SqlSessionFactoryBean. 클래스 .getSimpleName ();
12      전용  부울 FAILFAST;
13      개인 인터셉터 [] 플러그;
14      개인 <?> TypeHandler [] typeHandlers;
15      개인 문자열 typeHandlersPackage;
16      개인 <?> 클래스 [] typeAliases;
(17)     개인 문자열 typeAliasesPackage;
18 개      개인 클래스 <?> typeAliasesSuperType;
19      개인 DatabaseIdProvider databaseIdProvider;
20 개      개인 클래스 <? 연장 VFS> VFS 단계;
21      개인 캐시 캐시;
22      개인 ObjectFactory를 ObjectFactory를;
23      개인 ObjectWrapperFactory objectWrapperFactory;
24  
25      공중 SqlSessionFactoryBean () {
 26      }
 27      ...
 28 }

우리는이 클래스의 FactoryBean, InitializingBean 표시하고 만약 ApplicationListener 인터페이스, 콩 초기화가 특정 메소드를 구현하고 해당 인터페이스를 구현하는 것을 볼 수 있습니다, 여기에 수행 할 수 없습니다. 이제 중요한 것은 방법의 구현 보면, 이러한 방법과 무엇을 완료했다.

// 의 FactoryBean中的方法
공개 SqlSessionFactory는으로 getObject ()는 슬로우 {예외
     경우 (  .sqlSessionFactory == ) {
         .afterPropertiesSet (); 
    } 

    반환  .sqlSessionFactory을; 
}

코드를 관찰함으로써, GetObject 메서드는 구성 SqlSessionFactory는 SqlSessionFactory는 빈 afterPropertiesSet가 buildSqlSessionFactory을 실행하는 경우, 접속과 운전을 구축, SqlSessionFactory는을 구축 할 것입니다 구성 파일을 구문 분석 MyBatis로, 최종 SqlSessionFactory는를 반환합니다. onApplicationEvent 뒤에 주로 모니터 응용 프로그램 이벤트 때 할 수있는 뭔가를 위해 (진행하지, 관심있는 학생들은 다음을 이해 갈 수 있습니다).

우리는 보이는 afterPropertiesSet 방법은 속성이 이동하도록 설정하는 방법입니다 걸릴 :

// InitializingBean 표시中的方法
공공  무효 afterPropertiesSet () 던져 예외 { 
    Assert.notNull (  .dataSource를, "재산권 '은 dataSource가'필요" ); 
    Assert.notNull (  .sqlSessionFactoryBuilder은 "속성 'SqlSessionFactoryBuilder를이'필요" ); 
    Assert.state (  .configuration == 널 (null) &&  .configLocation == null의 ||  .configuration == null의 ||  .configLocation == 널 (null)"속성 '구성'과 'configLocation은'함께 지정 할 수 없습니다" ); 
    
    //이 익숙한 빌드 방법을 참조 
    다음은이 .sqlSessionFactory을 = 다음은이 .buildSqlSessionFactory (); 
}

주요 방법 buildSqlSessionFactory은 다음과 같습니다 this.sqlSessionFactoryBuilder.build (구성) 여기에 수행 할 수 없습니다. 이 시점에, SqlSessionFactory는이 생성 된 최대,의는 sqlSessionTemplate을 만드는 과정을 간단히 살펴 보자 :

@Bean 
@ConditionalOnMissingBean 
공공 SqlSessionTemplate sqlSessionTemplate (SqlSessionFactory는 SqlSessionFactory는가) {
     반환   (SqlSessionFactory는, SqlSessionTemplate을 .properties.getExecutorType ()); 
}

로 트랙, 당신은 새로운 SqlSessionTemplate에게 같은 시간을 찾을 경우, 그것은 sqlSessionProxy를 만들고, 여기에 확장하지.

 

매퍼 스캔 및 프록시 클래스를 만듭니다 라인 (2)

인터페이스는 첫째, 프록시 클래스를 생성 호출을 기다리는 하나 다음 하나의 스캔되어야합니다. 우리가이 과정을 살펴 보자 :

  1. 사용 MapperScannerConfigurer
  2. 주사 () 검사 맵퍼
  3. setBeanClass
  4. 가져 오기 MapperFactoryBean
  5. MapperFactoryBean.getObject () 메소드
  6. configuration.getMapper
  7. getMapper
  8. 폴더 레지스트리
  9. knownMappers
  10. 궁극적으로 세트 MapperProxy의 결과로, 그들은 원래 매퍼 프록시입니다. MapperProxy 때, 실제 통화 실행, 메소드 호출의 InvocationHandler 인터페이스를 실현할.

참고 : 점 4의 경우, MapperFactoryBean 빈 공장, 봄의 용기에, 공장은 콩, 콩 식물 자체가 주입되지 않을 때 스프링이 다른 주입하는 특수 목적 콩, 콩 식물은, 그것은 빈으로 getObject 호출 방법.

 

MyBatis로 스프링 호출 프로세스

SqlSessionFactory는이 초기화가 완료된 후, 매퍼 검사 및 프록시 클래스 포스트는이 두 가지 전제 조건, 우리는 MyBatis로 스프링의 스트로크의 마지막 스트로크 이후 프로 시저를 호출 할 수 있습니다 생성됩니다.

  1. 다음 진료 비즈니스 코드, 데이터베이스, 매퍼하는 방법을 쿼리해야

  2. 호출 MapperProxy
    • 만약 2.1 판단
    • 2.2 다른 판단되는 경우
    • 2.3 방법에 초점을 cachedMapperMethod
    • 2.4 mapperMethod.execute 포커스 방법의 실제 실행에있어서
  3. SQL 문을 처리 포인트의 유형에 따라
    • 경우 INSERT
    • 경우 UPDATE
    • 경우 삭제
    • 경우 SELECT
    • 사례 FLUSH
  4. 상황에 SELECT 예는, sqlSession.selectList을 수행합니다. 반출이 때입니다 프록시 클래스의 매퍼

  5. sqlSessionTemplate.sqlSessionProxy.selectList

  6. SqlSessionInterceptor 호출
    • 6.1 getSqlSession는 사용 SqlSessionFactory는이 , sqlSessionHolder 기술을 사용하여, 새로 생성하지 않는했다. 어떤 경우, SQLSESSION있을 것
    • > queryFromDatabase - -> doQuery - 질의이어서 6.2 defaultSqlSession.selectList 포커스> 1. 2.의 prepareStatement 수행
    • 6.3 closeSqlSession

우리는 방법은 인터페이스 만 수행 할 수 호출 MyBatis로 스프링 프레임, 실제 SQLSESSION 작성,에서 찾을 수 있습니다. 프로세스는 더 이상 설명을 참조 할 수 있습니다.

 

참고 자료

  • https://segmentfault.com/a/1190000015165470

 

만든 사람 : 2019년 6월 8일 21시

 

추천

출처www.cnblogs.com/gkmeteor/p/11791509.html