1. Spring MVCの特徴
2. Spring MVCでWebアプリケーションを作る特長(cháng)
3. Spring MVCが動(dòng)く仕組み(プレゼンテーション層)
● Spring MVCはMVC型のフレームワークであること
● アノテーションの採用(たとえばControllerクラスを作成するためにControllerインターフェースをimplementsする必要がなくなりクラスに@Controllerアノテーションを宣言するだけでいい)
● SpringのControllerは、RESTの実裝方式(RESTではWeb上の情報の一つ一つをリソースとしてとらえ、それらの識別子としてURIを割り當ててユニークに特定できるようにすることSpringのControllerもURLとメソッドを直接結びつけている)
● DIという技術(shù)を使っている
● AOPという技術(shù)を使っている
普通にWebアプリを作ると、次のような3つの問(wèn)題がある。
A. オブジェクトのライフサイクルの問(wèn)題
コントローラを実現するServletは、View部分にアクセスするユーザ數が増えるたびにインスタンス化されることによるガーベージコレクト時(shí)のパフォーマンス低下やメモリへの圧迫を防ぐよう、マルチスレッドで動(dòng)作させる。しかし、コントローラから呼ばれるサービスロジックのオブジェクトを毎回インスタンス化するように設計?実裝させてしまえば、View部分にアクセスするユーザ數が増えたときにインスタンスが増大し、ガーベージコレクト時(shí)のパフォーマンス低下やメモリの圧迫が発生してしまう恐れがある。これを防ぐためには、サービスロジックのオブジェクトはSingletonにしなければならない???(37頁(yè))
B. 部品化の問(wèn)題
Webアプリケーションを構成するオブジェクト間の依存関係は、インタフェースを介して実裝非依存にすることでオブジェクト間を疎結合に保つことができる。???しかし、Springのようなフレームワークを利用せずに、このようなインタフェース依存?実裝非依存を実現するにはテクニックを要する。例えば、単にインタフェースを利用するだけでは、実裝非依存にならない。そこで、通常はFactoryMethodなどを導入して、実裝非依存を実現する。(37-38頁(yè))
C. 技術(shù)隠蔽や不適切な技術(shù)隠蔽の問(wèn)題
顧客クラスや受注クラスの中に、顧客や受注の処理とは言いがたいトランザクションの例外、ロギングのような処理が入ってくるのは、プログラムの可読性を著(zhù)しく落としてしまう。また、例外処理がいくつも書(shū)かれているということは、ソースコード中の分岐が増えるということは、可読性はもちろん、Unitテストの容易性だって落としてしまうことになる。(39-40頁(yè))
で、それぞれの問(wèn)題は、以下のような感じ、DIコンテナ×AOPで解決できる。
A. オブジェクトのライフサイクルの問(wèn)題 →DIコンテナで解決
B. 部品化の問(wèn)題 →DIコンテナで解決
C. 技術(shù)隠蔽や不適切な技術(shù)隠蔽の問(wèn)題 →AOPで解決
■DIコンテナとは
● オブジェクト、オブジェクト同士の関連を生成をする
● インタフェースベースのコンポーネントを容易に実裝可能にする
● あるオブジェクトのプロパティにそのオブジェクトにそのオブジェクトが利用(依存)するオブジェクトを設定(作成)すること。
● 普通のWebアプリだと、各オブジェクトが別のオブジェクトを直接newして利用するので、密結合になってしまうが、
SpringのDIコンテナが入ることで、各オブジェクトの依存関係が解消される(48頁(yè))。
インタフェースに関連しているではないか、と思うのだが、「DIを利用するときは、原則としてクラスはインタフェースのみに依存して、具象クラスには依存しないようにする必要がある」らしい。
● DIコンテナの実體の核になるのはBeanFactory。BeanFactoryは、その実行時(shí)に渡されるBean定義ファイルに基づいてファイルを生成し、インスタンスのインジェクションを行う。
インジェクションの意味はよく分からなかったorz
■AOPとは
● オブジェクトの責務(wù)以外のロジック(ユーザ認証やロギング、トランザクション管理や例外処理)をソースコードに記述することなく、後から追加できる。
① DispacherServletはブラウザからリクエストを受け取る
② DispacherServletは、リクエストされたURLをHandlerMappingオブジェクトに対してよびだし対象のControllerオブジェクトを取得し、URLに該當するメソッドを実行する
② Controllerオブジェクトはビジネスロジックを使用して処理を実行し、その結果を基にビューに渡すオブジェクトをModelオブジェクトに格納する。最後にControllerオブジェクトは処理の結果に応じてView名を返す
④ DispacherServletはControllerから返されたView名をViewResolverに渡し、Viewオブジェクトを取得する。
⑤ DispacherServletはViewオブジェクトに畫(huà)面表示を依頼する
⑥ Viewオブジェクトは該當するビューを呼び出して畫(huà)面表示を依頼
⑦ ビューはModelオブジェクトから畫(huà)面表示に必要なオブジェクトを取得し、畫(huà)面表示処理を実行する
| DispacherServlet | イメージはSpringを制御するクラス。すべてのHTTPリクエストを受け付けて、HandlerMappingオブジェクトから取得したControllerオブジェクトのメソッドを実行。その他のオブジェクトの流れを制御する?;镜膜摔嫌靡猡丹欷皮い隓ispatcherServletクラスをそのまま使う。 |
| HandlerMappingオブジェクト | DispacherServletからの要請を受けて、URLから、呼び出すControllerオブジェクトを返卻する。 |
| Viewオブジェクト | ViewインタフェースをImplemtensしたViewオブジェクト。Webコンテナ上で管理されているJSPといったリソースに対してforwardをしてくれる「InternalResourceView」などがある。 |
上の流れには登場(chǎng)しないが、このほかにも各クラスの依存性を解消して疎結合に保つための色んなクラスがある。
以上、今回はここまで。
聯(lián)系客服