概述:
- 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的依赖时,不需要指定版本,因为有版本仓库
启动器:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
- 启动器:就是springboot的启动场景
- 比如spring-boot-starter-web,它就会帮我们自动导入所有依赖
springboot会将所有的功能场景,都变成一个个启动器。
主程序
```java //@SpringBootApplication 标注这是一个springboot的应用:启动类下的资源都导入 @SpringBootApplication public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
- 注解:
```java
@SpringBootConfiguration:springboot的配置
@Configuration : spring配置类
@Component :这也是spring的一个组件
@EnableAutoConfiguration:自动配置
@AutoConfigurationPackage :自动配置包
@Import({Registrar.class}):自动配置包'包注册'
@Import({AutoConfigurationImportSelector.class}):
//获取所有配置
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
点进getCandidateConfigurations
获取候选的配置:getSpringFactoriesLoaderFactoryClass()
获得标注了@EnableAutoConfiguration注解的类加载的所有组件,即获得主启动类加载的所有组件,然后SpringFactoriesLoader.loadFactoryNames
加载配置
进入loadFactoryNames方法中:
然后读取配置文件:META-INF/spring.factories
META-INF/spring.factories:自动配置的核心文件
结论: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语法
基本语法:
#普通的key-vaLue
name: qinjiang
#对象
student:
name: qinjiang
age: 3
#行内写法
student: {name: qinjiang,age: 3}
#数组
pets:
- cat
- dog
- pig
pets:[cat,dog,pig]
yaml强大之处:
可以给对象赋值
导入这个坐标就不会爆红
通过这个@ConfigurationProperties
注解可以绑定属性@ConfigurationProperties
作用:
将配置文件中配置的每一个属性的值,映射到这个组件中;
告诉springBoot将本类中的所有属性和配置文件中相关的配置进行绑定
参数 prefix = “person”:将配置文件中的person下面的所有属性—─对应
只有这个组件是容器中的组件,才能使用容器提供的@configurationProperties功能
也可以使用properties文件,然后通过@PropertySource注解指定,但比较笨,不够便捷
yaml中非常灵活,可以使用spel表达式用作占位符
输出:
yaml与properties对比:
松散绑定:
比如我的yaml中写的last-name,这个和代码中的lastName是一样的, - 后面跟着的字母默认是大写的,也就是-和我们的小写驼峰匹配。这就是松散绑定。
举个例子:
我们首先写个实体类
属性如下:
@Component
@ConfigurationProperties(prefix = "dog")
public class Dog {
private String theName;
private int age;
....
}
接着我们在yml中给属性赋值,以下两种都可以
dog:
the_name: 白
age: 5
dog:
the-name: 白
age: 5
JSR303校验
校验注解:@Validated