spring自动扫描、DispatcherServlet初始化流程、spring控制器Controller 过程剖析

时间:2023-01-22 19:28:00

spring自动扫描
1、自动扫描解析器ComponentScanBeanDefinitionParser,从doScan开始扫描解析指定包路径下的类注解信息并注册到工厂容器中。
spring自动扫描、DispatcherServlet初始化流程、spring控制器Controller 过程剖析

2、进入后findCandidateComponents方法里面会扫描加载basePackage包路径下的所有.class的资源文件,找出符合的类(带有@Component类型注解的类)生成类定义信息。
注:@Controller、@Repository、@Service属于@Component,如不解查看源码便知
spring自动扫描、DispatcherServlet初始化流程、spring控制器Controller 过程剖析

DispatcherServlet初始化流程
1、初始化入口init()
2、initServletBean()
3、initWebApplicationContext()初始化容器
①初始化servlet级容器,注册bean定义信息   ②初始化装载bean信息(各类解析器、Controller映射信息)   ③将容器放入servletContext
spring自动扫描、DispatcherServlet初始化流程、spring控制器Controller 过程剖析

4、初始化装载bean信息
①初始化多媒体解析器(上传文件会使用到)  ②初始化Controller映射信息
spring自动扫描、DispatcherServlet初始化流程、spring控制器Controller 过程剖析

spring控制器Controller
1、spring控制器在servlet初始化时初始化(除Scope不是单例外),servlet初始化时会调用DispatcherServlet.initHandlerMappings初始化URI映射信息,映射信息handlerMap中保存了访问uri与处理类Controller的映射信息。
①Controller为单例直接映射到具体的对象信息  ②Controller非单例则保存beanName值
spring自动扫描、DispatcherServlet初始化流程、spring控制器Controller 过程剖析

2、扫描控制器Controller的配置信息必须放到初始化servlet的初始化配置文件中,原因是servlet在调用initHandlerMappings初始化URI映射信息时只会取servlet级容器中的类进行过滤提取,不会去父容器提取(多个servlet之间不会互相影响,起隔离作用)。
①提取servlet容器中所有的beanName  ②注册控制器Controller(带@Controller注解的类)映射
spring自动扫描、DispatcherServlet初始化流程、spring控制器Controller 过程剖析