springMVC的九大组件组件
@Nullable
private MultipartResolver multipartResolver
;
@Nullable
private LocaleResolver localeResolver
;
@Nullable
private ThemeResolver themeResolver
;
@Nullable
private List
<HandlerMapping> handlerMappings
;
@Nullable
private List
<HandlerAdapter> handlerAdapters
;
@Nullable
private List
<HandlerExceptionResolver> handlerExceptionResolvers
;
@Nullable
private RequestToViewNameTranslator viewNameTranslator
;
@Nullable
private FlashMapManager flashMapManager
;
@Nullable
private List
<ViewResolver> viewResolvers
;
九大组件都是接口,
在哪初始化
在容器启动时…hehe
org.springframework.web.servlet.DispatcherServlet#onRefresh
@Override
protected void onRefresh(ApplicationContext context
) {
initStrategies(context
);
}
org.springframework.web.servlet.DispatcherServlet#initStrategies
protected void initStrategies(ApplicationContext context
) {
initMultipartResolver(context
);
initLocaleResolver(context
);
initThemeResolver(context
);
initHandlerMappings(context
);
initHandlerAdapters(context
);
initHandlerExceptionResolvers(context
);
initRequestToViewNameTranslator(context
);
initViewResolvers(context
);
initFlashMapManager(context
);
}
调用链onRefresh
spring有自己的默认实现
private static final String DEFAULT_STRATEGIES_PATH
= "DispatcherServlet.properties";
static {
try {
ClassPathResource resource
= new ClassPathResource(DEFAULT_STRATEGIES_PATH
, DispatcherServlet
.class);
defaultStrategies
= PropertiesLoaderUtils
.loadProperties(resource
);
}
catch (IOException ex
) {
throw new IllegalStateException("Could not load '" + DEFAULT_STRATEGIES_PATH
+ "': " + ex
.getMessage());
}
}
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.method.annotation.RequestMappingHandlerMapping
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,\
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
org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
initMultipartResolver
private void initMultipartResolver(ApplicationContext context
) {
try {
this.multipartResolver
= context
.getBean(MULTIPART_RESOLVER_BEAN_NAME
, MultipartResolver
.class);
if (logger
.isTraceEnabled()) {
logger
.trace("Detected " + this.multipartResolver
);
}
else if (logger
.isDebugEnabled()) {
logger
.debug("Detected " + this.multipartResolver
.getClass().getSimpleName());
}
}
catch (NoSuchBeanDefinitionException ex
) {
this.multipartResolver
= null
;
if (logger
.isTraceEnabled()) {
logger
.trace("No MultipartResolver '" + MULTIPART_RESOLVER_BEAN_NAME
+ "' declared");
}
}
}
bean id是固定,在xml中配置类似,其他组件也都是上面的获取方式
<bean id="multipartResolver"
class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
</bean>
initHandlerMappings
private void initHandlerMappings(ApplicationContext context
) {
this.handlerMappings
= null
;
if (this.detectAllHandlerMappings
) {
Map
<String, HandlerMapping> matchingBeans
=
BeanFactoryUtils
.beansOfTypeIncludingAncestors(context
, HandlerMapping
.class, true, false);
if (!matchingBeans
.isEmpty()) {
this.handlerMappings
= new ArrayList<>(matchingBeans
.values());
AnnotationAwareOrderComparator
.sort(this.handlerMappings
);
}
}
else {
try {
HandlerMapping hm
= context
.getBean(HANDLER_MAPPING_BEAN_NAME
, HandlerMapping
.class);
this.handlerMappings
= Collections
.singletonList(hm
);
}
catch (NoSuchBeanDefinitionException ex
) {
}
}
if (this.handlerMappings
== null
) {
this.handlerMappings
= getDefaultStrategies(context
, HandlerMapping
.class);
if (logger
.isTraceEnabled()) {
logger
.trace("No HandlerMappings declared for servlet '" + getServletName() +
"': using default strategies from DispatcherServlet.properties");
}
}
}
initHandlerAdapters
private void initHandlerAdapters(ApplicationContext context
) {
this.handlerAdapters
= null
;
if (this.detectAllHandlerAdapters
) {
Map
<String, HandlerAdapter> matchingBeans
=
BeanFactoryUtils
.beansOfTypeIncludingAncestors(context
, HandlerAdapter
.class, true, false);
if (!matchingBeans
.isEmpty()) {
this.handlerAdapters
= new ArrayList<>(matchingBeans
.values());
AnnotationAwareOrderComparator
.sort(this.handlerAdapters
);
}
}
else {
try {
HandlerAdapter ha
= context
.getBean(HANDLER_ADAPTER_BEAN_NAME
, HandlerAdapter
.class);
this.handlerAdapters
= Collections
.singletonList(ha
);
}
catch (NoSuchBeanDefinitionException ex
) {
}
}
if (this.handlerAdapters
== null
) {
this.handlerAdapters
= getDefaultStrategies(context
, HandlerAdapter
.class);
if (logger
.isTraceEnabled()) {
logger
.trace("No HandlerAdapters declared for servlet '" + getServletName() +
"': using default strategies from DispatcherServlet.properties");
}
}
}
initRequestToViewNameTranslator
private void initHandlerExceptionResolvers(ApplicationContext context
) {
this.handlerExceptionResolvers
= null
;
if (this.detectAllHandlerExceptionResolvers
) {
Map
<String, HandlerExceptionResolver> matchingBeans
= BeanFactoryUtils
.beansOfTypeIncludingAncestors(context
, HandlerExceptionResolver
.class, true, false);
if (!matchingBeans
.isEmpty()) {
this.handlerExceptionResolvers
= new ArrayList<>(matchingBeans
.values());
AnnotationAwareOrderComparator
.sort(this.handlerExceptionResolvers
);
}
}
else {
try {
HandlerExceptionResolver her
=
context
.getBean(HANDLER_EXCEPTION_RESOLVER_BEAN_NAME
, HandlerExceptionResolver
.class);
this.handlerExceptionResolvers
= Collections
.singletonList(her
);
}
catch (NoSuchBeanDefinitionException ex
) {
}
}
if (this.handlerExceptionResolvers
== null
) {
this.handlerExceptionResolvers
= getDefaultStrategies(context
, HandlerExceptionResolver
.class);
if (logger
.isTraceEnabled()) {
logger
.trace("No HandlerExceptionResolvers declared in servlet '" + getServletName() +
"': using default strategies from DispatcherServlet.properties");
}
}
}
initRequestToViewNameTranslator
private void initRequestToViewNameTranslator(ApplicationContext context
) {
try {
this.viewNameTranslator
=
context
.getBean(REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME
, RequestToViewNameTranslator
.class);
if (logger
.isTraceEnabled()) {
logger
.trace("Detected " + this.viewNameTranslator
.getClass().getSimpleName());
}
else if (logger
.isDebugEnabled()) {
logger
.debug("Detected " + this.viewNameTranslator
);
}
}
catch (NoSuchBeanDefinitionException ex
) {
this.viewNameTranslator
= getDefaultStrategy(context
, RequestToViewNameTranslator
.class);
if (logger
.isTraceEnabled()) {
logger
.trace("No RequestToViewNameTranslator '" + REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME
+
"': using default [" + this.viewNameTranslator
.getClass().getSimpleName() + "]");
}
}
}
initViewResolvers
private void initViewResolvers(ApplicationContext context
) {
this.viewResolvers
= null
;
if (this.detectAllViewResolvers
) {
Map
<String, ViewResolver> matchingBeans
=
BeanFactoryUtils
.beansOfTypeIncludingAncestors(context
, ViewResolver
.class, true, false);
if (!matchingBeans
.isEmpty()) {
this.viewResolvers
= new ArrayList<>(matchingBeans
.values());
AnnotationAwareOrderComparator
.sort(this.viewResolvers
);
}
}
else {
try {
ViewResolver vr
= context
.getBean(VIEW_RESOLVER_BEAN_NAME
, ViewResolver
.class);
this.viewResolvers
= Collections
.singletonList(vr
);
}
catch (NoSuchBeanDefinitionException ex
) {
}
}
if (this.viewResolvers
== null
) {
this.viewResolvers
= getDefaultStrategies(context
, ViewResolver
.class);
if (logger
.isTraceEnabled()) {
logger
.trace("No ViewResolvers declared for servlet '" + getServletName() +
"': using default strategies from DispatcherServlet.properties");
}
}
}
initFlashMapManager
private void initFlashMapManager(ApplicationContext context
) {
try {
this.flashMapManager
= context
.getBean(FLASH_MAP_MANAGER_BEAN_NAME
, FlashMapManager
.class);
if (logger
.isTraceEnabled()) {
logger
.trace("Detected " + this.flashMapManager
.getClass().getSimpleName());
}
else if (logger
.isDebugEnabled()) {
logger
.debug("Detected " + this.flashMapManager
);
}
}
catch (NoSuchBeanDefinitionException ex
) {
this.flashMapManager
= getDefaultStrategy(context
, FlashMapManager
.class);
if (logger
.isTraceEnabled()) {
logger
.trace("No FlashMapManager '" + FLASH_MAP_MANAGER_BEAN_NAME
+
"': using default [" + this.flashMapManager
.getClass().getSimpleName() + "]");
}
}
九大组件
配合下面的属性
private boolean detectAllHandlerMappings
= true;
private boolean detectAllHandlerAdapters
= true;
private boolean detectAllHandlerExceptionResolvers
= true;
private boolean detectAllViewResolvers
= true;
private boolean throwExceptionIfNoHandlerFound
= false;
private boolean cleanupAfterInclude
= true;
属性都可以通过配置更改,但Bean的id是固定的,如果自定义只能下面这些名称
public static final String MULTIPART_RESOLVER_BEAN_NAME
= "multipartResolver";
public static final String LOCALE_RESOLVER_BEAN_NAME
= "localeResolver";
public static final String THEME_RESOLVER_BEAN_NAME
= "themeResolver";
public static final String HANDLER_MAPPING_BEAN_NAME
= "handlerMapping";
public static final String HANDLER_ADAPTER_BEAN_NAME
= "handlerAdapter";
public static final String HANDLER_EXCEPTION_RESOLVER_BEAN_NAME
= "handlerExceptionResolver";
public static final String REQUEST_TO_VIEW_NAME_TRANSLATOR_BEAN_NAME
= "viewNameTranslator";
public static final String VIEW_RESOLVER_BEAN_NAME
= "viewResolver";
public static final String FLASH_MAP_MANAGER_BEAN_NAME
= "flashMapManager";