• 3.1_SpringBoot内部处理机制解析


    前言

    目前基于SpringBoot进行Web应用开发已经成为一个趋势,Spring官网内部的很多入门Demo都是基于SpringBoot的,因此掌握SpringBoot成为当下基于Java的Web开发的必备技能。

    SpringBoot相对于传统Servlet容器模式还是有几点颠覆性的改变的:

    1、SpringBoot应用程序使用jar来运行,而传统模式是打成war包部署到Servlet容器中。使用jar的模式有助于减轻运维人员的工作,更便于在Docker这种云平台的运行环境中使用;

    2、SpringBoot是应用启动容器,而传统模式是容器启动应用。这样SpringBoot的一个优势是程序本身管理了容器版本,业务代码与运行容器是直接绑定的;

    3、SpringBoot使用了大量的AutoConfig来进行探测和应用配置,使得代码配置很简单,但内部处理细节也被隐藏的很深。

    接下来我们将从一个简单的基于SpringBoot的Web工程开始,来探究SpringBoot的启动和加载过程,以便深入理解SpringBoot的内部工作机制。

    样例工程

    工程名称:sample-helloworld

    package:com.sample.helloworld

    main:SampleApplication

    controller:SampleController

    pojo:Greeting

    pom.xml

    parent使用spring-boot-starter-parent,依赖只有spring-boot-starter-web。

    spring-boot-starter-parent中定义了项目构建的一些定义,而他的parent——spring-boot-dependencies中定义了SpringBoot可能使用到的所有第三方依赖的版本。

    spring-boot-starter-web是一个pom工程,定义了一个web工程的基本依赖。

    SampleApplication:直接启动应用。

    SampleController:使用SpringMVC的RestController返回一个JSON对象。

    Greeting:定义一个简单的POJO来作为返回对象。

    最终效果是访问localhost:8080的时候,页面会展示一个JSON字符串。

    启动代码解析

    启动代码只有一行:SpringApplication.run(SampleApplication.class, args);

    1、SpringApplication的run方法内部是new了SpringApplication,构造函数中保存了SourceClass,获取了外部配置的ApplicationContextInitializer和ApplicationListener,来支持外部组件的初始化和事件监听器。这些外部的功能扩展功能的配置信息都定义在各个jar的/META-INF/spring.factories的配置文件中,Spring通过SpringFactoriesLoader可以加载到这些配置信息。

    2、执行SpringApplication实例的run方法。

      2.1、创建SpringApplication自己的SpringApplicationRunListener,其实是代理调用了加载进来的ApplicationListener。

      2.2、准备Environment,包括解析Properties文件、处理profile等。

      2.3、创建ApplicationContext,因为现在应用类型是Servlet,创建的是AnnotationConfigServletWebServerApplicationContext。

      2.4、对ApplicationContext进行配置,比如设置BeanNameGenerator、ResourceLoader等。然后加载资源,即解析传入的SourceClass来获取Bean定义。

      2.5、启动ApplicationContext,AnnotationConfigServletWebServerApplicationContext继承了SpringFrameWork本身提供的GenericWebApplicationContext提供的功能并进行了扩展,以支持配置并启动Embed Tomcat。

        2.5.1、对BeanFactory进行一些初始化配置。

        2.5.2、执行BeanFactoryPostProcessor,其中包括对BeanDefinition的进一步处理。最重要的是ConfigurationClassPostProcessor,用来解析处理所有@Configuration标签类,并将Bean定义注册到BeanFactory中。因为@SpringBootApplication中包含了@EnableAutoConfiguration的meta-annotation,会进行自动配置处理,基本原理是判断工程依赖了哪些第三方组件并对其进行自动化配置,这样处理完@Configuration标签后,BeanFactory中就已经有大量的Bean定义了。

        2.5.3、注册BeanPostProcessor,这些Processor会在首次getBean时执行。主要功能包括进行Autowire、Required等标签的处理,完成自动绑定等功能。也有特殊的关于WebServleterFactory的后续处理。

        2.5.4、在ApplicationContext的onRefresh方法中会对Web容器(Tomcat)进行配置,包括注册Servlet、Filter、Listener等。

        2.5.5、在ApplicationContext的finishRefresh方法中启动Web容器(Tomcat),完成应用的启动。

    后续将会在3.1.x章节继续对系统启动的各个关键点进行详细解析。

    3.1.1_Spring如何加载和解析@Configuration标签

  • 相关阅读:
    Httpd服务入门知识-Httpd服务常见配置案例之显示服务器版本信息
    破解CentOS7的root及加密grub修复实战
    Httpd服务入门知识-Httpd服务安装
    Httpd服务入门知识-http协议版本,工作机制及http服务器应用扫盲篇
    Linux操作系统-CentOS7启动流程和服务管理
    Socket网络编程-IO各种概念及多路复用
    Socket网络编程-SocketServer
    Socket网络编程-UDP编程
    Socket网络编程-TCP编程
    Linux操作系统内核编译之NTFS文件系统模块支持案例
  • 原文地址:https://www.cnblogs.com/jiaoqq/p/7677656.html
Copyright © 2020-2023  润新知