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项目的方法:
- 在官网直接下载后,导入idea开发(https://start.spring.io/)
- 都弄好了点generate,然后会弹出一个zip文件,点下载,谷歌会自动下载
- 下载后解压,导入在idea中打开,打开后等一会idea在导依赖
- 这个类是程序的主入口,不能删也不能改,这个类本身就是spring的一个组件
- 这个是springboot的核心配置文件
- 包只能建在helloworldApplication同级目录下,不然运行不了
- 点进pom.xml文件首先看到
- 它有一个父项目,它的父项目是spring-boot-starter-parent,它的父项目是远程的,在线的
- 重点看依赖
- 这就是我们之前点击导入的spring web依赖
- 那这个依赖做了什么:
- 集成了一个tomcat
- 配置了dispatcherServlet
- 还有xml等等
- 直接使用idea创建一个springboot项目(一般开发直接在idea中创建)
- 点新建项目,选Spring Initializr 然后就和上面一样,写完后点下一步
- 选择你要导入的依赖,然后点完成
自动装配原理
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:自动配置的核心文件
从断言处我们已经可以发现一些端疑了,发现springboot去"META-INF/spring.factories"路径下寻找自动装配类。继续跟进SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass()方法,再跟进loadSpringFactories(classLoaderToUse)
终于看到了自动装配路径:"FACTORIES_RESOURCE_LOCATION"
接下来的逻辑就很清晰了,包META-INF下获取spring.factories配置文件,读取配置并返回自动装配列表。
通过断点调试,发现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加载到容器中,使自动装配类能够生效。