springBoot(1)

什么是springBoot

​ 就是一个javaweb的开发框架,和SpringMVC类似,对比其他javaweb框架的好处,官方说是简化开发,约定大于配置, you can "just run",能迅速的开发web应用,几行代码开发一个http接口。

​ Spring Boot 基于 Spring 开发,Spirng Boot 本身并不提供 Spring 框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。也就是说,它并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具。

​ 简单来说就是SpringBoot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架 。

Spring Boot的主要优点:

  • 为所有Spring开发者更快的入门
  • 开箱即用,提供各种默认配置来简化项目配置
  • 内嵌式容器简化Web项目
  • 没有冗余代码生成和XML配置的要求

什么是微服务

​ 微服务是一种架构风格,它要求我们在开发一个应用的时候,这个应用必须建成一系列小服务的组合;可以通过http(rpc)的方式进行互通。要说微服务架构,先得说说过去我们的单体应用架构。

单体应用架构

​ 所谓单体应用架构(all in one)是指,我们将一个应用中的所有应用服务都封装在一个应用中。

​ 无论是ERP、CRM或是其他什么系统,你都把数据库访问,web访问,等等各个功能放到一个wer包内。

  • 这样做的好处是,易于开发和测试;也十分方便部署;当需要扩展时,只需要将war复制多份,然后放到多个服务器上,再做个负载均衡就可以了
  • 单体应用架构的缺点是,哪怕我要修改一个非常小的地方,我都需要停掉整个服务,重新打包、部署这个应用war包。特别是对于一个大型应用,我们不可能把所有内容都放在一个应用里,我们如何维护、如何分工合作都是问题

微服务架构

​ all in one的架构方式,我们把所有的功能单元放在一个应用里面。然后我们把整个应用部署到服务器上。如果负载能力不行,我们将整个应用进行水平复制,进行扩展,然后负载均衡。

​ 所谓微服务架构,就打破之前all in one 的架构方式,把每个功能元素独立出来。把独立出来的功能元素动态的组合,需要的功能元素才去拿来组合,需要多一些时可以整合多个功能元素。所以微服务架构时对功能元素进行复制,而没有对整个应用进行复制。

​ 这样做的好处时:

  • 节省了调用资源
  • 每个功能元素的服务都是一个可替换的、可独立升级的软件代码。

如何构建服务

​ 一个大型系统的微服务架构,就像一个复 杂交织的神经网络,每一个神经元就是一个功能元素, 它们各自完成自己的功能,然后通过http相互请求调用。比如一个电商系统、查缓存、连数据库、浏览页面、结账、支付等服务都是一个个独立的功能服务,都被微化了,它们作为一个个微服务共同构建了一个庞大的系统。如果修改其中的一个功能,只需要更新升级其中一个功能服务单元即可。

但是这种庞大的系统架构给部署和运维带来很大的难度。于是,spring为我们带来了构建大型分布式微服务的全套、全程产品:

  • 构建一个个功能独立的微服务应用单元,可以使用springboot,可以帮我们快速构建一 个应用:
  • 大型分布式网络服务的调用,这部分由spring cloud来完成,实现分布式; .
  • 在分布式中间,进行流式数据计算、批处理,我们有spring cloud data flow。

  • spring为我们想清楚了整个从开始构建应用到大型分布式应用全流程方案。

Hello,World

创建springboot项目的方法:

  1. 在官网直接下载后,导入idea开发(https://start.spring.io/)
    1. 无标题
    2. 都弄好了点generate,然后会弹出一个zip文件,点下载,谷歌会自动下载
    3. 下载后解压,导入在idea中打开,打开后等一会idea在导依赖
    4. image-20210520095515212
    5. 这个类是程序的主入口,不能删也不能改,这个类本身就是spring的一个组件
    6. image-20210520095750845
    7. 这个是springboot的核心配置文件
    8. image-20210520100717859
    9. 包只能建在helloworldApplication同级目录下,不然运行不了
    10. image-20210520100949030
    11. image-20210520100914059
    12. 点进pom.xml文件首先看到image-20210520101314373
    13. 它有一个父项目,它的父项目是spring-boot-starter-parent,它的父项目是远程的,在线的
    14. 重点看依赖image-20210520101543051
    15. 这就是我们之前点击导入的spring web依赖
    16. 那这个依赖做了什么:
      1. 集成了一个tomcat
      2. 配置了dispatcherServlet
      3. 还有xml等等
  2. 直接使用idea创建一个springboot项目(一般开发直接在idea中创建)
    1. image-20210520164703393
    2. 点新建项目,选Spring Initializr 然后就和上面一样,写完后点下一步
    3. image-20210520164843405
    4. 选择你要导入的依赖,然后点完成

自动装配原理

pom.xml

  • spring-boot-starter-parent:核心依赖在父工程中
  • 我们在写或引入一些springboot依赖的时候,不需要指定版本,就是因为有这些版本仓库

启动器

  • <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    
  • 启动器:说白了就是springboot的启动场景

  • 比如spring-boot-starter-web,它就会帮我们自动导入web环境所有的依赖!

  • springboot会将所有的功能场景,都变成一个个的启动器

  • 我们要使用什么功能,就只需要找到对应的启动器就可以了starter

主程序

//这个注解是标注这个类是个springboot的应用:启动类下的所有资源被导入
@SpringBootApplication
public class Springboot01Application {

    public static void main(String[] args) {
        //这个是将springboot应用启动
        SpringApplication.run(Springboot01Application.class, args);
    }

}

@SpringBootApplication中的注解

@SpringBootConfiguration:springboot的配置
	@Configuration:spring配置类
    	@Component:说明这也是一个spring的组件
    
@EnableAutoConfiguration:自动配置
    @AutoConfigurationPackage:自动配置包
    	@Import({Registrar.class}):自动配置'包结构'
    @Import({AutoConfigurationImportSelector.class}):自动配置导入选择
    	//获取所有的配置
    	 List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes)

获取候选的配置

protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
    List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
    Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
    return configurations;
}

META-INF/spring.factories:自动配置的核心文件

image-20210521112744453

从断言处我们已经可以发现一些端疑了,发现springboot去"META-INF/spring.factories"路径下寻找自动装配类。继续跟进SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass()方法,再跟进loadSpringFactories(classLoaderToUse)

img

img

终于看到了自动装配路径:"FACTORIES_RESOURCE_LOCATION"

img

接下来的逻辑就很清晰了,包META-INF下获取spring.factories配置文件,读取配置并返回自动装配列表。

img

通过断点调试,发现Springboot会从spring-boot.jar、spring-breans.jar、spring-boot-autoconfiguration三个包下的"META-INF/spring.factories"读取默认配置。同时我们也可以设想,将第三方starter加入springboot自动装配也是相同的道理,只要将自己的XXautoconfiguration类写到自己包"META-INF"路径下spring.factories文件中即可。

总结

Spring Boot 在启动时除了扫描与启动类同一包下的组件之外,还会检查各个 jar 包中是否存在 META-INF/spring.factories 文件,为自动装配做准备。
第三方的 spring-boot-starter 会通过将自己的自动装配类写到 META-INF/spring.factories 中让Spring Boot加载到容器中,使自动装配类能够生效。

posted on 2021-05-23 21:17  吃草的青牛  阅读(26)  评论(0编辑  收藏  举报