Spring-MVC 읽기 #5. AbstractDispatcherServletInitializer와 AbstractAnnotationConfigDispatcherServletInitializer
이번 글은 AbstractContextLoaderInitializer
클래스의 하위 클래스인 AbstractDispatcherServletInitializer클래스와 AbstractAnnotationConfigDispatcherServletInitializer 클래스를 살펴볼 것이다.
AbstractDispatcherServletInitializer
AbstractContextLoaderInitializer 클래스는 ContextLoader를 통해 root WebApplicationContext를 생성하고, 초기화(refresh)한다는 걸 이해했다. 마찬가지로 AbstractDispatcherServletInitializer 클래스는 DispatcherServlet을 생성하고 초기화한다.
AbstractDispatcherServletInitializer#registerDispatcherServlet
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
registerDispatcherServlet(servletContext);
}
protected void registerDispatcherServlet(ServletContext servletContext) {
String servletName = getServletName();
Assert.hasLength(servletName, "getServletName() must not return null or empty");
WebApplicationContext servletAppContext = createServletApplicationContext();
Assert.notNull(servletAppContext, "createServletApplicationContext() must not return null");
FrameworkServlet dispatcherServlet = createDispatcherServlet(servletAppContext);
Assert.notNull(dispatcherServlet, "createDispatcherServlet(WebApplicationContext) must not return null");
dispatcherServlet.setContextInitializers(getServletApplicationContextInitializers());
ServletRegistration.Dynamic registration = servletContext.addServlet(servletName, dispatcherServlet);
if (registration == null) {
throw new IllegalStateException("Failed to register servlet with name '" + servletName + "'. " +
"Check if there is another servlet registered under the same name.");
}
registration.setLoadOnStartup(1);
registration.addMapping(getServletMappings());
registration.setAsyncSupported(isAsyncSupported());
Filter[] filters = getServletFilters();
if (!ObjectUtils.isEmpty(filters)) {
for (Filter filter : filters) {
registerServletFilter(servletContext, filter);
}
}
customizeRegistration(registration);
}
- onStartup 메소드는 registerDispatcherServlet 메소드를 호출한다.
WebApplicationContext를 생성(createServletApplicationContext) 한 후 FrameworkServlet을 생성(createDispatcherServlet(servletAppContext))한다.
protected FrameworkServlet createDispatcherServlet(WebApplicationContext servletAppContext) { return new DispatcherServlet(servletAppContext); }
- createDispatcherServlet 메소드는 DispatcherServlet 생성한다. WebApplicationContext을 생성자 주입한다.
- DispatcherServlet은 FrontController 역할을 하며, Spring-MVC에서 가장 중요한 클래스라 이해하고 넘어가자. 자세한 설명은 다음 글에서.
- FrameworkServlet은 DispatcherServlet의 상위 클래스다.
AbstractAnnotationConfigDispatcherServletInitializer
AbstractDispatcherServletInitializer 클래스의 하위 클래스인 AbstractAnnotationConfigDispatcherServletInitializer는 AbstractContextLoaderInitializer 클래스에서 생성되는 root WebApplicationContext의 구현체인 AnnotationConfigWebApplicationContext를 생성한다.
AbstractAnnotationConfigDispatcherServletInitializer#createRootApplicationContext
@Override
@Nullable
protected WebApplicationContext createRootApplicationContext() {
Class<?>[] configClasses = getRootConfigClasses();
if (!ObjectUtils.isEmpty(configClasses)) {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(configClasses);
return context;
}
else {
return null;
}
}
- WebApplicationContext의 구현체인 AnnotationConfigWebApplicationContext 클래스를 return 한다.
- 설정 클래스를 등록한다. (AnnotationConfigWebApplicationContext#register 메소드)
- AnnotationConfigWebApplicationContext는 @Annotation을 이용해 설정 가능한 ApplicationContext의 구현체다.
마무리
이 글에서 설명하는 클래스는 2가지 중요한 일을 한다.
- DispatcherServlet을 생성한다.
- WebApplicationContext의 구현체인 AnnotationConfigWebApplicationContext를 생성한다.
Spring-MVC의 시작 부터 현재 글까지 다시 한번 정리해보자.
- WAS는 ServletContainerInitializer를 실행한다.
- ServletContainerInitializer의 구현체인 SpringServletContainerInitializer는 WebApplicationInitializer를 실행한다.
- WebApplicationInitializer는 아래와 같은 세 개의 구현체가 있다.
- AbstractContextLoaderInitializer는 ContextLoader를 이용해 WebApplicationContext를 초기화한다.
- AbstractDispatcherServletInitializer는 DispatcherServlet을 생성하고 초기화한다.
- AbstractAnnotationConfigDispatcherServletInitializer는 AnnotationConfigWebApplicationContext를 생성한다.
다음 글은 Spring-MVC의 핵심이라 할 수 있는 DispatcherServlet을 볼 예정이다.
출처 : https://blog.woniper.net/368?category=699184
'Spring Framework > Spring boot' 카테고리의 다른 글
스프링부트로 이메일보내기(비밀번호 찾기 / 회원가입 이메일 인증) (0) | 2022.05.24 |
---|---|
Spring-MVC 읽기 #7. HandlerMapping (0) | 2020.09.04 |
Spring-MVC 읽기 #6. DispatcherServlet - @Controller는 어떻게 실행될까? (0) | 2020.09.04 |
Spring-MVC 읽기 #4. AbstractContextLoaderInitializer (0) | 2020.09.04 |
Spring-MVC 읽기 #3. Spring-MVC의 시작 (0) | 2020.09.04 |
Spring-MVC 읽기 #2. 빌드 (0) | 2020.09.04 |
Spring-MVC 읽기 #1. 나는 왜 오픈소스를 읽을까? (0) | 2020.09.04 |
실행 중인 Spring Boot pid 파일 생성 (0) | 2020.09.04 |