SpringBoot消失的Web.xml

Filter

过滤器作为web.xml中重要的一部分,有着相当高的出场率,SpringBoot会默认注册几个Filter

ApplicationContextHeaderFilter

CharacterEncodingFilter

如果添加了Security依赖的话会加入SpringSecurityFilterChain

如果加入Actuator依赖的话就会加入WebRequestTraceFilter

实现自己的Filter

JavaConfig注册Bean

我们如果自己要实现自己的Filter的话,需要实现Filter并实现其中的方法

同时要利用JavaConfig的方法来配置,一般情况下需要编写@Bean注解的返回值为FilterRegistrationBean的方法来实现JavaBean的注册

具体实现如下

需要注意的是此方法需要在被@Configuration注解的配置类中

@WebFilter+@ServletComponentScan

如果觉得Java代码的方式比较繁琐的话可以采用注解方式注册Filter,具体实现方式是在Filter实现类加入@WebFilter注解

例如

然后在SpringBootApplication类上添加@ServletComponentScan

Filter的注册原理

我们采用JavaConfig的形式实现了Filter的注册,通过向上追溯得知FilterRegistrationBean的层级结构如下

ServletContextInitializer

RegistrationBean

AbstractFilterRegistrationBean

FilterRegistrationBean

经查阅SpringBoot文档发现针对ServletContextInitializer的描述如下

Interface used to configure a Servlet 3.0+ context programmatically. Unlike WebApplicationInitializer, classes that implement this interface (and do not implement WebApplicationInitializer) will not be detected by SpringServletContainerInitializer and hence will not be automatically bootstrapped by the Servlet container.

This interface is primarily designed to allow ServletContextInitializers to be managed by Spring and not the Servlet container.

For configuration examples see WebApplicationInitializer.

既然是由SpringBoot进行管理而不是由Servlet容器管理,那么基本可以确定是由SpringBoot进行管理

在org.springframework.boot.context.embedded.tomcat包中我们找到了答案

TomcatEmbeddedServletContainerFactory的一直向上继承了AbstractConfigurableEmbeddedServletContainer

并且维护了一个私有的List<ServletContextInitializer>变量,我们不难猜出,正是因为FilterRegistrationBean继承了ServletContextInitializer而实现了Filter的注册

为了进一步验证我们的猜测,在注册Filter的JavaConfig代码中打了断点跟踪一下

可以看到在启动过程中会获取类型为ServletContextInitializer的Bean

继续向下看在SpringBoot内嵌的Tomcat中的TomcatStarter类中也同样实现了ServletContextInitializer

并且在实现方法中执行了AbstractFilterRegistrationBean实现的onStartup方法

至此Filter注册成功

Servlet和Listener

Servlet与Listener的支持与Filter大同小异,同样也是支持两种方法进行注册

JavaConfig的话不同的是Servlet需要的是ServletRegistrationBean,而Listener需要的是ServletListenerRegistrationBean

注解的话则分别是通过@WebServlet、@WebListener进行注解

至于注册管理过程则基本与Filter相同

Spring Boot是一个用于快速搭建和开发Spring应用的框架,它极大地简化了基于Spring的应用开发过程。在Spring Boot中,通常不会使用web.xml这个传统的方式来配置web应用。这是因为Spring Boot遵循“约定优于配置”的原则,提供了许多自动配置的特性。 Spring Boot提供了一个名为SpringApplication的类,这个类提供了运行Spring应用的便捷方法。通常只需要在主类中调用SpringApplication.run()方法即可启动应用。Spring Boot会自动配置大多数标准应用,并且在类路径上有特定的库时,还会开启特定的功能。 然而,如果你确实需要在Spring Boot项目中使用web.xml,这通常意味着你正在将Spring Boot应用打包成WAR文件并部署在传统的Java EE容器中。在这种情况下,Spring Boot提供了特定的配置方式来适应web.xml。 1. 首先,你需要在项目中排除spring-boot-starter-tomcat依赖,或者指定其作用域为provided,因为Servlet容器(如Tomcat)将会由外部提供。 2. 然后,你可以在src/main/webapp/WEB-INF目录下创建你的web.xml文件,并按照Java EE的规范进行配置。web.xml中可以配置Servlet、监听器(Listeners)、过滤器Filters)等。 3. 最后,你需要创建一个继承自SpringBootServletInitializer的类,并重写configure()方法,这样Spring Boot才能在Servlet容器启动时配置应用上下文。 下面是一个简单的配置SpringBootServletInitializer的示例: ```java import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; public class MySpringBootServletInitializer extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(MyApplication.class); } } ``` 这里MyApplication是你Spring Boot的主类。 需要注意的是,这种方式主要是为了部署到传统的Servlet容器中,对于大多数Spring Boot项目,建议使用内嵌的Tomcat,并且不使用web.xml
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值