1. ホーム
  2. java

[解決済み] Spring @ComponentScan の理解方法

2022-03-13 13:57:19

質問

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によってスキャンされていなかったりすると、これらすべてが不可能になります。