springboot run方法初始化,spring 初始化,以及bean的生命周期。mvc的初始化以及生命周期
发布日期:2021-06-30 20:00:12 浏览次数:4 分类:技术文章

本文共 4283 字,大约阅读时间需要 14 分钟。

注意:l懒加载的bean初始化 只是创建BeanDefinition。实例化在BeanFactory.getBean()的时候才会产生bean

springboot run方法初始化

 

主要根据main方法和自动配置文件META-INF/spring.factories 中的相关配置类进行自动化化加载初始化等操作。

注册监事件听器。

初始化容器上下文Context。

解析@ComponentScan扫描Bean定义生成BeanDefinition、BeanDefinitionRegistry 把BeanDefinition注册到BeanFactory。

spring 初始化

1、ResourceLoader从存储介质中加载Spring配置信息,并使用Resource表示这个配置文件的资源;

2、BeanDefinitionReader读取Resource所指向的配置文件资源,然后解析配置文件。配置文件中每一个解析成一个BeanDefinition对象,并保存到BeanDefinitionRegistry中;

3、容器扫描BeanDefinitionRegistry中的BeanDefinition,使用Java的反射机制自动识别出Bean工厂后处理后器(实现BeanFactoryPostProcessor接口)的Bean,然后调用这些Bean工厂后处理器对BeanDefinitionRegistry中的BeanDefinition进行加工处理。主要完成以下两项工作:

1)对使用到占位符的元素标签进行解析,得到最终的配置值,这意味对一些半成品式的BeanDefinition对象进行加工处理并得到成品的BeanDefinition对象;

2)对BeanDefinitionRegistry中的BeanDefinition进行扫描,通过Java反射机制找出所有属性编辑器的Bean(实现java.beans.PropertyEditor接口的Bean),并自动将它们注册到Spring容器的属性编辑器注册表中(PropertyEditorRegistry);

 

参考:https://blog.csdn.net/qq_39632561/article/details/83070140

 

bean的生命周期(实例化-》消亡)

一、生命周期流程图:

  Spring Bean的完整生命周期从创建Spring容器开始,直到最终Spring容器销毁Bean,这其中包含了一系列关键点。

 

若容器注册了以上各种接口,程序那么将会按照以上的流程进行。

 

二、各种接口方法分类

Bean的完整生命周期经历了各种方法调用,这些方法可以划分为以下几类:

1、Bean自身的方法  :  这个包括了Bean本身调用的方法和通过配置文件中<bean>的init-method和destroy-method指定的方法

2、Bean级生命周期接口方法  :  这个包括了BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean这些接口的方法

3、容器级生命周期接口方法  :  这个包括了InstantiationAwareBeanPostProcessor 和 BeanPostProcessor 这两个接口实现,一般称它们的实现类为“后处理器”。

4、工厂后处理器接口方法  :  这个包括了AspectJWeavingEnabler, ConfigurationClassPostProcessor, CustomAutowireConfigurer等等非常有用的工厂后处理器  接口的方法。工厂后处理器也是容器级的。在应用上下文装配配置文件之后立即调用。

参考:

mvc的初始化

在分析DispatcherServlet之前,我们先看下DispatcherServlet的继承关系 

这里写图片描述

 

springmvc是主流的MVC框架,我先从使用开始一步一步解析其初始化过程,springmvc的核心是DispatcherServlet,它是前端控制器,负责拦截客户端发过来的请求,然后解析请求进行分发。 

DispatcherServlet是基于Servlet的,所以使用springmvc先在web.xml中配置DispatcherServlet

这里写图片描述

个人认为初始化分为两部分:

一是 DispatcherServlet的initstrategies方法中各种组件初始化

二是 Controller中Requestmapping方法与地址建立映射对象的 初始化。

 1. DispatcherServlet的initstrategies方法初始化各种组件

下面是DispatcherServlet的initstrategies方法初始化流程

clipboard.png

 注意:如果启动时没有主动触发ContextRefreshedEvent事件,则在第一次访问后台地址并进入DispatchServlet时会进行初始化调用initstrategies方法。

如何触发initstrategies方法初始化:

(1)触发ContextRefreshedEvent事件

