1.背景:之前假如想建立一个Spring应用, 好比Spring、SpringMVC、Mybatis三大框架的整合, 咱们须要一堆繁琐的步骤:maven导一堆依赖-->写一堆配置文件-->测试-->打成war包部署到Servlet容器上,能够说是至关繁琐。SpringBoot就是来简化这些步骤的。css
2.SpringBoot的做用:帮助咱们很快的建立一个产品级别的Spring应用,简化J2EE开发。SpringBoot会自动帮咱们配置好Springjava
的相关配置,所以用户能够无需去清楚Spring的配置,就能够从SpringBoot这个微小的入口打开J2EE的大门。spring
3.概括一下SpringBoot的优势:数组
(1)快速建立独立运行的Spring项目以及与主流框架集成tomcat
(2)使用嵌入式的Servlet容器,应用无需打成WAR包跑在servlet容器上。打成Jar包,而后java -jar便可运行服务器
(3)starters自动依赖与版本控制app
(4)大量的自动配置,简化开发,也能够修改默认值框架
(5)无需配置XML,无代码生成,开箱即用运维
(6)准生产环境的运行时应用监控dom
(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:
很明显, 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 Map<String,Object> maps; private List<Object> list; private Dog dog;
定义一个Person类.
yml配置.
接下来要怎样把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 Map<String,Object> maps; private List<Object> list; private Dog dog;
此时IDEA会报一个提示, 没有在类路径下找到SpringBoot的配置注释处理器
只须要点击Open Documentation, 到达SpringBoot官网, 把依赖添加过来便可. 加入这个插件之后还有个好处就是在yml或者properties里配置信息的时候会有提示
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </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 Map<String,Object> maps; 11 private List<Object> list; 12 private Dog dog;
在配置文件里咱们还可使用占位符${属性名},占位符里也能够添加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来改变默认的配置文件位置(应用场景: 在运维过程当中,当项目已经打包, 可是想修改一些配置的时候),注意:这里也是互补配置