私たちのために何ができるかMyBatisのバネ
MyBatisのフレームワークは非常に良いされている、それは設定とSQL抄録を実行する一般的なプロセスです。あなたがインターフェイスでメソッドを実行するときに、最初にすべての私たちが正しいの構成を有し、かつ、モデル、界面層、SQL文があり、フレームワークの要件を満たし、かつBean定義インターフェースとSQL仲間を聞かせている限りMyBatisの、そして、フレームワークはMyBatisのでしょう結果を実行すると戻り、その後、あなたのためのSQL文を対応する実行可能ファイルを見つけます。
しかし、これは最大の問題は、多くのBean定義は、手書きの一つ一つでなければならない、そして名前とインターフェースとSQLの位置が正確に記入されることを保証することである、十分ではありません。最大の貢献は限りノートが適切に使用されるように、それは自動的にあなたのためのすべてのインターフェイスとSQL文をスキャンし、それらを関連付けるBean定義を確立させることができ、そのMyBatisのスプリング豆の走査機構です。春はまた、非常にクールである動的キャッシュBean定義を作成することができます。
また、Springフレームワーク、MyBatisの設定情報及び情報SqlSessionFactory等に組み込まれているので、また、スプリングビーンを管理するために使用することができます。春はそのレベルにそれらをキャッシュいくつかを行うことができます。
MyBatisのSQLの完全なプロセスを実行します
我々は、単一のメカニズムのMyBatisので振り返るロードの完全なプロセスとSQLの構成を実行します。
// コンフィグレーション生成、コンフィギュレーションファイルを解析 文字列リソース= "MyBatisの-config.xmlの" ; InputStream InputStreamは = Resources.getResourceAsStream(リソース); // 設定、ビルドSqlSessionFactoryによる = SqlSessionFactory SqlSessionFactory 新しい新SqlSessionFactoryBuilder()のビルド(InputStreamの); // 本当に使えるSQLSESSION取得 SQLSESSION SQLSESSION = sqlSessionFactory.openSessionを(); //はSQLSESSIONのインタフェースからエージェントを取得する ArticleMapper articleMapperProxy = sqlSession.getMapper(。ArticleMapper クラス); //は、プロキシクラスでメソッドを実行する 記事の記事= articleMapperProxy。 selectByPrimaryKey( "123" ); // 以下の操作は、物品のために省略されます
MyBatisのスプリングブートプロセス
のは、起動プロセスMyBatisのスプリングフレームを言ってみましょう。MyBatisの-春とsqlSessionFactory SQLSESSIONを引き継ぐ、とプロキシクラスsqlSessionProxyを作成することを決めたSQLSESSIONです。また、MyBatisのスプリング走査可能なインターフェースマッパ全ての層、すべてのプロキシクラスかけてマッパー。2行のそれを打破します。
1行目:sqlSessionFactory初期化とSQLSESSION
- sqlSessionFactoryBeanを作成し、それがSpring管理Beanの工場になることです
- 春の豆で管理されているの作成sqlSessionFactoryは、カテゴリMyBatisのに属し
- カテゴリMyBatisのスプリングに属し、sqlSessionFactoryするsqlSessionTemplateを作成します
- sqlSessionProxyを作成します
SqlSessionFactoryは非常に重要なファクトリクラスである、のが何であるかの情報SqlSessionFactory確認しましょう:
重要な情報#のsqlSessionFactory SqlSessionFactory 設定 が環境#のdataSource情報 mapperRegistryの 構成情報内部のコンフィグ# knownMappers#すべてのマッパーがある mappedStatementsは#すべてのメソッドのすべてマッパーがある resultMaps#すべてのxmlすべてこのresultMapあり sqlFragments#Insideは、すべてのセグメントは、SQLを持っています
この情報は重要であり、必要性が近い将来に内部情報を使用する際に、将来的に作成されたsqlSessionProxy mapperProxyを作成します。
MyBatisのスプリングフレーム、春が管理しsqlSessionFactoryでは、のは、sqlSessionFactoryを作成する方法を見てみましょう。
1 @Bean(名= "sqlSessionFactoryが" ) 2 公共 SqlSessionFactory sqlSessionFactory(データソースデータソース)がスロー例外{ 3 SqlSessionFactoryBean工場=を新しいSqlSessionFactoryBean()。 4 factory.setDataSource(データソース)。 5 あれば(StringUtils.hasText(この.properties.getConfig())){ 6 factory.setConfigLocation(この .resourceLoader.getResource(この.properties.getConfig()))。 7 } 他{ 8 であれば(この!.interceptors = NULL && この .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 プライベートデータソースのdataSource。 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 }
私たちは、Beanの初期化がここに着手していない、特定のメソッドの数を実装したときに、このクラスはFactoryBeanの、InitializingBeanとApplicationListenerインタフェース、対応するインタフェースを実装していることがわかります。今、何が重要であることはメソッドの実装で見て、これらの方法で、何が行われていました。
// FactoryBeanの中的方法 公衆 SqlSessionFactory GetObjectが()スロー{例外の 場合(この .sqlSessionFactory == NULL ){ この.afterPropertiesSet()。 } 戻り 、この.sqlSessionFactoryと、 }
コードを観察することにより、getObjectメソッドを構築sqlSessionFactory sqlSessionFactory空afterPropertiesSetはbuildSqlSessionFactoryを実行する場合、configuationを構築し、sqlSessionFactoryを構築する構成ファイルを解析するMyBatisの、最終sqlSessionFactoryを返します。onApplicationEventの後ろに主にモニターアプリケーション・イベント何かのために(続行するのではなく、興味のある学生は、次を理解するために行くことができます)。
我々は見てafterPropertiesSetメソッドはプロパティが行くように設定されている方法です取ります:
// InitializingBean中的方法 公共 のボイド afterPropertiesSet()スロー例外{ Assert.notNull(この .dataSource、 "プロパティ'データソース'が必要です" ); Assert.notNull(この .sqlSessionFactoryBuilder、 "プロパティ'sqlSessionFactoryBuilder'が必要です" ); Assert.state(この .configuration == nullを && この .configLocation == nullの || この .configuration == nullの || この .configLocation == nullを、「プロパティ『設定』と『configLocation』が一緒に指定することはできません」); //はおなじみのビルド方法を参照 この .sqlSessionFactoryを= この.buildSqlSessionFactory(); }
mainメソッドのbuildSqlSessionFactoryは次のとおりです。this.sqlSessionFactoryBuilder.build(コンフィギュレーション);ここに着手していません。この時点まで、sqlSessionFactoryはのはsqlSessionTemplateを作成するプロセスを簡単に見てみましょう、作成されています:
@Bean @ConditionalOnMissingBean 公共SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory){ 戻り 新しい(sqlSessionFactory、SqlSessionTemplateをこの.properties.getExecutorType())。 }
トラックへの場合は、新しいSqlSessionTemplateを同じ時間を見つけるだろう、それはここでは展開されませ、sqlSessionProxyを作成します。
ライン2:マッパーのスキャンとプロキシクラスを作成します。
インタフェースは、最初の呼び出しを待って、プロキシクラスを生成するためにスキャンして、一つずつする必要があります。私たちはこのプロセスを見てみましょう:
- 使用MapperScannerConfigurer
- スキャン()スキャンマッパー
- setBeanClass
- 取得MapperFactoryBean
- MapperFactoryBean.getObject()メソッド
- configuration.getMapper
- getMapper
- フォルダのレジストリ
- knownMappers
- 最終的にセットMapperProxyで、その結果、彼らは、元Mapperプロキシです。MapperProxyは、実際の呼び出し実行メソッドを呼び出すのInvocationHandlerインタフェースを実現しました。
注:点4の場合、MapperFactoryBean
豆植物が、ばね容器に、植物は、豆、豆植物自体、それが注入されていない場合、スプリングは、他に注入される特別な目的の豆、豆植物であり、それは豆のgetObject呼び出し方法。
MyBatisのスプリング呼び出し元プロセス
sqlSessionFactoryは、初期化が完了した後、マッパーのスキャンおよびプロキシクラスのポストは、これら二つの前提条件で、我々はMyBatisのスプリングのストロークの最終ストローク以来プロシージャを呼び出すことができ、作成されます。
-
その後、呼び出すビジネスコードは、データベース、マッパーの方法を照会する必要があります
- 起動MapperProxy
- 2.1判決の場合
- 2.2他の判断であれば
- 2.3メソッドを集中cachedMapperMethod
- 2.4 mapperMethod.executeフォーカス方式、実行の実際の方法
- SQL文、処理ポイントの種類に応じて、
- ケースのINSERT
- ケースUPDATE
- 場合は、DELETE
- ケースSELECT
- ケースFLUSH
-
状況にSELECTの例では、sqlSession.selectListを実行します。取り出されたこの時点であるプロキシクラスのマッパー
-
sqlSessionTemplate.sqlSessionProxy.selectList
- SqlSessionInterceptor呼び出します
- 6.1 getSqlSessionは、使用していますSqlSessionFactoryは、sqlSessionHolder技術を使用して、新しいものを作成しないで取りました。いずれにせよ、SQLSESSIONがあるでしょう
- > queryFromDatabase - - > doQuery - クエリ続い6.2 defaultSqlSession.selectListフォーカス、> 1のprepareStatement 2.実行
- 6.3 closeSqlSession
私たちは、この方法が唯一のインターフェースで行うことが呼び出されたときに、MyBatisのスプリングフレーム、リアルSQLSESSIONの作成に記載されています。プロセスは、上記でより詳細に参照することができます。
参考資料
- https://segmentfault.com/a/1190000015165470
初出:2019年6月8日21:00