Springboot整合SpringMVC来完成自动配置原理解析之初始化Spring容器,servlet容器

 Springboot整合SpringMVC来完成自动配置原理解析

 1.@SpringBootApplication注解 ->@EnableAutoConfigure注解->上面有个@Import(AutoConfigurationImportSelector.class)

2. 这个@import - SpringMVC,SpringMybatis整合都用到了它。这个是Spring的扩展点之一。

springboot这里AutoConfigurationImportSelector 是ImportSelector的一个实现类,只要你实现了这个类,spring就会把 selectImports方法里面返回的String[] - 类的全限定名注册到Spring容器中。

3.selectImports 方法里面会把配置在 META-INF/spring.factories 的所有的类扫描出来封装到这个String[]里面,也就是说这些类会全被被注册到Spring容器中 - 这是Springboot 自动配置的核心所在

4.这些类里面就有一个关于springMVC DispatcherServlet的处理类DispatcherServletRegistrationBean

5.这个类里面有两个重要的方法,一个是@Bean的方式把DispatcherServlet注册到Spring 容器中,

这里请注意,SpringMVC是把Spring容器注入到DispatcherServlet中的(new DispatcherServlet(applicationContext)), 第二个是通过@Bean方式注册了DispatcherServletRegistrationBean,这个类非常重要,通过他的类结构图发现他竟然是ServletContextInitailizer(servlet3.0规范)的一个实现类,(这里补充一下只是,SpringMvc 是通过这个类的实现类SpringServletContextInitializer 来完成Spring容器,和DispatcherServlet初始化的来解决0配置)

6.所以在tomcat启动的时候会调用他实现类的onstartup方法 - 设置DispatcherServlet的拦截方式(/*),onStartUp(1),把DispatcherServlet 放入serverletContext这些都是由他和他的父类完成的。细节可以看源码。

7.但是这里你会发现第5步注册到spring容器的是一个new DispatcherServlet()是没有Spring容器作为参数的,懂SpringMvc的原理会知道,DispatcherServlet servlet =new DispatcherServlet(ac); 当时创建DispatcherServlet对象是调用了他的有参构造方法传入Spring容器的,然后在把DispatcherServlet 放入到servletContext(servlet容器),那Springboot这里是怎么做的呢?怎么把我们的spring容器注入到DispatcherServlet 呢? 

8. 这里也是Spring的扩展点之一,通过看DispatcherServlet类结构图可以发现他的父类FrameworkServlet 竟然是ApplicationContextAware的一个实现类,懂Spring bean的生命周期的就会知道,一个Bean实例化过程中会调用各种aware的实现类,所以第5部注册到Spring容器的DispatcherServlet(一个bean)实例化过程中会调用ApplicationContextAware 的实现类的setApplicationContext(ApplicationContext var1) - 把当前spring容器注入到这个实现类中(也就是Dispactherservlet),这里也说明了为什么在第5步把DispatcherServlet注册到Spring容器中,让他走Spring的bean的生命周期。首尾呼应!

你可能感兴趣的:(Springboot整合SpringMVC来完成自动配置原理解析之初始化Spring容器,servlet容器)