Spring Boot 原理解析


前言

本篇文章主要是看完Spring Boot 微服务项目之后开始写的一篇文章,主要是在学习Spring Boot 中的一些感悟,今天主要以Spring Boot中的原理来讲吧。


一、DemoApplication入口类

这里展示我的DemoApplication入口类:
在这里插入图片描述

@SpringBootApplication和main方法是Spring Boot自动生成的,其他注解都是我们在学习Spring Boot时整合其他技术添加上去的。接下来就和大家一起看看@SpringBootApplication和SpringApplication.run方法到底为我们做了些什么。

二、@SpringBootApplication的原理

@SpringBootApplication开启了Spring的组件扫描和Spring Boot自动配置功能。实际上它是一个复合注解,包含3个重要的注解:@SpringBootConfiguration、@ EnableAutoConfiguration、@ComponentScan,其源代码如下:
在这里插入图片描述

@SpringBootConfiguration注解:标明该类使用Spring基于Java的注解,SpringBoot推荐我们使用基于Java而不是XML的配置,查看@SpringBootConfiguration源代码,可以看到它对@Configuration进行了简单的“包装”,然后取名为SpringBootConfiguration。@SpringBootConfiguration源代码如下:
在这里插入图片描述

我们对@Configuration注解并不陌生,它就是JavaConfig形式的Spring IoC容器的配置类使用的@Configuration。
@EnableAutoConfiguration注解:该注解可以开启自动配置的功能。@EnableAutoConfiguration具体源代码如下:
在这里插入图片描述
从@EnableAutoConfiguration的源代码可以看出,其包含@Import注解。而我们知道,@Import注解的主要作用就是借助EnableAutoConfigurationImportSelector将Spring Boot应用所有符合条件的@Configuration配置都加载到当前Spring Boot创建并使用的Ioc容器中,Ioc容器就是我们所说的Spring应用程序上下文ApplicationContext。学习过Spring框架就知道,Spring框架提供了很多@Enable开头的注解定义,比如@EnableScheduling、@EnableCaching等。而这些@Enable开头的注解都有一个共同的功能,就是借助@Import的支持收集和注册特定场景相关的bean定义。

@ComponentScan注解:启动组件扫描,开发的组件或bean定义能被自动发现并注入Spring应用程序上下文。比如我们在控制层添加@Controller注解、在服务层添加@Service注解和@Component注解等,这些注解都可以被@ComponentScan注解扫描到。

1.SpringApplication的run方法

除了@SpringBootApplication注解外,我们发现了入口类的一个显眼的地方,那就是SpringApplication.run方法。在run方法中,首先创建一个SpringApplication对象实例,然后调用SpringApplication的run方法。SpringApplication.run方法的源代码如下:

public class SpringApplication {
/*部分代码省去*/
public ConfigurableApplicationContext run(String... args) {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        DefaultBootstrapContext bootstrapContext = this.createBootstrapContext();
        ConfigurableApplicationContext context = null;
        this.configureHeadlessProperty();
        SpringApplicationRunListeners listeners = this.getRunListeners(args);
        listeners.starting(bootstrapContext, this.mainApplicationClass);

        try {
            ApplicationArguments applicationArguments = new DefaultApplicationArguments(args);
            ConfigurableEnvironment environment = this.prepareEnvironment(listeners, bootstrapContext, applicationArguments);
            this.configureIgnoreBeanInfo(environment);
            Banner printedBanner = this.printBanner(environment);
            context = this.createApplicationContext();
            context.setApplicationStartup(this.applicationStartup);
            this.prepareContext(bootstrapContext, context, environment, listeners, applicationArguments, printedBanner);
            this.refreshContext(context);
            this.afterRefresh(context, applicationArguments);
            stopWatch.stop();
            if (this.logStartupInfo) {
                (new StartupInfoLogger(this.mainApplicationClass)).logStarted(this.getApplicationLog(), stopWatch);
            }

            listeners.started(context);
            this.callRunners(context, applicationArguments);
        } catch (Throwable var10) {
            this.handleRunFailure(context, var10, listeners);
            throw new IllegalStateException(var10);
        }

        try {
            listeners.running(context);
            return context;
        } catch (Throwable var9) {
            this.handleRunFailure(context, var9, (SpringApplicationRunListeners)null);
            throw new IllegalStateException(var9);
        }
    }
    }


}

里面大致是首先开启了一个监听器,然后就是通过createBootstrapContext创建上下文,最后通过上下文配置所需要的类和各种环境等。大致好像是这样的,这里我可能说的很不全面,有看到的小伙伴,可以留言交流嘛。

三. SpringApplication执行流程

