[解決済み] Spring @ComponentScan の理解方法
質問
Spring MVCのチュートリアルを見ているのですが、Spring MVCで使用されている
@ComponentScan
アノテーションは、spring API のドキュメントを読んでも理解できないので、サンプルコードを紹介します。
ビューコントローラの設定
package com.apress.prospringmvc.bookstore.web.config;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
// Other imports ommitted
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.apress.prospringmvc.bookstore.web" })
public class WebMvcContextConfiguration extends WebMvcConfigurerAdapter {
// Other methods ommitted
@Override
public void addViewControllers(final ViewControllerRegistry registry) {
registry.addViewController("/index.htm").setViewName("index");
}
}
アノテーションベースコントローラー
package com.apress.prospringmvc.bookstore.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class IndexController {
@RequestMapping(value = "/index.htm")
public ModelAndView indexPage() {
return new ModelAndView("index");
}
}
質問なのですが、ビューコントローラの場合、以下のような形で
@Configuration
と
@ComponentScan(basePackages = { "com.apress.prospringmvc.bookstore.web" })
バックグラウンドで何が行われるのでしょうか?パッケージの
com.apress.prospringmvc.bookstore.web
は、これらのビューコントローラのために何かを提供するのでしょうか?
解決方法は?
簡単に言うと
@ComponentScan
は、Springによって管理されるべきアノテーションクラスがどのパッケージにあるかをSpringに伝えます。つまり、例えば、あるクラスに
@Controller
がスキャンされないパッケージにある場合、Springコントローラとして使用することはできません。
でアノテーションされたクラスは
@Configuration
は
新しい
XMLファイルの代わりにアノテーションを使ってSpringを設定する方法です(Javaコンフィギュレーションと呼ばれます)。Springはどのパッケージにspring beansが含まれているかを知る必要があり、そうでない場合は各Beanを個別に登録する必要があります。そのために
@ComponentScan
が使われています。
あなたの例では、Springにパッケージ
com.apress.prospringmvc.bookstore.web
には、Spring が処理すべきクラスが含まれています。そして、Springは
@Controller
に来るすべてのリクエストを処理し、その結果、すべてのリクエストは
/index.htm
はコントローラによって傍受されます。
リクエストがインターセプトされたとき、Springは呼び出し元にどのようなレスポンスを送ればよいかを知る必要があります。のインスタンスを返すので
ModelAndView
というビュー (JSP ページ) を探そうとします。
index
を作成し (詳細は設定されているビューリゾルバに依存します)、 それをユーザに表示します。
もし
@Controller
アノテーションがなかったり、そのパッケージがSpringによってスキャンされていなかったりすると、これらすべてが不可能になります。
関連
-
[解決済み] 環境変数JAVA_OPTSの使い方を教えてください。
-
[解決済み] 最も近い整数への切り捨て - 私は不正をしているのでしょうか、それともこれは十分すぎるほど適切なのでしょうか?
-
[解決済み] Javaコンパイラーエラー:ステートメントではありません
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] cURLでJSONデータをPOSTするにはどうすればよいですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] Java で、あるコンストラクタを別のコンストラクタから呼び出すにはどうすればよいですか?
-
[解決済み] Spring Bootアプリケーションにポートを設定する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Javaで拡張子なしのファイル名を取得する方法は?
-
[解決済み] Jdbctemplate の文字列に対するクエリです。EmptyResultDataAccessException: 不正な結果サイズ:期待値1、実際0
-
[解決済み] java.lang.ClassCastException: java.util.Arrays$ArrayList は java.util.ArrayList にキャストできません。
-
[解決済み] Oracle DB : java.sql.SQLException: 閉じた接続
-
[解決済み] 警告: コンテキスト初期化中に例外が発生 - 更新の試みはキャンセルされました。
-
[解決済み] Androidのコールバックとは何ですか?重複
-
[解決済み] JAVA_OPTIONS、JAVA_TOOL_OPTIONS、JAVA_OPTSの違いについて
-
[解決済み] どのように配列の10未満の値(x * 2)を倍増するコードを取得するには?(Java)
-
[解決済み] Mavenです。JARは空になります - 含有するためにマークされたコンテンツがありません
-
[解決済み] Java: getInstanceとStaticの比較