十、春/春MVC
90.なぜばねを使用するのですか?
1.はじめに
-
目的:エンタープライズアプリケーション開発の複雑さを解決する
-
機能:EJBの代わりに基本的なJavaBeanを使用し、より多くのエンタープライズアプリケーション機能を提供する
-
スコープ:すべてのJavaアプリケーション
要するに、Springは軽量コンテナー反転(IoC)およびアスペクト指向(AOP)コンテナーフレームワークです。
2.軽量
スプリングは、サイズとオーバーヘッドの両方の点で軽量です。完全なSpringフレームワークは、1MBを超えるサイズのJARファイルで公開できます。また、Springに必要な処理オーバーヘッドはごくわずかです。さらに、Springは非侵入型です。通常、Springアプリケーションのオブジェクトは、Springの特定のクラスに依存しません。
3.制御の反転
Springは、Inversion of Control(IoC)と呼ばれる手法によって疎結合を促進します。IoCが適用されると、オブジェクト自体が依存オブジェクトを作成または検索する代わりに、オブジェクトが依存する他のオブジェクトが受動的に渡されます。JNDIとは対照的にIoCと考えることができます。オブジェクトがコンテナからの依存関係を探すのではなく、オブジェクトが初期化されるときに、コンテナはオブジェクトのリクエストを待たずに依存関係をアクティブに渡すということです。
4.カットに直面する
Springはアスペクト指向プログラミングの豊富なサポートを提供し、アプリケーションのビジネスロジックをシステムレベルのサービス(監査やトランザクション管理など)から分離することにより、一貫した開発を可能にします。アプリケーションオブジェクトは、ビジネスロジックを完了することになっているものだけを実装し、それ以上は何もしません。ロギングやトランザクションサポートなどの他のシステムレベルの問題については、責任を負いません(または意識的ですらありません)。
5.容器
Springは、アプリケーションオブジェクトの構成とライフサイクルを含み、管理します。この意味で、これはコンテナです。各Beanの作成方法を構成できます。構成可能なプロトタイプに基づいて、Beanは個別のインスタンスまたは新しいインスタンスは、必要になるたびに、およびそれらが互いにどのように関連しているかが生成されます。ただし、Springを従来のヘビーウェイトEJBコンテナーと混同しないでください。
6.フレームワーク
Springは、単純なコンポーネントを構成して、複雑なアプリケーションに組み合わせることができます。Springでは、アプリケーションオブジェクトは宣言的に、通常はXMLファイルで結合されます。Springはまた、多くの基本機能(トランザクション管理、永続フレームワークの統合など)を提供し、アプリケーションロジックの開発を任せます。
これらのすべてのSpring機能を使用すると、より簡潔で管理しやすく、コードのテストが容易になります。また、Springのさまざまなモジュールの基本的なサポートも提供します。
91. aopとは何かを説明してください。
AOP(アスペクト指向プログラミング、アスペクト指向プログラミング)は、OOP(オブジェクト指向プログラミング、オブジェクト指向プログラミング)を補完および改善すると言えます。OOPは、カプセル化、継承、ポリモーフィズムなどの概念を導入して、パブリック動作のコレクションをシミュレートするオブジェクト階層を確立します。分散オブジェクトのパブリック動作を導入する必要がある場合、OOPは無力です。つまり、OOPでは上から下への関係を定義できますが、左から右への関係を定義することは適切ではありません。たとえば、ログ機能。ログコードは多くの場合、すべてのオブジェクト階層で水平方向に分散されており、拡散するオブジェクトのコア機能とは何の関係もありません。セキュリティ、例外処理、透過的な持続性など、他のタイプのコードについても同様です。この関連性のないコードがいたるところに散在していることをクロスカッティングコードといい、OOP設計では、さまざまなモジュールの再利用につながらないコードの重複が多数発生します。
AOPテクノロジーは正反対です。「クロスカット」と呼ばれるテクノロジーを使用して、カプセル化されたオブジェクトの内部を分析し、複数のクラスに影響を与えるパブリックビヘイビアーを再利用可能なモジュールにカプセル化して、名前を付けます。 「アスペクト」、つまりアスペクト。いわゆる「アスペクト」は、ビジネスに関連しないロジックまたは責任を単にカプセル化することですが、一般にビジネスモジュールによって呼び出されます。これは、システムの反復コードを削減し、モジュール間の結合を削減し、将来に役立つのに便利です。運用と保守性。AOPは水平方向の関係を表します。「オブジェクト」がオブジェクトの属性と動作をカプセル化する中空のシリンダーである場合、アスペクト指向プログラミング方法は鋭いエッジのようなもので、これらの中空のシリンダーをカットしますニュースを入手する。そして、切断面はいわゆる「ファセット」です。次に、これらの切断面を巧妙な手で復元し、痕跡を残しません。
「横断的」技術を使用して、AOPはソフトウェアシステムを2つの部分に分割します。ビジネス処理の主なプロセスは中心的な関心事であり、それに関連しない部分は横断的関心事です。横断的関心事の特徴の1つは、主要な関心事の複数の場所で発生することが多いですが、基本的にどこでも同じです。権限認証、ログ、トランザクション処理など。Aopの役割は、システム内のさまざまな問題を分離し、コアの問題と分野横断的な問題を分離することです。Avanadeの上級ソリューションアーキテクトであるAdam Magee氏は、AOPの中核となるアイデアは、「アプリケーションのビジネスロジックを、それをサポートする一般的なサービスから分離する」ことだと述べています。
92. iocとは何かを説明してください。
IOCはInversion of Controlの略で、ほとんどの書籍は「制御の反転」として翻訳されています。
1996年、マイケルマットソンは、オブジェクト指向フレームワークの探索に関する記事で、IOCの概念を最初に提案しました。オブジェクト指向の設計とプログラミングの基本的な考え方については、すでに多くのことを話し合ったので、繰り返しはしません。簡単に言えば、複雑なシステムを相互に連携するオブジェクトに分解することです。これらのオブジェクトクラスがカプセル化された後、内部実装は外部に対して透過的です、問題の解決の複雑さを軽減し、柔軟に再利用および拡張できます。
IOC理論が提起するポイントは、おおよそ次のとおりです。依存関係を持つオブジェクト間の分離は、「サードパーティ」によって実現されます。以下に示すように:
図IOCデカップリングプロセス
ご覧のとおり、真ん中に「サードパーティ」、つまりIOCコンテナが導入されているため、4つのオブジェクトA、B、C、Dにはカップリング関係がなく、ギア間の伝達はすべて「サードパーティ」に依存しています。すべてのオブジェクトの制御は「サードパーティ」のIOCコンテナに渡されるため、IOCコンテナはシステム全体の主要なコアになり、一種の「接着剤」として機能し、システム内のすべてのオブジェクトをバインドします。この「接着剤」がないと、オブジェクトが互いに接触しなくなるため、IOCコンテナーを「接着剤」と比較する人がいます。
別の実験をしてみましょう。上の図の中央にあるIOCコンテナーを削除してから、このシステムを見てください。
IOCコンテナーを取り外した後の図
私たちが今見ているのは、システム全体を実現するために達成する必要があるすべてです。現時点では、4つのオブジェクトA、B、C、Dの間には結合関係がなく、相互に接続されていません。この場合、Aを実装する場合、B、C、Dをまったく考慮する必要はありません。オブジェクト間の依存関係は最小限に抑えられました。したがって、IOCコンテナが実現できれば、システム開発にとって素晴らしいことになるはずであり、開発に参加するすべてのメンバーは、他の人とは関係のない独自のクラスを実装するだけでよいのです。
IOCという名前がそう呼ばれる理由を見てみましょうか?比較してみましょう:
ソフトウェアシステムがIOCコンテナーを導入する前に、図1に示すように、オブジェクトAはオブジェクトBに依存しているため、オブジェクトAが初期化または特定のポイントまで実行されると、オブジェクトBをアクティブに作成するか、作成されたオブジェクトBを使用する必要があります。オブジェクトBを作成する場合でも使用する場合でも、制御は自分で行います。
ソフトウェアシステムがIOCコンテナーを導入した後、この状況は完全に変わりました。図3に示すように、IOCコンテナーの追加により、オブジェクトAとオブジェクトBは直接の連絡を失ったため、オブジェクトAが実行されてオブジェクトBが必要になったとき当時、IOCコンテナはオブジェクトBをアクティブに作成し、オブジェクトAが必要とする場所にそれを挿入します。
前後の比較から、オブジェクトAのオブジェクトBからの依存関係を取得するプロセスがアクティブ動作からパッシブ動作に変化し、制御権が逆転することがわかります。これが「逆転制御」という名前の由来です。
93.春の主要なモジュールは何ですか?
Springフレームワークはこれまでに20以上のモジュールを統合しています。以下の図に示すように、これらのモジュールは主にコアコンテナー、データアクセス/統合、Web、AOP(アスペクト指向プログラミング)、ツール、メッセージ、およびテストモジュールに分けられます。
94.春の一般的な注入方法は何ですか?
Springは、DI(Dependency Injection)を通じてIOC(Control Inversion)を実装しています。主な注入方法は3つあります。
-
コンストラクター注入
-
セッター注入
-
注釈ベースの注入
95.豆は春のスレッドセーフですか?
SpringコンテナのBeanがスレッドセーフかどうか。コンテナ自体はBeanのスレッドセーフ戦略を提供していません。したがって、Springコンテナ自体のBeanにはスレッドセーフの特性がないと言えますが、特定のスコープはBeanの特定のスコープと併せて検討する必要があります。
96. Springはどのような種類のBeanスコープをサポートしていますか?
Springコンテナーを介してBeanインスタンスを作成する場合、Beanインスタンスをインスタンス化できるだけでなく、Beanに特定のスコープを指定することもできます。Springは次の5つのスコープをサポートしています。
-
シングルトン:シングルトンモード。SpringIoCコンテナ全体では、シングルトンを使用して定義されたBeanのインスタンスは1つだけです。
-
prototype:プロトタイプモード。プロトタイプで定義されたBeanがコンテナのgetBeanメソッドを通じて取得されるたびに、新しいBeanインスタンスが生成されます
-
リクエスト:HTTPリクエストごとに、リクエストを使用して定義されたBeanは新しいインスタンスを生成します。つまり、各HTTPリクエストは異なるBeanインスタンスを生成します。このスコープは、WebアプリケーションでSpringを使用する場合にのみ有効です
-
セッション:HTTPセッションごとに、セッションで定義されたBean Beanミルクを使用して新しいインスタンスが生成されます。このスコープは、WebアプリケーションでSpringを使用する場合にのみ有効です
-
globalsession:各グローバルHTTPセッションについて、セッションを使用して定義されたBeanが新しいインスタンスを生成します。通常、これはポートレットコンテキストを使用する場合にのみ有効です。このスコープは、WebアプリケーションでSpringを使用する場合にのみ有効です
最も一般的に使用されるものの1つは、シングルトンとプロトタイプの2つのスコープです。シングルトンスコープBeanの場合、Beanの各リクエストは同じインスタンスを取得します。コンテナは、Beanインスタンスの状態を追跡し、Beanインスタンスのライフサイクル動作を維持する必要があります。Beanがプロトタイプスコープに設定されている場合、プログラムがこのIDのBeanを要求するたびに、Springは新しいBeanインスタンスを作成し、プログラムに戻ります。この場合、Springコンテナはnewキーワードのみを使用してBeanインスタンスを作成します。作成が成功すると、コンテナはインスタンスを追跡せず、Beanインスタンスの状態を維持しません。
Beanのスコープを指定しない場合、Springはデフォルトでシングルトンスコープを使用します。Javaは、Javaインスタンスを作成するときにメモリを適用する必要があります。インスタンスを破棄するときは、ガベージコレクションを完了する必要があります。これにより、システムのオーバーヘッドが増加します。したがって、プロトタイプスコープBeanの作成と破棄には比較的コストがかかります。シングルトンスコープのBeanインスタンスが正常に作成されると、再利用できます。したがって、必要でない限り、Beanをプロトタイプスコープに設定しないようにしてください。
97.豆を自動配線するための春の方法は何ですか?
Springコンテナーは、IDによってこれらのオブジェクト間の関係を調整しながら、アプリケーションでBeanを作成する役割を果たします。開発者は、作成するBeanとそれらをまとめる方法をSpringに通知する必要があります。
春のBeanアセンブリには2つの方法があります。
-
暗黙的なBean検出メカニズムと自動アセンブリ
-
JavaコードまたはXMLで構成を表示する
もちろん、これらの方法を併用することもできます。
98.春のトランザクションを実装する方法は何ですか?
-
プログラムによるトランザクション管理は、POJOベースのアプリケーションの唯一のオプションです。コードでbeginTransaction()、commit()、rollback()およびその他のトランザクション管理関連のメソッドを呼び出す必要があります。これはプログラムによるトランザクション管理です。
-
TransactionProxyFactoryBeanに基づく宣言型トランザクション管理
-
@Transactionalに基づく宣言型トランザクション管理
-
Aspectj AOPに基づいてトランザクションを構成する
99. Springのトランザクション分離はどうですか?
トランザクション分離レベルとは、1つのトランザクションによるデータの変更と別の並列トランザクションによるデータの変更との間の分離の度合いを指します。複数のトランザクションが同時に同じデータにアクセスする場合、必要な分離メカニズムが採用されていないと、次の問題が発生する可能性があります。
-
ダーティリード:1つのトランザクションが別のトランザクションのコミットされていない更新データを読み取ります。
-
ファントム読み取り:たとえば、最初のトランザクションはテーブル内のデータを変更します。たとえば、この変更にはテーブル内の「すべてのデータ行」が含まれます。同時に、2番目のトランザクションもこのテーブルのデータを変更し、この変更により「新しいデータの行」がテーブルに挿入されます。すると、将来最初のトランザクションを操作するユーザーは、あたかも錯覚が発生したかのように、テーブルに未変更のデータ行がまだあることに気付くでしょう。
-
反復不能な読み取り:たとえば、同じトランザクションで2つの同一の選択ステートメントが実行されました。このトランザクション中に、DDLステートメントは実行されていませんが、取得された結果に一貫性がなく、反復不能な読み取りです。
100. Spring MVCの実行プロセスについて教えてください。
Spring MVCオペレーションのフローチャート:
春の実行プロセスの説明:
1.ユーザーがサーバーにリクエストを送信すると、そのリクエストはSpringフロントエンドコントロールServelt DispatcherServletによってキャプチャされます。
2. DispatcherServletは要求URLを解析して、要求リソース識別子(URI)を取得します。次に、URIに従って、HandlerMappingを呼び出して、Handlerによって構成されたすべての関連オブジェクト(HandlerオブジェクトおよびHandlerオブジェクトに対応するインターセプターを含む)を取得し、最後にHandlerExecutionChainオブジェクトの形式で返します。
3. DispatcherServletは、取得したHandlerに応じて適切なHandlerAdapterを選択します(注:HandlerAdapterが正常に取得されると、この時点でインターセプターのpreHandler(...)メソッドの実行が開始されます)。
4.リクエストでモデルデータを抽出し、ハンドラーパラメーターを入力して、ハンドラー(コントローラー)の実行を開始します。ハンドラーへの入力プロセスでは、構成に応じて、Springが追加の作業を行うのに役立ちます。
-
HttpMessageConveter:要求メッセージ(Json、XMLなど)をオブジェクトに変換し、オブジェクトを指定された応答情報に変換します
-
データ変換:要求メッセージに対してデータ変換を実行します。StringがInteger、Doubleなどに変換される場合。
-
データのルート化:リクエストメッセージをフォーマットします。文字列をフォーマットされた数値またはフォーマットされた日付に変換するなど。
-
データ検証:データ(長さ、形式など)の有効性を検証し、検証結果をBindingResultまたはErrorに格納します
5. Handlerの実行が完了したら、ModelAndViewオブジェクトをDispatcherServletに返します。
6.返されたModelAndViewに従って、適切なViewResolver(Springコンテナに登録されているViewResolverである必要があります)を選択し、DispatcherServletに返します。
7. ViewResolverは、モデルとビューを組み合わせてビューをレンダリングします。
8.レンダリング結果をクライアントに返します。
101. Spring MVCのコンポーネントは何ですか?
Spring MVCのコアコンポーネント:
-
DispatcherServlet:中央コントローラー、特定の制御クラスにリクエストを転送
-
コントローラ:リクエストを明確に処理するコントローラ
-
HandlerMapping:中央処理装置がコントローラーに転送するときのマッピング戦略のマッピングを担当するマッピングプロセッサー
-
ModelAndView:サービスレイヤーおよびビューレイヤーのカプセル化クラスによって返されるデータ
-
ViewResolver:リゾルバーの表示、特定のビューの解決
-
インターセプター:インターセプター。定義したリクエストをインターセプトし、処理を行います。
102. @RequestMappingの役割は何ですか?
RequestMappingは、要求アドレスのマッピングを処理するために使用される注釈であり、クラスまたはメソッドで使用できます。クラスで使用されるということは、クラス内の要求に応答するすべてのメソッドがこのアドレスを親パスとして使用することを意味します。
RequestMappingアノテーションには6つの属性があります。以下では、説明のために彼女を3つのカテゴリに分類します。
値、方法:
-
値:リクエストの実際のアドレスを指定します。指定したアドレスは、URIテンプレートモードにすることができます(後で説明します)。
-
method:要求されたメソッドタイプ、GET、POST、PUT、DELETEなどを指定します。;
消費、生産
-
消費:application / json、text / htmlなど、リクエストを処理するためのコンテンツタイプ(Content-Type)を指定します。
-
produces:返されるコンテンツタイプを指定し、指定されたタイプがリクエストリクエストヘッダーの(Accept)タイプに含まれている場合にのみ返します。
params、headers
-
params:このメソッドがパラメータ値を処理する前に、特定のパラメータ値をリクエストに含める必要があることを指定します。
-
headers:メソッドがリクエストを処理するためには、指定されたリクエストに特定の指定されたヘッダー値が含まれている必要があります。
103. @Autowiredの役割は何ですか?
「@Autowiredの詳細な使用方法」:blog.csdn.net/u013257679/article/details/52295106
13、Mybatis
125. mybatisの#{}と$ {}の違いは何ですか?
-
#{}はコンパイル前の処理で、$ {}は文字列の置換です。
-
Mybatisが#{}を処理しているときは、SQLの#{}をa?に置き換えます。そして、PreparedStatementのsetメソッドを呼び出して値を割り当てます。
-
Mybatisは$ {}を処理するときに、$ {}を変数の値に置き換えます。
-
#{}を使用すると、SQLインジェクションを効果的に防ぎ、システムのセキュリティを向上させることができます。
126. mybatisにはいくつのページング方法がありますか?
-
番号ページ
-
SQLページネーション
-
インターセプターのページング
-
RowBoundsの改ページ
128. mybatisの論理ページングと物理ページングの違いは何ですか?
-
物理ページの速度は必ずしも論理ページよりも速いとは限りません。また、論理ページの速度は必ずしも物理ページよりも速いとは限りません。
-
物理ページングは常に論理ページングより優れています。速度に利点があっても、データベース側にアプリケーション側に圧力をかける必要はありませんが、この欠点を補うには他のパフォーマンス上の利点で十分です。
129. mybatisは遅延読み込みをサポートしていますか?遅延読み込みの原則は何ですか?
Mybatisは、関連付けとコレクションに関連するオブジェクトの遅延読み込みのみをサポートしています。関連付けは1対1を指し、コレクションは1対多のクエリを指します。Mybatis構成ファイルでは、遅延ロードを有効にするかどうかを構成できますlazyLoadingEnabled = true | false。
その原則は、CGLIBを使用してターゲットオブジェクトのプロキシオブジェクトを作成することです。ターゲットメソッドを呼び出すときに、a.getB()を呼び出すなどのインターセプターメソッドを入力します。GetName()、インターセプターinvoke()メソッドは、a.getB()が値がnullの場合、Bオブジェクトに関連付けられている事前保存されたクエリに関連付けられているsqlが個別に送信され、クエリBに送信されて、a.setB(b)が呼び出されるため、aのオブジェクトb属性に値が設定され、a.getBが完了します。 ).getName()メソッド呼び出し。これが遅延読み込みの基本原則です。
もちろん、Mybatisだけでなく、ほとんどすべてがHibernateを含めて、遅延ローディングをサポートする原理は同じです。
130. mybatisの1次キャッシュと2次キャッシュについて教えてください。
一次キャッシュ:PerpetualCacheに基づくHashMapローカルキャッシュ。そのストレージスコープはセッションで、セッションがフラッシュまたはクローズすると、このセッションのすべてのキャッシュが空になり、一次キャッシュはデフォルトでオンになります。
2次キャッシュは1次キャッシュと同じメカニズムを備えています。デフォルトでは、PerpetualCacheおよびHashMapストレージが使用されます。違いは、ストレージスコープがマッパー(名前空間)であり、Ehcacheなどのストレージソースをカスタマイズできることです。デフォルトでは、2次レベルキャッシュはオンになっていません。2次レベルキャッシュをオンにするには、2次レベルキャッシュ属性クラスを使用して、オブジェクトの状態を保存するために使用できるSerializableシリアル化インターフェイスを実装する必要があります。これは、マッピングファイル<cache />;で構成できます。
キャッシュデータ更新メカニズムの場合、C / U / D操作がスコープ(第1レベルのキャッシュセッション/第2レベルのキャッシュの名前空間)で実行された後、このスコープのすべての選択のキャッシュはデフォルトでクリアされます。
131. mybatisとhibernateの違いは何ですか?
(1)MyBatisとhibernateは異なります。MyBatisはプログラマーがSQLステートメントを自分で作成する必要があるため、ORMフレームワークとは異なります。
(2)Mybatisは、元のエコロジカルSQLを直接書き込みます。これは、SQL実行パフォーマンスを厳密に制御でき、高い柔軟性を備えています。このようなソフトウェアの需要は頻繁に変化しますが、需要の変化には迅速な出力が必要であるため、リレーショナルデータモデルに高い要件がないソフトウェア開発に非常に適しています。 。ただし、柔軟性の前提として、mybatisはデータベースの独立性を実現できないため、複数のデータベースをサポートするソフトウェアを実装する必要がある場合は、SQLマッピングファイルの複数のセットをカスタマイズする必要があり、多くの作業が必要になります。
(3)Hibernateオブジェクト/リレーショナルマッピングの能力が強く、データベースに関連性がないため、高いリレーショナルモデルを必要とするソフトウェアの場合、Hibernate開発を使用すると、多くのコードを保存して効率を向上させることができます。
132. mybatisにはどのようなエグゼキューターがいますか?
Mybatisには、3つの基本的なアクチュエータ(Executor)があります。
-
SimpleExecutor:更新または選択が実行されるたびに、Statementオブジェクトが開かれ、Statementオブジェクトは使用直後に閉じられます。
-
ReuseExecutor:更新または選択を実行し、SQLをキーとして使用してStatementオブジェクトを検索し、それが存在する場合はそれを使用し、存在しない場合は作成します。使用した後は、Statementオブジェクトを閉じないで、次の使用のためにマップに配置します。つまり、Statementオブジェクトが再利用されます。
-
BatchExecutor:更新を実行(選択なし、JDBCバッチ処理は選択をサポートしていません)、すべてのSQLをバッチに追加(addBatch())、統合実行を待機(executeBatch())、それぞれ複数のStatementオブジェクトをキャッシュしますステートメントオブジェクトはすべて、addBatch()が完了した後、executeBatch()バッチ処理を1つずつ実行するのを待機しています。JDBCバッチ処理と同じです。
133. mybatisページングプラグインの実装原理は何ですか?
ページングプラグインの基本原則は、Mybatisが提供するプラグインインターフェイスを使用してカスタムプラグインを実装し、プラグインインターセプトメソッドで実行されるようにSQLをインターセプトしてから、方言の方言に従ってSQLを書き換え、対応する物理ページングステートメントと物理ページングパラメーターを追加することです。
134. mybatisはどのようにカスタムプラグインを作成しますか?
差出人:blog.csdn.net/qq_30051265/article/details/80266434
Mybatisカスタムプラグインは、Mybatisの4つの主要なオブジェクト(Executor、StatementHandler、ParameterHandler、ResultSetHandler)をインターセプトします。特定のインターセプトメソッドは次のとおりです。
-
実行者:実行者をインターセプトする方法(ログレコード)
-
StatementHandler:SQL文法構成の処理をインターセプトします
-
ParameterHandler:パラメータ処理の傍受
-
ResultSetHandler:結果セットの処理をインターセプトします
Mybatisカスタムプラグインは、Interceptorインターフェースを実装する必要があります。
public interface Interceptor {
Object intercept(Invocation invocation) throws Throwable;
Object plugin(Object target);
void setProperties(Properties properties);
}
インターセプトメソッド:インターセプターの特定の処理ロジックメソッド
プラグインメソッド:署名signatureMapに基づいて動的プロキシオブジェクトを生成する
setPropertiesメソッド:プロパティの設定
カスタムプラグインのデモ:
// ExamplePlugin.java
@Intercepts({@Signature(
type= Executor.class,
method = "update",
args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
public Object intercept(Invocation invocation) throws Throwable {
Object target = invocation.getTarget(); //被代理对象
Method method = invocation.getMethod(); //代理方法
Object[] args = invocation.getArgs(); //方法参数
// do something ...... 方法拦截前执行代码块
Object result = invocation.proceed();
// do something .......方法拦截后执行代码块
return result;
}
public Object plugin(Object target) {
return Plugin.wrap(target, this);
}
public void setProperties(Properties properties) {
}
}
1つの@Interceptsは、複数の@Signatureで構成できます。@ Signatureのパラメーターは、次のように定義されます。
-
type:インターセプトされたクラスを示します。ここにExecutorの実装クラスがあります。
-
method:インターセプトの方法を示します。これは、Executorをインターセプトするupdateメソッドです。
-
args:メソッドのパラメーターを示します。