微服SpringBoot
一、SpringBoot简介
1.1 SpringBoot 解决Spring的缺点
基与约定大于配置。
1.2 SpringBoot 特点
- 可以快速入门
- 开箱即用,不用繁琐的xml配置
- 将非功能性特性(服务器tomcat,性能检测等),嵌入springBoot中
- 以功能为单位 导入相应依赖
微服务
Martin fowler的文章介绍。
- 是一种架构风格,开发一个应用时,是一组小型服务。可以通过Http的方式进行互通,多应用在各自运行的互联。
- 每一个功能元素最终都是一个可独立替换和升级的软件单元。
- 将功能单元微化独立出来,形成一个一个单独的功能模块,不同模块之间用轻量级的HTTP进行相互通信。最后行成一个类似与神经网络一样的结构,一个功能模块就是一个结点。
详细参照的中文文章: - https://martinfowler.com/microservices/
- https://www.jianshu.com/p/4821a29fa998
二、 SpringBoot原理分析
2.1 POM文件
2.1.1 父项目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.9.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
这是它的父项目;管理SpringBoot应用里面所有依赖版本
SpringBoot的版本仲裁中心;
以后我们导入依赖默认不需要写版本;(没有在父项目中的dependencies里面管理的依赖自然需要写版本号)
2.1.2 导入的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
spring-boot-starter-web:
Spring-boot 场景启动器:帮我们导入web模块正常运行所依赖的组件。
Spring Boot 将所有的功能场景都抽取出来,做成一个个starter ;只需要在项目里面引入这些starter相关场景的所有依赖都会导进来。用那个功能就导入那个场景。不需要写版本,Spring Boot会给我们适配。
2.2 主程序类,主入口
/**
* @SpringBootApplication 来标注这是一个主程序类,说明这是一个Spring Boot应用
* 说明这个类是SpringBoot的主配置类
*/
@SpringBootApplication
public class Springboot02Application {
public static void main(String[] args) {
SpringApplication.run(Springboot02Application.class, args);
}
@SpringBootConfiguration 说明这个类是SpringBoot的主配置类
等价与:
- @Configuration 配置类上来标注这个注解;
- 配置类: 配置文件;配置类也是容器中的一个组件;@Component
- @EnableAutoConfiguration 开启自动配置功能;
- 告诉SpringBoot开启自动配置,这样自动配置才能生效。
- @AutoConfigurationPackage:自动配置包
- @Import(AutoConfigurationPackages.Registrar.class)
这是SpringBoot的底层注解;
将主配置类(@SpringBootConfiguration标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器中。
- @Import({AutoConfigurationImportSelector.class}) 导入需要组件的选择器
会给容器中导入非常多的自动配置类;就是给容器中导入这个场景需要的所有组件,并配置好这些组件。
三、SpringBoot配置文件
1.配置文件
SpringBoot使用一个全局的配置文件;配置文件的名字是固定的。
- application.properties
- application.yml
配置文件的作用:
修改SpringBoot自动配置的默认值;SpringBoot底层已经帮我们配置好了。
四、SpringBoot自动配置的原理过程
1. SpringBoot启动时,通过加载主配置类
进入@SpringBootApplication注解中;开启自动配置功能;
@EnableAutoConfiguration
2. @EnableAutoConfiguration的作用:
- 进入@Import({AutoConfigurationImportSelector.class})注解;利用AutoConfigurationImportSelector选择器给容器导入一些组件;可以插入public String[] selectImports(AnnotationMetadata annotationMetadata) 方法中的内容。
- List configurations = this.getCandidateConfigurations(annotationMetadata, attributes);获取自动配置
- List configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
扫描所有jar类路径下:META-INF/spring.factories.
把扫描到的文件包装成properties对象
从propertis中获取EnableAutoConfiguration.class类对应的值,添加到容器中。
总结一句话
将类路径下,META-INF/spring.factories 里面配置的所有EnableAutoConfiguration的值加入到容器中
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoCon .CassandraAutoConfiguration,\
org.springframework.boot.autoconfigure.cloud.CloudServiceConnectorsAutoConfiguration
每一个这样的 xxAutoConfiguration类都是容器中的一个组件。都加入到容器中,用他们来进行自动配置;
3. 每一个自动配置类进行自动配置功能。
4. 所有在配置文件中能配置的属性都是在XXXXProperties类中封装着。配置文件能配置什么就可以参考某个功能对应的这个属性类
五、自动配置报告
自动配置类必须在一定的条件下才会生效:
查看有哪些自动配置类生效了;
在application.properties中添加下面配置
debug=true // 该属性让控制台打印自动配置报告
springBoot精髓:
1.springBoot启动会加载大量的自动配置类
2.我们看我们需要的功能有没有springBoot默认写好的自动配置类;
3.有我们再来看看这个自动配置类中配置那些组件;(只要有我们要用的组件。我们就不需要配置了);如果没有,我们需要自己写一个配置类,配置相应的组件。
4.给容器中自动配置类添加组件时,会从properties类中获取某些属性。我们可以在配置文件中指定这些属性的值。
xxxxAutoConfiguration:自动配置类;
给容器中添加组件(配置类的属性可取的值封装在下面的properties类中)
XXXXProperties:封装配置文件相关属性;