前言
最早接触的是spring 中的xml配置,感觉不是问题。后来Spring 文档中使用注解配置越来越多,经常被弄的头晕。需要整理一下。
@Configuration和@Bean
Spring Core提供的注解。非常简单,与xml配置中声明一个bean类型。
@Configuration
public class MyConfig {
@Bean
public MyService myService() {
return new MyService();
}
}
Dispatcherservlet
https://docs.spring.io/spring/docs/5.1.8.RELEASE/spring-framework-reference/web.html#mvc-servlet
Spring MVC设计中,叫做“central Servlet”。
WebApplicationContext和Context Hierarchy
每个DispatcherServlert都有自己的context,类型是WebapplictionContext。
由于应用中可以存在多个DispatherServlet,就有多个WebapplicationContext。
为了解决Bean的复用问题,DispatcherServlet 的WebaplicationContext可以有一个父WebapplicationContext。
java代码配置DispatcherServlet的Webapplicationcontext和父WebapplicationContext:
另外还可以在web.xml中配置
<web-app>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/app-context.xml</param-value>
</context-param>
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>app</servlet-name>
<url-pattern>/app/*</url-pattern>
</servlet-mapping>
</web-app>
下面这两段是配置父webapplicationContext.
ContextLoaderListener监听器保证在servlet初始化之前,创建父Webapplicationcontext,并存储在application attribute里。
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener><context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/app-context.xml</param-value>
</context-param>
Special Bean Types
Spring MVC的主要特性都由这些bean提供,比如下面3个
HandlerMapping | 找到合适的Interceptor |
HandlerAdapter | 找到合适的Dispatchservlet和处理方法 |
HandlerExceptionResolver | 处理异常 |
按照官网的说明,使用如下xml配置能自动往context中注册以上3种类型的默认bean(不过我在5.1版本没有这个配置依然在visula VM的实例中找到了以上3种类型的bean)
<mvc:annotation-driven/>
mvc:annotation-driven 等同于注解
@EnableWebMvc
<mvc:annotation-driven/>
此配置能满足大部分的web应用,即使不满足,也很容易扩展。
它除了注册上面说的3个bean,还会:
举例,如果classpath里有fastxml-jackson,则此配置会自动将jackson作为JSON的格式的消息转化器(配合@ResponsBody使用),
不然,在Controller方法中返回对象会抛出异常:
org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type: class java.util.ArrayList