SpringBoot之l⽂件
还记得我们在写Java Web的时候吗,那个时候需要Web⼯程都需要在WEB-INF下,放置⼀个l⽂件,其⼤概格式如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="java.sun/xml/ns/j2ee"
xmlns:xsi="/2001/XMLSchema-instance"
xsi:schemaLocation="java.sun/xml/ns/j2ee
java.sun/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>DEMO</display-name>
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>web.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>OrderServlet</servlet-name>
<servlet-class>web.client.OrderServlet</servlet-class>
</servlet>
param name<servlet-mapping>
<servlet-name>OrderServlet</servlet-name>
<url-pattern>/servlet/OrderServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
例如,Tomcat在启动部署⼀个Web应⽤的时候,会在初始化阶段加载l⽂件,进⽽加载Servlet,
加载Servet与Api的映射关系,最终才能对外提供服务。
在这个阶段,我们每次开发新的功能,新增新的Servlet都需要修改l⽂件,配置也⽐较繁琐
Spring MVC简化l
使⽤Spring MVC的时候,由于Spring MVC是通过⼀个Servlet实现的:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="/2001/XMLSchema-instance"
xmlns="java.sun/xml/ns/javaee"
xmlns:web="java.sun/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="java.sun/xml/ns/javaee
java.sun/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<display-name>Spring MVC App</display-name>
<!--字符编码过滤器-->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>SpringController</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/l</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>SpringController</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
这个阶段,l就只需做配置类的设置,基于SpringMVC就⽆需再⾃⼰配置Servlet,Servlet的访
问映射,只需通过Controller进⾏开发,然后交给SpringMVC容器管理,整个⼯程的⼊⼝就统⼀由DispatcherServlet来处理,DispatcherServlet来帮你维护Servlet,Servlet 的访问映射等等的⼯作,l得到进⼀步的简化。
使⽤Spring Boot免去l
使⽤Spring Boot进⾏Web开发的时候,按照官⽅的推荐都是使⽤内嵌的Servlet容器,和应⽤⼀起打包成jar包部署,当然,我们可以使⽤传统war包来部署,Main Class只需继承org.springframework.boot.web.servlet.support.SpringBootServletInitializer即可(启动时会加载所有ServletContainerlnitializer)。
免去l是通过Servlet 3.0中的javax.servlet.ServletContainerInitializer来实现的,ServletContainerInitializer是提供了⼀个实现
和l类似功能的接⼝,在应⽤启动的时候能够通过编程的⽅式来注册Servlet、Fileter、Listener的功能。
SpringBoot通过Servlet3.0的这个设计,结合SPI机制,在spring-web包下发现META-
INF/services/javax.servlet.ServletContainerInitializer实现类:org.springframework.web.SpringServlet
ContainerInitializer从⽽进⾏初始化,包括对DispatcherServlet的注册,ContextLoaderListener的注册等等,最终免去l
总结
Servlet 3.0之后提供了ServletContainerInitializer接⼝,通过实现该接⼝就可以通过代码的形式来实现l的功能,最后注意,实现ServletContainerInitializer的实现了需要注意表明注解@HandlesTypes来指定实现类的参数从⽽进⾏定制化注册。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论