1.背景:以前假如想创建一个Spring应用, 比如Spring、SpringMVC、Mybatis三大框架的整合, 我们需要一堆繁琐的步骤:maven导一堆依赖-->写一堆配置文件-->测试-->打成war包部署到Servlet容器上,可以说是相当繁琐。SpringBoot就是来简化这些步骤的。
2.SpringBoot的作用:帮助我们很快的创建一个产品级别的Spring应用,简化J2EE开发。SpringBoot会自动帮我们配置好Spring
的相关配置,因此用户可以无需去清楚Spring的配置,就可以从SpringBoot这个微小的入口打开J2EE的大门。
3.归纳一下SpringBoot的优点:
(1)快速创建独立运行的Spring项目以及与主流框架集成
(2)使用嵌入式的Servlet容器,应用无需打成WAR包跑在servlet容器上。打成Jar包,然后java -jar即可运行
(3)starters自动依赖与版本控制
(4)大量的自动配置,简化开发,也可以修改默认值
(5)无需配置XML,无代码生成,开箱即用
(6)准生产环境的运行时应用监控
(7)与云计算的天然集成
4,SpringBoot的缺点:入门容易,精通难。之所以那么说,是因为SpringBoot是基于Spring的一个再封装,如果你对Spring框架一无所知,那就做不到精通。
5.HelloWord(基于maven创建)
(1)创建一个maven工程。
(2)导入SpringBoot的依赖
(3)建一个类,在类上标注@SpringBootApplication,来告诉SpringBoot这是一个主程序类,说明这是一个SpringBoot应用
(4)再主程序类里添加main方法(idea快捷键:psvm),然后在main方法里添加SpringApplication.run(主程序类.class,args);
(5)编写相关的Controller、Service等。
(6)运行测试:主程序里直接运行main方法即可开启应用。tomcat8080端口(内置了tomcat)。
(7)部署:导入SpingBoot的Maven插件
这个插件的作用就是将应用打包成可执行的jar包。
(8)运行:java -jar命令即可启动。即使目标服务器里没有装tomcat也没问题。
5.Spring-Boot-starter(SpringBoot场景启动器):每个功能场景都有自己的starter,每个starter里面都导入了自己需要的依赖,要用什么功能就导入什么场景启动器
6.需要将所有组件都放到主配置类(@SpringBootApplication标注的类)所在包及下面所有子包里面,不然不会被扫描到Spring容器里。所有自动配置的信息(比如SpringMVC等)都配置在@SpringBootApplication注解里。
7.使用Spring Initializer快速创建SpringBoot应用:
(1)
(2)
(3)选择模块
创建完成之后主程序会自动生成好, 我们只需要写我们自己的逻辑。
resources文件目录结构:static:保存所有的静态资源(js、css、images)
templates:保存所有的模板页面,SpringBoot默认jar包嵌入式的Tomcat,默认不知处jsp页面)
可以使用模板引擎代替。
application.properties:SpringBoot的配置文件。可以在这里修改默认配置。e.g 默认tomcat不想用
8080端口了,可以在里面写上sever.port=8081
8.SpringBoot的配置
有两种全局配置文件,分别是application.properties和application.yml 文件名固定不可变.
配置文件的作用: 修改SpringBoot的自动配置默认值.
yml和xml的对比:
很明显, yml文档要比xml文档来的更加简洁.
8.1yml基本语法
普通的值 K:(空格)V 注意:这里的空格必须有. 只要是左对齐的一列数据, 都是同一层级的. 属性和值是大小写敏感的.
字符串默认不用加单引号或者双引号 ""双引号不会转义里面的特殊字符, 特殊字符会作为本身想表示的意思 例: "zhangsan /n lisi", 输出: zhangsan 换行 lisi
''单引号会转义特殊字符,特殊字符只是一个普通的字符串输出.例: "zhangsan /n lisi", 输出: zhangsan /n lisi
对象 friends:
lastName: zhangsan
age: 20
对象(行内写法) friends: {lastName: zhangsan,age: 20}
数组 用-(空格)表示数组中的一个元素 例:pets:
- cat
-dog
数组(行内写法) pets: [cat,dog]
8.2 如何在yml里面配置属性, 然后注入到bean中.
public class Person { private String lastName; private Integer age; private Boolean boss; private Date birth; private Mapmaps; private List
定义一个Person类.
接下来要怎样把yml文件里面的配置信息映射到这个bean中呢?
用@ConfigurationProperties(prefix = "person") 注解, 这个注解的意义是告诉SpringBoot将本类中的所有属性和配置文件中的相关属性进行绑定
@ConfigurationProperties(prefix = "person") public class Person { private String lastName; private Integer age; private Boolean boss; private Date birth; private Mapmaps; private List
此时IDEA会报一个提示, 没有在类路径下找到SpringBoot的配置注释处理器
只需要点击Open Documentation, 到达SpringBoot官网, 把依赖添加过来即可. 加入这个插件以后还有个好处就是在yml或者properties里配置信息的时候会有提示
<dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-configuration-processorartifactId> <optional>trueoptional> dependency>
注意:这个bean必须要是Spring容器中的组件, 也就是必须加上@Component注解. 此时已经设置完毕, 可以开始进行测试.
到测试包下可以看到一个Test类, 这是SpringBoot的单元测试
注入Person,然后在控制台输出一下即可看到效果. 由此可以得出, 把一些初始化配置配置在yml里面, 修改相当方便.
当然, 我们的配置信息也可以放在application,properties当中, 语法与yml文件略有不同.
person.last-name=张三 person.age=50 person.birth=1992/06/19 person.boss=true person.dog.name=555 person.dog.age=5 person.maps.k1=v1 person.maps..k2=v2 person.list=1,2,3
插入之后执行测试, 发现有中文乱码情况. 原因: idea默认是utf-8, 而application.properties默认的不是utf-8.因此我们输入的"张三"并不是utf-8格式
解决方法:file->setting->搜索FileEncoding
这样在输入时就是utf-8格式, 然后帮我们自动转化为ascii格式让程序进行获取.
那么问题来了, application.properties和application.yml都可以进行配置, 那么谁的优先级更高呢? 博主测试了一下, 是application,properties更高! yml与properties相比较, 看上去更清晰, 更有层次感些.
用@ConfigurationProperties在注入时, 也可以进行数据验证, 在@ConfigurationProperties下面加上@Validated, 表示注入需要验证.接下来就可以在各个属性上添加不一样的格式(比如@Email)
1 @Component 2 @ConfigurationProperties(prefix = "person") 3 @Validated 4 public class Person { 5 @Email 6 private String lastName;//此时在配置文件中lastName若不是email格式,则会报错
从配置文件中注入属性值有两种方法, 一种是在类上添加@ConfigulationProperties(支持数据校验), 一种是在属性上添加@Value(不支持数据校验)
何时用何种情况:如果说我们只是在某个业务逻辑中需要获取一下配置文件中的某项值, 使用@Value
如果说我们专门编写了一个JavaBean来和配置文件进行映射, 我们就直接使用@ConfigulationProperties
那么我们所有配置Javabean的信息都配到application.yml(全局配置文件)或者application.properties(全局配置文件)真的好吗?当然不好, 这样配置文件也太大了. 我们一般把和SpringBoot无关的配置信息单独放到别的配置文件中去, 然后通过@PropertySource(value="classpath:***")来注入.
1 @Component 2 @PropertySource(value = "classpath:person.properties")//person.properties放在resources文件夹下 3 @ConfigurationProperties(prefix = "person")//这个注解不能删除, 不然无法注入, 默认为从全局配置文件中获取配置信息, 加了@PropertiesSource之后就从这个指定的配置文件中获取配置信息 4 public class Person { 5 private String lastName; 6 private Integer age; 7 private Boolean boss; 8 private Date birth; 9 10 private Mapmaps; 11 private List
在配置文件里我们还可以使用占位符${属性名},占位符里也可以添加SpringBoot提供的一些功能, 比如随机数/uuid等
1 dog: 2 name: 欢欢${person.birth} 3 age: 1 4 last-name: 一头生猛的程序猿${random.uuid}
9.Profile
为了方便我们的多环境配置, 比如测试环境/生产环境, 他们的配置信息肯定是不同的, 如何快速的切换, 就要用到我们的Profile
多profile文件模式: 我们在主配置文件编写的时候, 文件名可以是:application-{profile}.Properties/yml
例: 现在有Application.properties 设置端口8080
Application-{test}.properties 设置端口8081
Application-{product}.properties 设置端口8082
测试跑起来之后, 开启的端口为8080, 采用了默认设置
此时, 在Application.properties中添加一行 spring.profiles.active=test //激活test
执行测试发现开启的端口是8081. 由此得出, 我们可以在默认全局配置文件Application.Properties中进行灵活的切换, 缺点就是需要新建很多个profile文件(用yml支持多文档块方式即可弥补这个缺点)
yml支持多文档块方式:以yml作为主配置文件, yml内部可以分为多个文档块, 通过"---"进行划分,这样就避免了多个profile文件的创建
10.配置文件的加载位置:
SpringBoot启动会扫描以下位置的application.yml或application,properties作为Spring boot默认配置文件
file:./config/
file:./
classpath:/config/
classpath:/
优先级从上到下是从高到低, 相同的属性配置, 低优先级的会被高优先级的覆盖 ; 一些低优先级包含,高优先级不包含的则以低优先级的为准. 也就是互补配置! 默认打包只会打包类路径下的, 工程路径下的不打包.
我们还可以通过spring.config.location来改变默认的配置文件位置(应用场景: 在运维过程中,当项目已经打包, 但是想修改一些配置的时候),注意:这里也是互补配置