복붙노트

[SPRING] Tomcat은 web.xml없이 앱을 정확하게 부트 스트랩합니까?

SPRING

Tomcat은 web.xml없이 앱을 정확하게 부트 스트랩합니까?

Tomcat이 Spring MVC에서 내 앱을 어떻게 부트 스트랩합니까?

나는 이니셜 라이저를 가지고있다 :

public class AppInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext container) {
        AnnotationConfigWebApplicationContext rootCtx = new AnnotationConfigWebApplicationContext();
        rootCtx.register(AppConfig.class);
        container.addListener(new ContextLoaderListener(rootCtx));
        AnnotationConfigWebApplicationContext dispatcherCtx = new AnnotationConfigWebApplicationContext();
        dispatcherCtx.register(FreeMarkerWebConfig.class);
        ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(dispatcherCtx));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    }
}

왜 web.xml이 필요한지, 그리고 Tomcat이 어떻게 응용 프로그램을 부트 스트랩 (bootstrap)하는 데 사용 하는지를 알 수 있습니다. 하지만 Tomcat은 xml 파일이없고 AppAppInitializer 만있는 경우 응용 프로그램을 부트 스트랩하기 위해 사용해야하는 서블릿을 어떻게 알 수 있습니까?

종속성

<!-- spring mvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.2.1.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>4.2.1.RELEASE</version>
</dependency>
<!-- servlet -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.0.1</version>
</dependency>

...

스프링 코어 SpringServletContainerInitializer에서이 클래스를 찾았습니다. Tomcat이 내 앱을 부트 스트랩하기 위해 그것을 사용하는 것이 맞습니까?

http://docs.oracle.com/javaee/7/api/javax/servlet/ServletContainerInitializer.html?is-external=true

해결법

  1. ==============================

    1.Servlet 3.0은 플러그 형 메커니즘을 추가했습니다. 그것이 작동하는 방법은 앱이로드 될 때 classpath에서 META-INF / services 내의 javax.servlet.ServletContainerInitializer라는 파일을 검색하는 것입니다. 거기에 구현자는 서블릿 컨테이너가로드 할 수있는 구현의 이름을 가져야한다. spring-web jar에서이 파일을 볼 수 있습니다. org.springframework.web.SpringServletContainerInitializer를 이니셜 라이저의 구현으로 나열합니다.

    Servlet 3.0은 플러그 형 메커니즘을 추가했습니다. 그것이 작동하는 방법은 앱이로드 될 때 classpath에서 META-INF / services 내의 javax.servlet.ServletContainerInitializer라는 파일을 검색하는 것입니다. 거기에 구현자는 서블릿 컨테이너가로드 할 수있는 구현의 이름을 가져야한다. spring-web jar에서이 파일을 볼 수 있습니다. org.springframework.web.SpringServletContainerInitializer를 이니셜 라이저의 구현으로 나열합니다.

    Spring 이니셜 라이저가 작동하는 방식은 서블릿 컨테이너에 의해 WebApplicationInializer의 모든 구현 (클래스 패스 상에)이 전달된다는 것이다. 그렇다면 서블릿 컨테이너는 이러한 구현을 어떻게 통과하는지 알고 있는가? 이니셜 라이저의 소스 코드를 보면

    @HandlesTypes(WebApplicationInitializer.class)
    public class SpringServletContainerInitializer implements ServletContainerInitializer {
    

    @HandlesType 어노테이션입니다. @HandlesTypes에 나열된 모든 클래스와 주석 1은 서블릿 컨테이너에 의해 선택되어 단일 콜백 메소드 인수를 통해 SevletContainerInitializer에 전달됩니다

    void onStartup(java.util.Set<java.lang.Class<?>> c, ServletContext ctx)
    

    Set 인수는 스캔하는 동안 서블릿 컨테이너가 선택하는 모든 구현을 포함합니다. 소스 코드를 살펴봄으로써 Spring이 그러한 구현으로 무엇을하는지 볼 수 있습니다. 기본적으로 모든 inializer의 onStartup을 호출하고 ServletContext를 전달합니다.

    1. 약간 불분명했다. (위 설명은 접선에 약간의 변화가 있었을 것이다.) 그래서 나는 단지 그것을 여분으로 게시 할 것이다. 대신 @HandlesType이 상상해보십시오.

    @HandlesTypes({WebApplicationInitializer.class, Controller.class})
    public class SpringServletContainerInitializer implements ServletContainerInitializer {
    

    즉, 서블릿 컨테이너는 @Controller로 주석 된 클래스를 검색하고이를 Spring 이니셜 라이저의 onStartup으로 전달합니다.

  2. ==============================

    2.Servlet 3.0 API가 web.xml없이 작동한다는 사실과 관련이 있습니다. 스프링 기능이 아닙니다.

    Servlet 3.0 API가 web.xml없이 작동한다는 사실과 관련이 있습니다. 스프링 기능이 아닙니다.

    자세한 정보는 다음을 참조하십시오. https://blogs.oracle.com/swchan/entry/servlet_3_0_annotations

    JSR 315 : JavaTM Servlet 3.0 사양 : https://jcp.org/en/jsr/detail?id=315

    UPD :

    Spring WebApplicationInitializer는 web.xml 파일을 통해이 구성을 추가하는 대신 Servlet 3.0+ 호환 서블릿 컨테이너에서 Spring DispatcherServlet 및 ContextLoaderListener를 프로그래밍 방식으로 구성하는 방법을 제공합니다.

    응답은 Servlet 3.0 사양으로 소개 된 ServletContainerInitializer 인터페이스입니다.이 인터페이스의 구현자는 컨텍스트 시작 단계에서 통보되고 제공된 ServletContext를 통해 프로그래밍 방식 등록을 수행 할 수 있습니다.

    Spring은 SpringServletContainerInitializer 클래스를 통해 ServletContainerInitializer를 구현한다. 서블릿 스펙에 따라이 구현은 라이브러리 jar 파일의 META-INF / services / javax.servlet.ServletContainerInitializer 파일에서 선언되어야합니다. Spring은 spring-web * .jar jar 파일에서 이것을 선언하고 org.springframework 항목을 갖습니다. web.SpringServletContainerInitializer

    SpringServletContainerInitializer 클래스는 WebApplicationInitializer 값을 가진 @HandlerTypes 주석을 가지고 있습니다. 즉, Servlet 컨테이너가 WebApplicationInitializer 구현을 구현하는 클래스를 검색하고 이러한 클래스로 WebApplicationInitializer가 들어 맞는 onStartUp 메소드를 호출합니다.

    조금 복잡하지만 좋은 점은 스프링 웹 프레임 워크 내에서 이러한 모든 세부 사항이 완전히 추상화되어 있기 때문에 개발자는 WebApplicationInitializer의 구현을 구성하고 web.xml이없는 세계에서만 살아야한다는 것입니다.

  3. from https://stackoverflow.com/questions/32550131/how-does-tomcat-exactly-bootstrap-the-app-without-web-xml by cc-by-sa and MIT license