在这里插入图片描述
1.首先启动时调入入口类DemoApplication的mian方法
2.在mian方法中调用静态方法run
3.创建SpringApplication实例,在对象实例中调用run方法
4.查询和加载监听器对象
5.创建和准备SpringBoot所需要的环境,包括配置文件等。
6.创建和初始化应用上下文ApplicationContext。这一步只是准备工作,并未开始正式创建。
7.Spring Boot会通过@EnableAutoConfiguration获取所有配置以及其他形式的Ioc容器配置,并加载到已经准备完毕的ApplicationContext。
8.调用ApplicationContextInitializer类的initialize方法对应用上下文进行设置和处理
9.刷新ApplicationContext,使Ioc容器达到可用状态。
10.查找当前ApplicationContext上下文是否注册ApplicationRunner与CommandLineRunner,如果有,循环遍历执行ApplicationRunner和CommandLineRunner的run方法。
11.执行SpringApplicationListener的finished方法,Spring Boot应用启动完毕。

总结

大致原理也就是这样了,后面我会继续更新关于spring-boot-starter原理,知识多数来自于书本上的东西,我只是简单整理了一下,关于本篇文章,主要参考来自于黄文毅先生的书《一步一步学SpringBoot 微项目实战(第二版)》。
关于书籍来源可以参考:https://huangwenyi.blog.csdn.net/

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在这个互联网时代,客服可以说必不可少,每个电商网站都应该有一个强大的智能客服对话系统,以满足用户沟通的需求。智能客服对话系统,不仅需要人工的沟通,同时结合人工智能实现智能对话,减少人工客服的成本,势在必行。基于SpringBoot+Python的多语言前后端智能多人聊天系统课程,将以基础知识为根基,带大家完成一个强大的智能客服系统,该系统将包含以下功能:智能对话机器人、单聊、群聊、消息撤回、上线、下线通知、用户动态信息实时提示等。即时通讯和人工智能,在未来的发展趋势,必然需要大批人才,掌握这两个技术势在必行。项目是一个真实可用的项目,商业价值不言而喻。也可以基于课程的基础上进一步完善和优化,所以价值是很高的。本课程包含的技术: 开发工具为:IDEA、WebStorm、PyCharmTensorflowRNNLSTMAnacondaSpringBoot SpringCloudWebsocketSTOMPDjangoVue+Nodejs+jQuery等 课程亮点: 1.与企业接轨、真实工业界产品2.从基础到案例,逐层深入,学完即用3.市场主流的前后端分离架构和人工智能应用结合开发4.多语言结合开发,满足多元化的需求5.涵盖TensorFlow1.x+TensorFlow2.x版本6.智能机器人实战7.即时通讯实战8.多Python环境切换9.微服务SpringBoot10.集成SpringCloud实现统一整合方案 11.全程代码实操,提供全部代码和资料 12.提供答疑和提供企业技术方案咨询 课程目录:第一章、Anaconda以及TensorFlow环境和使用0、智能多人聊天系统课程说明1、智能多人聊天系统之Anaconda讲解2、智能多人聊天系统之Anaconda安装和使用3、智能多人聊天系统之Anaconda之conda命令使用4、智能多人聊天系统之TensorFlow讲解5、智能多人聊天系统之TensorFlow安装和使用6、TensorFlow常量、变量和占位符实战讲解17、TensorFlow常量、变量和占位符实战讲解28、TensorFlow原理补充讲解9、TensorFlow四则运算实战讲10、TensorFlow矩阵操作以及运算实战讲解111、TensorFlow矩阵操作以及运算实战讲解212、TensorFlow均匀分布和正态分布数据实战讲解13、智能多人聊天系统之Numpy实战讲解14、智能多人聊天系统之matplotlib实战讲解15、TensorFlow深度学习DNN讲解16、TensorFlow常用Python扩展包讲解17、TensorFlow常用回归算法以及正则化讲解18、TensorFlow损失函数定义和使用实战讲解19、TensorFlow优化器讲解以及综合案例实战讲解20、智能多人聊天系统之RNN讲解21、智能多人聊天系统之RNN种类讲解22、智能多人聊天系统之RNN代码实战23、智能多人聊天系统之LSTM讲解24、智能多人聊天系统之attention机制讲解25、智能多人聊天系统之Django环境构建及初体验26、智能多人聊天系统之Django开发27、Python章节环境侯建和项目搭建28、Python TensorFlow读取训练数据代码编写29、Python TensorFlow形成语料编码30、Python TensorFlow保存字典文件31、Python TensorFlow构建词向量32、Python TensorFlow构建lstm模型以及attention wrapper33、Python TensorFlow训练代码编写34、Python整体代码讲解35、Python运用模型代码讲解36、SpringBoot讲解以及构建web应用37、Spring Cloud注册中心构建38、智能多人聊天系统之前端Vue项目构建39、SpringBoot+Websocket群聊40、SpringBoot+Websocket昵称群聊41、SpringBoot+Websocket群聊+单聊实战42、SpringBoot+Stomp单聊143、SpringBoot+Stomp单聊244、SpringBoot+Stomp单聊+群聊45、Django Web整合TF代码讲解及Postman调试46、智能客服系统单聊群聊等项目功能代码讲解147、智能客服系统单聊群聊等项目功能代码讲解248、智能客服系统集成机器人对话代码开发讲解49、智能机器人TensorFlow2版本升级实战之训练模型代码讲解50、智能机器人TensorFlow2版本升级实战之预测代码讲解 51、智能机器人TensorFlow2版本升级实战补充讲解

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值