springBoot零配置原理与内嵌tomcat原理

一、使用传统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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章