示意图
简述
1. 通过@Bean将filter对象增加到bean容器中
2. Tomcat启动,servletContext执行初始化动作。通过查询beanType为Filter的对象,将其封装为FilterRegistrationBean,统一执行其onStartUp方法,实现将filter添加到servletContext中
3. 请求进入,创建filterChain,依次执行filter.
关键代码入口
1. 扫描所有符合条件的bean (filter,servlet),为其封装为RegistrationBean
org.springframework.boot.web.servlet.ServletContextInitializerBeans#addAdaptableBeans
2. org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext#selfInitialize 找到所有的ServletRegistrationBean对象,依次调用onStartup方法
3. filter注册到context org.springframework.boot.web.servlet.AbstractFilterRegistrationBean#addRegistration
4. ServletContextInitializerBeans 实现了AbstractCollection集合类,重写iterator方法。实际元素存储在ServletContextInitializerBeans#sortedList字段中