微服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:封装配置文件相关属性;