Springboot的版本是1.5.19.RELEASE。
Springboot中会使用FilterRegistrationBean来注册Filter,Filter是Servlet规范里面的,属于容器范围,Springboot中我们没有web.xml,那Springboot中,Filter是如何交给Servlet容器的呢?
如下图1是FilterRegistrationBean的继承图
图1
javax.servlet.ServletContext从3.0开始,提供了addFilter方法,如下
图2
我们来看FilterRegistrationBean的父类AbstractFilterRegistrationBean的onStartup,如下List-1,调用了ServletContext的addFilter方法。
List-1
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
Filter filter = getFilter();
Assert.notNull(filter, "Filter must not be null");
String name = getOrDeduceName(filter);
if (!isEnabled()) {
this.logger.info("Filter " + name + " was not registered (disabled)");
return;
}
FilterRegistration.Dynamic added = servletContext.addFilter(name, filter);
if (added == null) {
this.logger.info("Filter " + name + " was not registered "
+ "(possibly already registered?)");
return;
}
configure(added);
}
/**
* Return the {@link Filter} to be registered.
* @return the filter
*/
public abstract Filter getFilter();
onStartup方法是接口org.springframework.boot.web.servlet.ServletContextInitializer的方法,那ServletContextInitializer的onStartup在哪被调用了呢,通过debug,是在如下的地方,
List-2 EmbeddedWebApplicationContext的selfInitialize方法
private void selfInitialize(ServletContext servletContext) throws ServletException {
prepareEmbeddedWebApplicationContext(servletContext);
registerApplicationScope(servletContext);
WebApplicationContextUtils.registerEnvironmentBeans(getBeanFactory(),
servletContext);
for (ServletContextInitializer beans : getServletContextInitializerBeans()) {
beans.onStartup(servletContext);
}
}
遍历所有的ServletContextInitializer,之后调用onStartup,并将ServletContext作为参数传递。
从图2可以看出,可以往ServletContext中加入Servlet和Listener,那是否有处理Servlet和Listener的RegistrationBean呢,我们再看源码,发现ServletRegistrationBean、ServletListenerRegistrationBean、DelegatingFilterProxyRegistrationBean,这三个都和FilterRegistrationBean在同一个package下。
(adsbygoogle = window.adsbygoogle || []).push({});