Servlet
- Servlet 3.0 이상부터 Java Based 설정을 제공한다.
- web.xml 을 이용한 설정도 가능
- web.xml 없이 자바코드만으로도 설정 가능
- web.xml 은 ServletContext Object를 초기화하는데 사용하던 메타정보
javax.servlet.ServletContainerInitializer
- /META-INF/services/javax.servlet.ServletContainerInitializer 라는 텍스트 파일로 존재한다.
- 해당 파일안에는 구현클래스를 지정하게 된다.
- web.xml이라는 표준 설정 파일을 없애므로써 클래스패스내의 기반 설정이 되어야 하는 파일을 찾아야 하는데 스캐닝 비용이 부담스러웠다.
- 그래서 명시적인 Text File로 설정 정보를 가지고 있는 구현클래스 정보를 담는다.
- 구현클래스에 @HandlesTypes 를 사용하면 @HandlesTypes 안에 지정한 타입의 클래스를 모조리 찾아서 onStartup()의 파라미터로 넣어준다
Spring에서 구현한 클래스 정보
Text File
in /META-INF/services/javax.servlet.ServletContainerInitializer
org.springframework.web.SpringServletContainerInitializer
SpringServletContainerInitializer
- spring-web 컴포넌트에 존재한다.
- WebApplicationInitializer Type의 클래스를 모조리 찾아서 SpringServletContainerInitializer의 onStartUp() 으로 전달한다.
- SpringServletContainerInitializer는 직접적으로 ServletContext에 무언가를 등록하지 않는다.
- 모두 WebApplicationInitializer에 위임한다.
- @Order로 실행순서를 조정하는 역할을 한다.
package org.springframework.web;
@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {
@Override
public void onStartup(Set<Class<?>> webAppInitializerClasses, ServletContext servletContext)
throws ServletException {
List<WebApplicationInitializer> initializers = new LinkedList<WebApplicationInitializer>();
if (webAppInitializerClasses != null) {
for (Class<?> waiClass : webAppInitializerClasses) {
// Be defensive: Some servlet containers provide us with invalid classes,
// no matter what @HandlesTypes says...
if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) &&
WebApplicationInitializer.class.isAssignableFrom(waiClass)) {
try {
initializers.add((WebApplicationInitializer) waiClass.newInstance());
}
catch (Throwable ex) {
throw new ServletException("Failed to instantiate WebApplicationInitializer class", ex);
}
}
}
}
if (initializers.isEmpty()) {
servletContext.log("No Spring WebApplicationInitializer types detected on classpath");
return;
}
servletContext.log(initializers.size() + " Spring WebApplicationInitializers detected on classpath");
AnnotationAwareOrderComparator.sort(initializers);
for (WebApplicationInitializer initializer : initializers) {
initializer.onStartup(servletContext);
}
}
}