(2)web容器启动调用DispatchServlet(继承自父类HttpServlet)的init方法-》initServletBean->org.springframework.web.servlet.FrameworkServlet类中initWebApplicationContext-(判断onApplicationEvent事件是否执行过,如果没执行则开始初始化调用initstrategies,否则不调用initstrategies)>initstrategies-》执行各种组件的初始化。

 

 

 

 

  • MultipartResolver:文件解析器,用于支持服务器的文件上传;
  • LocaleResolver:国际化解析器,用来提供国际化功能;
  • ThemeResolver:主题解析器,用来提供皮肤主题功能;
  • HandlerMapping:映射URI和处理器,使控制器得以运行;
  • HandlerAdapter:处理器适配器,为不同的处理器提供上下文运行环境;
  • HandlerExceptionResolver:处理器异常解析器,用来解析处理器产生的异常;
  • RequestToViewNameTranslator:视图逻辑名称转换器,根据逻辑视图的名称找到具体的视图。注意⚠️:当处理器没有返回逻辑视图名时,将请求的URL自动映射为逻辑视图名;
  • ViewResolver:视图解析器,当控制器返回后,通过试图解析器会把逻辑视图名进行,从而定位实际视图;

在WEB容器启动的时候,Spring MVC就会初始化上面的这些组件,所以我们不需要对他们进行配置就可以用了。

 

2. Controller 映射路径初始化

会把url路径与RequestMapping映射相关信息保存起来:

(1)在容器启动过程中,由于controller不是懒加载,会直接进行实例化bean。

(2)在实例化bean的过程中,由于RequestMappingHandlerMapping 的父类AbstractHandlerMethodMapping类实现了InitializingBean,在执行init-method前会执行afterPropertiesSet方法,在此方法中会执行initHandlerMethods->detectHandlerMethods()->开始把路径与bean及方法映射关系注册到MappingRegistry中。后面请求后台的时候会根据路径拿到对应的方法执行。

以下是代码具体分析:

(1)AbstractHandlerMethodMapping类中

 (2)追送registerHandlerMethod方法,发现最终映射关系会注册到MappingRegistry对象。

(3)继续回到detectHandlerMethods方法,追踪如何获得 带有RequestMapping注解的方法。

可以看到,遍历当前类的所有方法,过滤掉没有RequestMapping注解的方法。

判断是否带有RequestMapping注解的方法,不带的话返回null。

 

mvc的生命周期

自己总结:

DispatcherServlet(D)-》D父类FrameworkServlet-service()-》如果是PATCH或者httpMethod 请求父类HttpServlet-service(doget,doPost),如果不是调用processRequest()-》doService()-》DispatcherServle的doDispatch()->HandlerMapping(xml,注解)根据请求的路径获得HandlerExecutionChain,封装了此路径的Controller和拦截器链。-》交由对应的handlerAdpter(http,继承Controller,注解)处理-》返回modelAdnView,-》ViewResolver-》View 

(1)进入入口doDispatch()方法

(2)追踪获得mappedhandler的方法 

(3)追送getHandlerInternal(),此方法根据请求路径获得对应的Controller中的方法

 

(4)追踪(2)中的getHandlerExecutionChain方法,通过请求的url获得 拦截器链

 

 (5)继续回到(2)最终获得的mappedhandler对象 

Servlet的作用:

  1. HttpServletBean 

      主要做一些初始化的工作,将web.xml中配置的参数设置到Servlet中。比如servlet标签的子标签init-param标签中配置的参数。

  2. FrameworkServlet 

      将Servlet与Spring容器上下文关联。其实也就是初始化FrameworkServlet的属性webApplicationContext,这个属性代表SpringMVC上下文,它有个父类上下文,既web.xml中配置的ContextLoaderListener监听器初始化的容器上下文。

  3. DispatcherServlet 

      初始化各个功能的实现类。比如异常处理、视图处理、请求映射处理等。

参考:

转载地址:https://liuhuiyao.blog.csdn.net/article/details/106963152 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:关于spring bean 生命周期代码详解-产生到消亡
下一篇:springboot的初始化启动过程

发表评论

最新留言

留言是一种美德,欢迎回访!
[***.207.175.100]2024年04月13日 03时56分35秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章