目录
- 一、入门
- 1、Spring Boot简介
- 2、微服务
- 3、环境准备
- 4、SpringBoot HelloWorld
- 5、Hello World探究
- 6、使用Spring Initializer快速创建SpringBoot项目
- 二、配置文件
- 1、配置文件
- 2、YAML语法
- 3、配置文件的注入
- 4、配置文件占位符
- 5、Profile
- 6、配置文件加载位置
- 7、外部配置加载顺序
- 8、自动配置原理
一、入门
1、Spring Boot简介
简化Spring应用开发的一个框架
整个Spring技术栈的整合
J2EE开发的一站式解决方案
2、微服务
Martin Fowler
微服务是一种架构风格
一个应用应该是一组小型服务:可以通过HTTP的方式进行互通
每一个功能元素最终都是一个可独立替换和独立升级的软件单元
详细参照微服务文档
3、环境准备
- jdk1.8
- maven3.x
- IntellijIDEA2019
- SpringBoot 2.1.6.RELEASE
Maven设置
给maven的setting.xml配置文件的profiles标签添加jdk相关profile
4、SpringBoot HelloWorld
一个功能:浏览器发送hello请求,服务器接受请求并处理,响应Hello World字符串;
1、创建一个,maven工程;
2、导入依赖spring boot相关依赖
3、编写一个主程序:启动Spring Boot应用
4、编写相关的Controller、Service
5、运行主程序测试
6、简化部署
加入插件spring.boot.maven.plugin,将应用打成jar包,直接使用java -jar的命令进行执行;
5、Hello World探究
- POM文件
父项目
spring.boot.starter.parent
其父项目
spring.boot.dependencies 管理SpringBoot中的所有依赖
spring-boot-starter-web
spring-boot-starter:spring-boot场景启动器:导入web模块正常运行所依赖的组件
需要什么功能就导入相应的场景启动器
- 主程序类,主入口类
@SpringBootApplication
标注在某个类上,表示是一个SpringBoot的主配置类,SpringBoot运行这个类的main方法来启动SpringBoot应用;
@SpringBootConfiguration :SpringBoot的配置类
标注在某个类上,表示是一个SpringBoot的主配置类
@Configuration:配置类上标注这个注解
配置类=配置文件,配置类也是容器中的一个组件@Component
@EnableAutoConfiguration :开启自动配置功能
@AutoConfigurationPackage:自动配置包
@Import(AutoConfigurationPackages.Registrar.class):将著配置类所在包及下面所有子包里面的所有组件扫描到Spring容器;
@Import(EnableAutoConfigurationImportSelector.class):将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器当中;会给容器导入大量自动配置类(xxxAutoConfiguration),从而自动配置场景所需组件。
SpringBoot在启动时从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,从而进行自动配置工作。
J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar
6、使用Spring Initializer快速创建SpringBoot项目
使用IDE的Spring项目创建享导快速创建SpringBoot项目,选择所需模块,向导联网创建Spring Boot项目。
- resources文件夹中目录结构
- static:保存所有静态资源:js css images;
- templates:保存所有的模板页面:(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面);可以使用模板引擎
- application.properties:SpringBoot应用的配置文件;
二、配置文件
1、配置文件
SpringBoot使用全局配置文件,配置文件名固定
- application.properties
- application.yml
可以修改SpringBoot自动配置的默认值
yml以数据为中心
server:
port:8001
xml
8001
2、YAML语法
基本语法
k:(空格)v :表示一个键值对
以空格的缩进来控制层级关系,只要是左对齐的一列数据,都是同一层级
属性和值大小写敏感
值的写法
字面量:普通的值 (数字,字符串,布尔)
键值对直接写
字符串默认不加引号,单引号不会转义,双引号会转义
对象、Map:
person: lastName: zhangsan age: 20 person:{lastName: zhangsan,age: 18}
数组:
用- 值表示数组的一个元素
pets: - cat - dog - pig pets: [cat,dog,pig]
3、配置文件的注入
在yml配置文件中进行配置,在javaBean中进行绑定(将配置的值映射到Bean)
@ConfigurationProperties:告诉SpingBoot将本类中的所有属性和配置文件中相关的配置进行绑定
prefix=”person“,配置文件的person项的所有属性进行映射
@Component 配置映射只对容器的组件有效
@Component
@ConfigurationProperties(prefix="person")
- properties配置文件在IDEA中默认utf-8编码可能会出现乱码,需要设置为在编译时转为ascii码
- @Value和@ConfigurationProperties获取值有区别
- 配置文件注入值数据校验@Validated
- @PropertySource&&@ImportResource,前者加载自定义的配置文件,后者将自定义的Spring相关配置生效
@PropertySource(value={"classpath:person.properties"})
@ImportResource(location={"calsspath:bean.xml"})
SpringBoot推荐使用全注解的方式给容器添加组件
- 配置类=Spring配置文件
- 使用@Bean给容器添加组件
@Configuration //配置类
publie class MyAppConfig{
//将方法的返回值添加到容器中,组件默认id为方法名
@Bean
public HelloService helloService(){
//
return new HelloService();
}
}
4、配置文件占位符
- 随机数
${random.long}、${random.int(10)}、${random.value}、${random.int[1024,65536]}
- 占位符获取之前配置的值,如果没有可以使用指定默认值
5、Profile
多Profile文件
主配置文件名可以是application.(profile).properties/yml
Spring默认使用application.properties的配置
yml支持多文档块方式
server: port:8001 spring: profiles: active:dev --- server: port:8002 spring: profiles:dev --- server: port:8003 spring: profiles:prod #指定配置环境
激活指定profile
在配置文件中指定spring.profile.active=(profile)
命令行:
java -jar spring-boot-SNAPSHOT.jar --spring.profiles.active=dev;
运行时传入参数
虚拟机参数
-Dspring.profiles.active=dev
6、配置文件加载位置
SpringBoot启动会扫描以下位置的application.properties/yml文件作为默认配置文件
file:/config/
file:/
classpath:/config/
classpath:/
优先级由高到低,配置互补,相同配置项高优先级会覆盖低优先级
也可通过部署运行时在命令中传参数改变默认配置spring.config.location
7、外部配置加载顺序
优先级由高到低,配置互补,相同配置项高优先级会覆盖低优先级
命令行参数
-- 配置项=值
java系统属性
操作系统环境变量
jar包外带profile的配置文件(application.{profile}.properties或application.yml(有spring.profile))
jar包内带profile的配置文件(application.{profile}.properties或application.yml(有spring.profile))
jar包外的配置文件(application.properties或application.yml(没有spring.profile))
jar包内的配置文件(application.properties或application.yml(没有spring.profile))
外部:打成的jar同一文件夹下
内部:项目文件下
@Configuration注解类上的@PropertySource
8、自动配置原理
SpringBoot启动时加载主配置类,开启自动配置功能@EnableAutoConfiguration
@EnableAutoConfiguration作用
利用EnableAutoConfigurationImportSelector给容器中导入一些组件 :可以查看select Imports()方法的内容
List configurations=getCandidateConfigurations(annotationMetadata,attributes);获取候选配置
SpringFactoriesLoader.loadFactoryNames();
扫描所有jar包类路径下META-INF/spring.factories
把扫描到的这些文件的内容包装成properties对象
从properties中获取到EnableAutoConfiguration.class类名对应的值,然后把他们添加到容器中
将类路径下META-INF/spring.factories里面配置的所有EnableAutoConfiguration的值加入到了容器中;
每一个自动配置类进行自动配置功能
所有 在配置类中能配置的属性都是在xxxProperties类中封装着;
精髓:
- SpringBoot启动会加载大量的自动配置类
- 我们需要看项目所需功能有没有SpringBoot默认写好的自动配置类
- 再看自动配置类中到底配置了那些组件
- 给容器自动配置类添加组件时会从properties类中获取某些属性,我们可以在配置文件中指定这些属性的的值
细节
@Conditional派生注解:注解指定的条件成立,才给容器添加组件,配置里的内容才生效
@Conditional派生注解 作用 @ConditionalOnJava java版本是否符合要求 @ConditionalOnBean 存在指定Bean @ConditionalOnMissingBean 不存在指定Bean @ConditionalOnExpression 满足SpEL表达式指定 @ConditionalOnClass 有指定类 @ConditionalOnMissingClass 没有指定类 @ConditionalOnSingleCandidate 只有一个指定Bean @ConditionalOnProperty 指定属性是否有指定值 @ConditionalOnResource 类路径下是否存在资源文件 @ConditionalOnWebApplication 当前是Web环境 @ConditionalOnNotWebApplication 当前不是Web环境 自动配置类必须在一定条件下才能生效
通过在配置文件中启用debug=true属性,让控制台自动打印配置报告,可以很方便知道哪些自动配置类生效