一、WebApplicationInitializer
实现原理:
org.springframework.web.SpringServletContainerInitializer
实现了javax.servlet.ServletContainerInitializer
接口,在Servlet容器启动的时候,会自动探测WebApplicationInitializer
的实现类,执行其onStartup
方法。
二、ServletContextInitializer
springboot提供了ServletContextInitializer
接口,用于程序化、动态配置ServletContext中的接口。
注意:这些实现类Bean是Spring管理的,而非Servlet容器管理的。
作用: 可以在运行时,动态地往ServletContext容器中注册Servlet,Filter,动态配置Filter、Servlet属性等。
和WebApplicationInitializer
不同的地方是:这些ServletContextInitializer
实例不会被SpringServletContainerInitializer
检测,因此不会随着Servlet容器启动,而是在ServletContextInitializer#onStartup
接口调用的地方执行初始化。
三、反思
思考🤔:为什么有了WebApplicationInitializer,还要再搞一个ServletContextInitializer
总结:WebApplicationInitializer是spring提供的API,它的生命周期受第三方Servlet容器控制。(在Servlet容器启动时回调)。
ServletContextInitializer是springboot基于嵌入式容器,提供的API,其生命周期是springboot自身控制的,使得springboot更加内聚。