スプリングMVC運動原理(6):スプリングMVC連動


サーブレットアプリケーションへのスプリングのバインド
スプリングによって提供されるIoC容器を使用する方法
  • スプリングを使用して提供するサーバインプリメンテーションDispatcherServicelet

  • 6.スプリングMVC連動


    DispatcherServlet
  • スプリングMVCのコア.
  • Front Controlの役割を果たします.
  • 作成
  • Handler
  • @RestController
    public class HelloController {
    
        @Autowired
        HelloService helloService;
    
        @GetMapping("/hello")
        public String hello() {
            return "Hello, " + helloService.getName();
        }
    }
    コントローラはDispatcherServiceletが作成したServicelet Webアプリケーションコンテキストに登録する必要があり、サービスはContextLoaderListenerが作成したRoot Webアプリケーションコンテキストに登録する必要があります.サーブレットWebApplicationContextは、RootWebApplicationContextのサブアイテムであるため、サービスオブジェクトを参照できます.
    このように空を認識して登録するには@ComponentScanを修正する必要があります.
  • AppConfig@ComponentScan修正
  • @Configuration
    @ComponentScan(excludeFilters = @ComponentScan.Filter(Controller.class))
    public class AppConfig {
    }
    コントローラはRootWebApplicationContextに空に登録されません.サービスのみが空に登録されています.
  • DispatcherServicelet作成されたServicelet WebApplicationContextスプリングプロファイル
  • を生成するために使用される
    @Configuration
    @ComponentScan(useDefaultFilters = false, includeFilters = @ComponentScan.Filter(Controller.class))
    public class WebConfig {
    }
    コントローラのみがサーブレットWebApplicationContextに空に登録されています.他のHandleMappingやViewResolverなどはこの中で空に登録すればいいです.
  • DispatcherServicelet作成およびDispatcherServicelet作成のServicelet WebアプリケーションContextで使用するスプリングプロファイル登録
  • <!DOCTYPE web-app PUBLIC
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app>
      <display-name>Archetype Created Web Application</display-name>
      <context-param>
        <param-name>contextClass</param-name>
        <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
      </context-param>
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>org.example.servlet02.AppConfig</param-value>
      </context-param>
      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
      <servlet>
        <servlet-name>app</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
          <param-name>contextClass</param-name>
          <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
        </init-param>
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>org.example.servlet02.WebConfig</param-value>
        </init-param>
      </servlet>
      <servlet-mapping>
        <servlet-name>app</servlet-name>
        <url-pattern>/app/*</url-pattern>
      </servlet-mapping>
    </web-app>
    ただし、複数のDispatcherServiceletを使用しない場合は、ContextLoaderListerおよびRootWebApplicationContextを作成する必要はありません.また、DispatcherServiceletによって生成されたサーブレットWebApplicationContextを使用して、ルートとしてすべての空を登録することもできます.
    <!DOCTYPE web-app PUBLIC
     "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app>
      <display-name>Archetype Created Web Application</display-name>
      <servlet>
        <servlet-name>app</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
          <param-name>contextClass</param-name>
          <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
        </init-param>
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>org.example.servlet02.WebConfig</param-value>
        </init-param>
      </servlet>
      <servlet-mapping>
        <servlet-name>app</servlet-name>
        <url-pattern>/app/*</url-pattern>
      </servlet-mapping>
    </web-app>
    @Configuration
    @ComponentScan
    public class WebConfig {
    }
    また、DispatcherServiceletによって生成されたサーブレットWebアプリケーションコンテキストにはすべての空を登録し、ContextLoaderListenerによって生成されたRoot Webアプリケーションコンテキストにはすべての空を登録することができますが、これは良い設定ではありません.
    ここで見られる構造はSpringBootとは異なり、まずSpliteコンテナをポップアップし、Spliteコンテナに登録されているWebアプリケーションにContextLoaderListerとDispatcherServiceletを登録してSpringを開始することです.(構造にスプリングを含む)
    しかしSpring BootではSpring BootアプリケーションがまずJavaアプリケーションとして出現し,ここでTomcatが組み込みサーバとして出現する.また、DispatcherServiceletをコードとしてimbedd Tomcatに登録します.(springというJavaアプリケーションにTomcatが含まれている構造)
    リファレンス
  • インフラストラクチャ:SpringWeb MVC(白旗船)
  • http://www.corej2eepatterns.com/FrontController.htm
  • https://www.oracle.com/technetwork/java/frontcontroller-135648.html
  • https://martinfowler.com/eaaCatalog/frontController.html