一、使用传统springMVC“必要”的配置:
1.配置web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- 初始化spring环境-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- springmvc前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
2.配置applicationContext.xml
//扫描业务类
<context:component-scanbase-package="com.service" />
3.配置spring-mvc.xml
//扫描控制器类
<context:component-scan base-package="com.controller" />
总结:一个传统的spring-mvc(不考虑db与其他中间件等)必要配置为初始化spring环境、前端控制器配置、扫描业务类配置、扫描控制器类配置,一共4个必要的配置,那么如果我们能通过注解or代码来替代上面4个必要的配置的话,就可以做到零配置
二、springBoot零配置:
https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html
官网的示例,上面那段代码便可以替代传统的springMVC配置,WebApplicationInitializer类便可替代web.xml,只需要在web应用服务器启动的时候调用spring的初始化并调用该类的onStartup方法即可
三、springBoot如何把Servlet注册给tomcat或web容器对象:
1.通过web.xml方式配置
2.通过@webServlet注解
3.通过tomcat对象的addServlet方法
springBoot明显不可能采用前面两种,通过第三种便需要内嵌tomcat
四、springBoot如何内嵌tomcat:
1.通过maven依赖引入tomcat
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.33</version>
</dependency>
2.代码启动tomcat
Tomcat tomcat = new Tomcat();
tomcat.setPort(9980);
try{
tomcat.start();
tomcat.getServer().await();
}catch(LifecyleException e){
e.printStackTrace();
}
酱紫就可以启动内嵌tomcat了,但是要初始化spring环境与springMVC配置还需要tomcat在启动的时候调用WebApplicationInitializer的onStartup方法,如何能实现呢?即如何能让tomcat在不依赖spring的前提下,启动的时候调用WebApplicationInitializer的onStartup方法
答案是servlet 3.0 + java的SPI机制。从servlet3.0开始,web容器启动时为提供给第三方组件机会做一些初始化的工作,例如注册servlet或者filtes等,servlet规范中通过ServletContainerInitializer实现此功能。spring实现了servlet 3.0的标准,通过对ServletContainerInitializer接口进行了实现SpringServletContainerInitializer,并且在spring-web-x.x.x-RELEASE.jar的META-INF/services目录创建一个名为javax.servlet.ServletContainerInitializer的文件,指定了具体实现为org.springframework.web.SpringServletContainerInitializer,配合注解@HandlesTypes它可以将其指定的Class对象作为参数传递到onStartup方法中。进而在onStartup方法中获取Class对象的具体实现类,进而调用实现类中的具体方法。SpringServletContainerInitializer类中@HandlesTypes指定的是Class对象是WebApplicationInitializer。因此,若实现WebApplicationInitializer这个接口,我们就可以自定义的注入Servlet,或者Filter等等,即可以不再依赖web.xml的配置,tomcat也无需依赖spring