SpringMVC 소스 분석(2) DispatcherServlet의 초기화
DispatcherServlet의 초기 프로세스는 주로
1. WebApplicationContext 모/자 컨테이너 유지 관리
2. 서브렛 정책 초기화
본문의 주요 내용
DispatcherServlet의 통합 아키텍처
DispatcherServlet 초기화 프로세스
1. DispatcherServlet의 상속 체계
DispatcherServlet은 액세스 포털인 일반 서브렛입니다.계승 체계를 이해하여 초기화 템플릿을 정리하기 편리하다.
2. DispatcherServlet 초기화 프로세스
2.1 init
public final void init() throws ServletException {
// Set bean properties from init parameters.
// Servlet pvs
try {
PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);
BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());
bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader));
initBeanWrapper(bw);//bw DispatcherServlet
bw.setPropertyValues(pvs, true);
}
//
initServletBean();
if (logger.isDebugEnabled()) {
logger.debug("Servlet '" + getServletName() + "' configured successfully");
}
}
2.2 initServletBean 메서드
protected final void initServletBean() throws ServletException {
this.webApplicationContext = initWebApplicationContext();
initFrameworkServlet();//
}
webApplicationContext ; FrameworkServlet
2.3 initWebApplicationContext
protected WebApplicationContext initWebApplicationContext() {
WebApplicationContext wac = findWebApplicationContext();
if (wac == null) {
// No fixed context defined for this servlet - create a local one.
WebApplicationContext parent =
WebApplicationContextUtils.getWebApplicationContext(getServletContext());
wac = createWebApplicationContext(parent);
}
if (!this.refreshEventReceived) {
// Apparently not a ConfigurableApplicationContext with refresh support:
// triggering initial onRefresh manually here.
onRefresh(wac);//// DispatcherServlet.initStrategies
}
if (this.publishContext) {
// Publish the context as a servlet context attribute.
String attrName = getServletContextAttributeName();
getServletContext().setAttribute(attrName, wac);
...
}
}
return wac;
}
protected WebApplicationContext createWebApplicationContext(ApplicationContext parent) {
Class> contextClass = getContextClass();
ConfigurableWebApplicationContext wac =
(ConfigurableWebApplicationContext) BeanUtils.instantiateClass(contextClass);
wac.setParent(parent);//
wac.setServletContext(getServletContext());
wac.setServletConfig(getServletConfig());
wac.setNamespace(getNamespace());
wac.setConfigLocation(getContextConfigLocation());
// DispatcherServlet.initStrategies
wac.addApplicationListener(new SourceFilteringListener(wac, new ContextRefreshListener()));
postProcessWebApplicationContext(wac);
wac.refresh();
return wac;
}
private class ContextRefreshListener implements ApplicationListener {
public void onApplicationEvent(ContextRefreshedEvent event) {
FrameworkServlet.this.onApplicationEvent(event);
}
}
2.5.initStrategies 메서드
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
}
9개의 구성 요소를 초기화합니다.
구성 요소를 초기화하는 과정은 대체로 용기에서 가져오고 가져오지 못하면 getDefaultStrategy (ApplicationContext) 를 호출합니다.
context, Class strategyInterface) 。
DispatcherServlet.properties
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\
org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
2.6.initHandlerMappings
private void initHandlerMappings(ApplicationContext context) {
this.handlerMappings = null;
if (this.detectAllHandlerMappings) {
// Find all HandlerMappings in the ApplicationContext, including ancestor contexts.
Map matchingBeans =
BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false);
if (!matchingBeans.isEmpty()) {
this.handlerMappings = new ArrayList(matchingBeans.values());
// We keep HandlerMappings in sorted order.
OrderComparator.sort(this.handlerMappings);
}
}
else {
...
}
}
}
spring mvc 용기에서handlerMapping 대상을handlerMappings 목록에 부여합니다.이러한 객체는 태그가 해결될 때 컨테이너에 자동으로 로드됩니다.구체적이다
2.7 initHandlerAdapters 메서드
initHandlerMappings와 완전히 일치합니다.
1~5년 동안 일한 자바 엔지니어 여러분을 환영합니다. 자바 고병발: 957734884, 그룹 내에서 무료 자바 구조 학습 자료(안에는 고가용, 고병발, 고성능 및 분포식, Jvm 성능 개선, Spring 원본, MyBatis, Netty, Redis, Kafka, Mysql, Zookeeper, Tomcat, Docker, Dubbo, Nginx 등 여러 가지 지식점의 구조 자료)가 있습니다.다시는'시간이 없다'는 말로 자신의 사상적 게으름을 감추지 마라! 젊을 때 힘껏 싸워 미래의 자신에게 설명하라!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.