核心思想:约定大于配置

概述:

  • springboot框架封装了Spring,有内置tomcat
  • spirngboot创建核心容器对象是基于注解的方式
  • springboot针对大多数依赖都有对应的版本启动器
  • springboot通过maven构建,同时继承了一个父项目(版本仲裁中心)

Spring Boot的主要优点:

  • 快速创建独立运行的spring项目以及主流框架集成
  • 开箱即用,提供各种默认配置来简化项目配置
  • 内嵌式容器简化Web项目,应用无需打成WAR包
  • 没有冗余代码生成和XML配置的要求
  • 准生产环境的运行时应用监控
  • 与云计算的天然集成

    springboot自动装配跟@SpringBootApplication注解有关:

    如果是通过启动器导入进来的依赖,会交由springboot 自动装配实例到容器中
    如果是开发者自己开发的组件,则要遵循springBoot“约定大于配置”,把所有的组件放在被@SpringBootApplication修饰类的同包下或子包下。
    即给定了注解扫描的范围,不需要像spring那样在配置中指定扫描范围

自动装配:

pom.xml:

  • spring-boot-dependencies:核心依赖,在父工程中
  • 我们在写或者引入springboot的依赖时,不需要指定版本,因为有版本仓库

启动器:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter</artifactId>
  4. </dependency>
  • 启动器:就是springboot的启动场景
  • 比如spring-boot-starter-web,它就会帮我们自动导入所有依赖
  • springboot会将所有的功能场景,都变成一个个启动器。

    主程序

    ```java //@SpringBootApplication 标注这是一个springboot的应用:启动类下的资源都导入 @SpringBootApplication public class DemoApplication {

    public static void main(String[] args) {

    1. SpringApplication.run(DemoApplication.class, args);

    }

}

  1. - 注解:
  2. ```java
  3. @SpringBootConfiguration:springboot的配置
  4. @Configuration : spring配置类
  5. @Component :这也是spring的一个组件
  6. @EnableAutoConfiguration:自动配置
  7. @AutoConfigurationPackage :自动配置包
  8. @Import({Registrar.class}):自动配置包'包注册'
  9. @Import({AutoConfigurationImportSelector.class}):
  10. //获取所有配置
  11. List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);

点进getCandidateConfigurations
获取候选的配置:
image.png
getSpringFactoriesLoaderFactoryClass()获得标注了@EnableAutoConfiguration注解的类加载的所有组件,即获得主启动类加载的所有组件,然后SpringFactoriesLoader.loadFactoryNames加载配置

进入loadFactoryNames方法中:
image.png
然后读取配置文件:META-INF/spring.factories

META-INF/spring.factories:自动配置的核心文件
image.png
结论:springboot的所有自动配置都在启动类中被扫描并加载,‘spring.factories’所有的自动配置类都在这里面,但不一定生效,要判断条件是否成立,只有导入了starter才会生效。

1.springboot在启动的时候,从类路径下/META-INF/ spring.factories获取指定的值;
2.将这些自动配置的类导入容器,自动配置就会生效,帮我进行自动配置!
3.整合javaEE,解决方案和自动配置的东西都在spring-boot-autoconfigure-2.2.0.RELEASE.jar这个包下
4.它会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器;
5.容器中也会存在非常多的xxxAutoConfiguration的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有组件,并自动配置,免去了我们手动编写配置文件的工作。

SpringApplication.run分析

分析该方法主要分两部分,一部分是SpringApplication的实例化,二是run方法的执行;
SpringApplication
这个类主要做了以下四件事情
1.推断应用的类型是普通的项目还是Web项目
2.查找并加载所有可用初始化器,设置到initializers属性中
3.找出所有的应用程序监听器,设置到listeners属性中
4.推断并设置main方法的定义类,找到运行的主类

yaml语法

K:(空格)V
yaml对空格要求十分高

基本语法:

  1. #普通的key-vaLue
  2. name: qinjiang
  3. #对象
  4. student:
  5. name: qinjiang
  6. age: 3
  7. #行内写法
  8. student: {name: qinjiang,age: 3}
  9. #数组
  10. pets:
  11. - cat
  12. - dog
  13. - pig
  14. pets:[cat,dog,pig]

yaml强大之处:

可以给对象赋值
image.png
导入这个坐标就不会爆红
image.png
通过这个@ConfigurationProperties注解可以绑定属性
@ConfigurationProperties作用:
将配置文件中配置的每一个属性的值,映射到这个组件中;
告诉springBoot将本类中的所有属性和配置文件中相关的配置进行绑定
参数 prefix = “person”:将配置文件中的person下面的所有属性—─对应
只有这个组件是容器中的组件,才能使用容器提供的@configurationProperties功能

也可以使用properties文件,然后通过@PropertySource注解指定,但比较笨,不够便捷
image.png

yaml中非常灵活,可以使用spel表达式用作占位符
image.png
输出:
image.png

yaml与properties对比:

image.png

松散绑定:

比如我的yaml中写的last-name,这个和代码中的lastName是一样的, - 后面跟着的字母默认是大写的,也就是-和我们的小写驼峰匹配。这就是松散绑定。
举个例子:
我们首先写个实体类
属性如下:

  1. @Component
  2. @ConfigurationProperties(prefix = "dog")
  3. public class Dog {
  4. private String theName;
  5. private int age;
  6. ....
  7. }

接着我们在yml中给属性赋值,以下两种都可以

  1. dog:
  2. the_name:
  3. age: 5
  1. dog:
  2. the-name:
  3. age: 5

测试结果:
image.png

JSR303校验

校验注解:@Validated
image.pngimage.pngimage.png