- 优点
- 使用嵌入式的Servlet容器,应用无需打包成WAR包
- starters自动依賴版本与控制版本
- 自动配置,简化开发,可修改默认值
- 无需配置XML,无代码生成开箱即用
- 准生产环境的运行时引用监控
- 与云计算天然集成
微服务(架构风格)
Martin fowler
一个小型服务是一组小型服务,通过HTTP沟通
单体应用:All In One,把所有功能放在单一进程中,优点是开发测试、部署简单
微服务:将每个功能元素发到一个独立的服务中,通过挂服务器分发服务进行扩展
快速构建应用->spring boot
网站互联互调->spring cloud
- 学习环境
- jdk1.8
- maven3.x
- IDEA2017
- SpringBoot 1.5.9.RELEASE
- 创建maven项目
- 引入starters
- 创建主程序
- 启动运行
管理springboot应用里面的所有依賴版本,默认不需要写版本
父项目:版本仲裁中心,没有在dependencies里面管理的依賴自然需要声明版本号
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
导入的依賴
spring-boot-starter:spring-boot场景启动器,帮我们导入了web模块正常运行所依賴的组件
Spring Boot将所有的功能常见抽取出来,做成一个个starters(启动器),只需要在项目里面引入这些starter相关场景相关依賴导入
主程序类,主入口类
- @SpringBootApplication标注一个主程序类、主配置类,说明这是一个Spring Boot应用
他是组合注解- @SpringBootConfiguration:Spring Boot的配置类
- 标注在某个类上,表示类上是一个Spring Boot的配置类
- @Configuration:配置类上来标注这个注解
- 配置类—配置文件;配置类也是容器中的一个组件@Componetn
- @EnableAutoConfiguration:告诉springboot开启自动配置功能
- @AutoConfigurationPackage:自动配置包
- @Import(AutoConfigurationPackage.Registrar.class)给容器导入组件
- 将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中
- 会给容器中导入非常多的自动配置类(xxAutoConfiguration),就是给容器中导入这个场景需要的所有组件,并配置好这些组件
- Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作
将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器
J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar
Spring Boot配置
- 配置文件,配置文件名是固定的
- application.properties
- application.yml
作用:修改SpringBoot自动配置的默认值
加载顺序
配置原理
YAML
(YAML Ain‘t Markup Language)是一个标志语言
- YAML基本语法
- 使用缩进表示层级关系
- 缩进时不允许使用tab键,只允许使用空格,空格的缩进控制层级关系
- 缩进的空格数目不重要,只要相同层级的元素左对齐即可
- 大小写敏感
- 支持的三种数据结构
- 对象:键值对的组合、(Map、对象)
friends: {lastName:zhangsan,age:18}
- 数组:一组按次序排列的值、(List、Set)
- 用-值表示数组中的
pets: - cat - dog - pig 行内写法: pets:[cat,dog,pig]
- 字面量:单个的、不可再分的值(数字、字符串、布尔),字符串默认不用加上单引号或双引号
- “”:双引号,不会转义字符里面的特殊字符,特殊字符会表示的意思
- ‘’:单引号,会转义特殊字符,特殊字符最终只是一个普通的字符串数据
key:(空格)value
配置文件值注入
- 在bean文件中添加注解@ConfigurationProperties(prefix=“person即yml的数据”)
- 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
- 配置文件中哪个下面的所有属性进行一一映射
- 在pom.xml导入配置文件处理器,配置文件进行绑定就会有提示
作用:生成配置文件的元数据信息
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<scope>true</scope>
</dependency>
只有这个组件时容器中的组件才能提供@ConfigurationProperties功能
当输出乱码时的解决方法:
setting->File Encodings
@value("${person.last-name}")获取值
相当于
<bean class="Person">
<property name="lastName" value="字面量/${key}从环境配置、配置文件获取值/#{SpEL}"></property >
</bean>
@ConfigurationProperties
- 与@Bean结合为属性赋值、默认从全局配置文件中获取值
- @PropertySource(只能用于properties文件)结合读取指定文件:加载指定文件
- @Validated进行文件值校验,@NotNull、@Valid
- @ImportResource:导入Spring的配置文件,让配置文件里面的内容生效
@ImportResource(locations={"classpath:beans.xml"})
导入Spring的配置文件让其生效
区别
@ConfigurationProperties | @value | |
---|---|---|
功能 | 批量注入配置文件中的属性 | 一个个指定 |
松散绑定(松散语法) | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂类型封装 | 支持 | 不支持 |
应用场景:
- 只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value
- 专门编写一个javaBean和配置文件进行映射,直接使用@ConfigurationProperties
== 什么是松散绑定==
属性名匹配规则
- person.firstName:使用标准方式
- person.first-name:大写用-
- person.first_name:大写用_
- PERSON_FIRST_NAME:推荐系统属性使用这种写法
SpringBoot推荐给容器中添加组件的方式,使用全注解方式
@Bean:将方法的返回值添加到容器中,容器中的组件默认的id就是方法名
配置文件占位符
RandomValuePropertySource:配置文件中可以使用随机数
r
a
n
d
o
m
.
v
a
l
u
e
、
{random.value}、
random.value、{random.int}、
r
a
n
d
o
m
.
v
a
l
u
e
、
{random.value}、
random.value、{random.long}、
r
a
n
d
o
m
.
i
n
t
(
10
)
、
{random.int(10)}、
random.int(10)、{random.int[1024,65536]}
- 在配置文件中引用前面配置过的属性(优先级前面配置过的这里能用)
- ${app.name:默认值}来指定找不到属性的默认值
Profile
Spring随不同环境不同配置功能的支持,可以通过激活、指定参数等方式快速切换环境
- 多profile文件形式
- 格式:
application-{profile}.properties/yml
- application-dev.properties、application-prod.properties
- 多profile文档块模式:yml文件用—分成不同文档块,在用
spring:profiles:dev
指定属于开发环境或spring:profiles:active:dev
激活开发环境 - 激活方式
- 命令行: java -jar jar包的名字 --spring.profiles.active = dev
- 配置文件:在配置文件中指定 spring.profiles.active = dev
- jvm参数: -Dspring.profiles.active = dev
配置文件加载位置
- spring boot启动会扫描以下位置的application.properties或application.yml文件作为Spring boot的默认配置文件
- 根目录:file:./config/
- file:./
- classpath:/config/
- classpath:/
以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容
SpringBoot会从这四个位置全部加载主配置文件,互补配置
server.port=8081
#配置项目的访问路径
server.context-path=/boot02
通过spring.config.location
来改变默认配置,项目打包好之后使用命令行参数的形式,启动项目时指定配置文件的新位置;指定配置文件和默认加载的配置文件共同起作用形成互补配置
外部配置加载顺序
-
命令行参数
所有的配置都可以在命令行上进行指定
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
多个配置用空格分开; --配置项=值 -
来自java:comp/env的JNDI属性
-
Java系统属性(System.getProperties())
-
操作系统环境变量
-
RandomValuePropertySource配置的random.*属性值
由jar包外向jar包内进行寻找; 优先加载带profile
-
jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
-
jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
再来加载不带profile -
jar包外部的application.properties或application.yml(不带spring.profile)配置文件
-
jar包内部的application.properties或application.yml(不带spring.profile)配置文件
总结:优先加载带profile,再加载不带profile。由jar包外向jar包内寻找。会先加载项目打包后的jar包统一目录下的配置文件
11. @Configuration注解类上的@PropertySource
12. 通过SpringApplication.setDefaultProperties指定的默认属性
所有支持的配置加载来源;
优先级从高到低
自动配置原理
配置文件能写什么?怎么写?
- 查看HttpEncodingAutoConfiguration
- 通用模式
- xxxAutoConfiguration:自动配置类
- xxxProperties:属性配置类
- yml/properties文件中能配置的值来源于[属性配置类]
- 几个重要注解
- @Bean
- @Conditional
- –debug查看详细的自动配置报告
原理:1.从main方法启动,加载springboot配置类,开启自动配置功能
@EnableAutoConfiguration
将类路径下META-INF/spring.factories里面配置的所有EnableAutoConfiguration的值加入到容器中
HttpEncodingAutoConfiguration
所有配置文件中配置的属性都在xxxProperties类中封装着。配置文件能配置什么可以参照这个功能对应的属性类
HttpEncodingAutoConfiguration(Http编码自动配置
根据不同条件判断,决定这个配置类是否生效?
@Configuration // 配置类
@EnableConfigurationProperties(HttpEncodingProperties.class) // 开启属性注入,启动指定类
ConfigurationProperties功能:将配置文件中对应的值和HttpE能从订货Properties绑定起来
HttpEncodingProperties加入到ioc容器中
spring.http.encoding.enabled=true
spring.http.encoding.cahrset=utf-8
spring.http.encoding.force=true
@ConditionalOnWebApplication //Spring底层@Configuration注解,根据不同的条件,如果满足指定条件,整个配置类里面的配置生效,判断当前应用是否是web应用,如果是当前配置类生效
@ConditionalOnClass(CharacterEncodingFilter.class) // 判断当前项目有没有这个类
CharacterEncodingFilter:SpringMVC中进行乱码解决的过滤器
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)// 当设置spring.http.encoding=enabled的情况下,如果没有设置默认是true,即符合条件。判断配置文件中是否存在某个配置"spring.http.encoding.enabled,及时不配置也是默认生效的
@Bean给容器中添加一个组件,这个组件的某些值需要从properties中获取
一旦这个配置类生效,配置类就会给容器添加各种组件,这些组件的属性是从对应的properties类中回去的,这些类里面的每个属性又是和配置文件绑定的
springboot的配置原理总结
1)、SpringBoot启动会加载大量的自动配置类
2)、按需求看SpringBoot默认写好的
3)、自动配置类中到底配置了哪些组件
4)、给容器中自动配置类添加组件时,会从properties类中获取某些属性,可在配置文件中指定属性的值
xxxAutoConfiguration:自动配置类
给容器中添加组件
xxxProperties:封装配置中的相关属性
@Conditional(OnClassCondition.class):判断条件