SpringBoot2.0快速上手
首先访问此网站,选择:
点击Generate the project,生成项目。
解压之后,将项目导入到Eclipse中,选择Existing Maven Projects。
注意:pom.xml文件中第一行可能会报错,解决这个问题只需要在pom.xml 文件中的 properties 中加入maven jar 插件的版本号,如下所示:
3.1.1
主要原因是2.1.8.RELEASE 升级到了3.1.2 造成的问题,有些IDE插件不兼容的问题造成的。
resources目录下的static文件夹用来放静态页面,例如CSS,JS等等,它是静态路径,可以直接访问。
resources目录下的templates文件夹用来放模板页面。
运行DemoApplication.java,出现下图,则运行成功。
与平常的空页面不同,说明已经访问到了,只不过没有页面而已。
现在我们来写一个页面,与SpringMVC写法相同。
在DemoApplication.java中添加代码:
package com.xixi.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@ResponseBody
@RequestMapping("/hello.html")
public Object hello() {
return "我的SpringBoot项目";
}
}
在static目录下创建一个img目录,放入图片:mimi.jpg。
在浏览器中访问,如下图:(static是一个可以直接被访问的静态路径,所有静态资源都可以放进里面)
------------------------------------------------------------------------------------------------------------------------------
两种配置文件
application.properties
server.port=8080
my.age=18
application.yml
server:
port: 8080
my:
name: xixi
先加载yaml再加载properties,因此当它们同时存在时,最终生效的是properties文件中的配置。
------------------------------------------------------------------------------------------------------------------------------
设置ContextPath上下文路径
ContextPath上下文目录的设置:
在SpringBoot1中是server.context-path,而在SpringBoot2中改为server.servlet.context-path
springboot1 :server.context-path
springboot2 :server.servlet.context-path
在application.properties中添加代码:
server.port=8080
server.servlet.context-path=/demo
或在application.yml中添加代码:
server:
port: 8080
servlet:
context-path: /mydemo
------------------------------------------------------------------------------------------------------------------------------
对比properties和yaml配置文件
对于较复杂的数据结构来说,yaml要优于properties结构。
先来看一个SpringBoot中的properties文件和对应YAML文件的对比:
#properties(示例来源于Springboot User guide):
environments.dev.url=http://dev.bar.com
environments.dev.name=Developer Setup
environments.prod.url=http://foo.bar.com
environments.prod.name=My Cool App
my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com
#YAML格式
environments:
dev:
url: http://dev.bar.com
name: Developer Setup
prod:
url: http://foo.bar.com
name: My Cool App
my:
servers:
- dev.bar.com
- foo.bar.com
可以明显的看到,在处理层级关系的时候,properties需要使用大量的路径来描述层级(或者属性),而数组的写法更是复杂,相比较而言,YAML格式文件就清晰很多。
可以直观的看到,YAML使用冒号加缩进的方式代表层级(属性)关系,使用短横杠(-)代表数组元素。经过这个示例的演示,可以很明显的看到YAML相对于properties文件的优异之处。
------------------------------------------------------------------------------------------------------------------------------
YAML的常用语法
YAML中允许表示三种格式,分别是常量值,对象和数组。
例:
#表示url属性值;
url: http://www.xixi.com
#表示server.host属性的值;
server:
host: http://www.xixi.com
#数组,表示server为[a,b,c]
server:
- 192.168.1.101
- 192.168.1.102
- 192.168.1.103
#常量
pi: 3.14 #定义一个数值3.14
hasChild: true #定义一个boolean值
name: '你好YAML' #定义一个字符串
注释:和properties相同,使用#作为注释,YAML中只有行注释。
基本格式要求:
1.YAML大小写敏感
2.使用缩进代表层级关系
3.缩进只能使用空格,不能使用TAB,不要求空格个数,只需要相同层级左对齐(一般4个空格)
对象:使用冒号代表,格式为:key: value(冒号后面要加一个空格)。
key: value
可以使用缩进表示层级关系:
obj1:
name: xixi
age: 18
YAML中还支持流式(flow)语法表示对象,比如上面的例子可以写为:
obj1: {name: xixi,age: 18}
较为复杂的对象格式,可以使用问号加一个空格代表一个复杂的key,配合一个冒号加一个空格代表一个value:
?
- name
- age
:
-xixi
-18
表示对象的属性是一个数组[name,age],对应的值也是一个数组[xixi,18]。
数组:使用一个短横线加一个空格代表一个数组项。
hobby:
- Java
- LOL
也可以有这样的写法:
-
- Java
- LOL
可以简单理解为:[[Java,LOL]]
一个相对复杂的例子:
companies:
-
id: 1
name: company1
price: 200W
-
id: 2
name: company2
price: 500W
意思是companies属性是一个数组,每一个数组元素又是由id,name,price三个属性构成。
数组也可以使用流式(flow)的方式表示:
companies: [{id: 1,name: company1,price: 200W},{id: 2,name: company2,price: 500W}]
常量:YAML中提供了多种常量结构,包括:整数,浮点数,字符串,NULL,日期,布尔,时间。
boolean:
- TRUE #true,True都可以
- FALSE #false,False都可以
float:
- 3.14
- 6.8523015e+5 #可以使用科学计数法
int:
- 123
- 0b1010_0111_0100_1010_1110 #二进制表示
null:
nodeName: 'node'
parent: ~ #使用~表示null
string:
- 哈哈
- 'Hello world' #可以使用双引号或者单引号包裹特殊字符
- newline
newline2 #字符串可以拆成多行,每一行会被转化成一个空格
date:
- 2018-02-17 #日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime:
- 2018-02-17T15:02:31+08:00 #时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区
一些特殊符号:YAML中提供了很多特殊符号,在这里简单介绍常用的一些。
1 --- YAML可以在同一个文件中,使用---表示一个文档的开始;比如Springboot中profile的定义:
server:
address: 192.168.1.101
---
spring:
profiles: development
server:
address: 127.0.0.1
---
spring:
profiles: production
server:
address: 192.168.1.102
代表定义了两个profile,一个是development,一个production;也常常使用---来分割不同的内容,比如记录日志:
---
Time: 2018-02-17T15:02:31+08:00
User: ed
Warning:
This is an error message for the log file
---
Time: 2018-02-17T15:05:21+08:00
User: ed
Warning:
A slightly different error message.
2 ... 和---配合使用,在一个配置文件中代表一个文件的结束:
---
time: 20:03:20
player: Sammy Sosa
action: strike (miss)
...
---
time: 20:03:47
player: Sammy Sosa
action: grand slam
...
相当于在一个yaml文件中连续写了两个yaml配置项。
3 !! YAML中使用!!做类型强行转换:
string:
- !!str 54321
- !!str true
相当于把数字和布尔类型强转为字符串。当然允许转型的类型很多,比如:
--- !!set
- Mark McGwire: 65
- Sammy Sosa: 63
- Sammy Sosa: 63
- Ken Griffy: 58
将数组解析为set,简单理解,转化的内容就是:[{Ken Griffy=58}, {Mark McGwire=65}, {Sammy Sosa=63}],重复的Sammy Sosa去掉;
------------------------------------------------------------------------------------------------------------------------------
使用Devtools热部署
spring-boot-devtools是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到程序。原理是在发现代码有更改之后,重新启动应用,但是速度比手动停止后再启动更快。
其深层原理是使用了两个ClassLoader,一个ClassLoader加载那些不会改变的类(第三方jar包),另一个ClassLoader加载会更改的类,称为restart ClassLoader,这样在有代码更改的时候,原来的restart ClassLoader被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间。
即devtools会监听classpath下的文件变动,并且会立即重启应用(发生在保存时刻)。
从spring-boot-1.3开始支持热部署功能
1.引入maven依赖
org.springframework.boot
spring-boot-devtools
true
2.开启热部署
org.springframework.boot
spring-boot-maven-plugin
true
------------------------------------------------------------------------------------------------------------------------------
加载并调试SpringBoot项目
使用IDEA打开SpringBoot项目。
File->Settings->搜索Maven->配置如图->Apply->OK
IDEA右侧点击Maven->“加号”->选择demo项目中的pom.xml文件->OK
File->Settings->搜索font可以更改字体
选择项目->File->Project Structure->配置如图->Apply->OK
直接点击main方法左边的绿色启动标志即可运行。
运行结果:
------------------------------------------------------------------------------------------------------------------------------
设置IDEA支持热部署
1.Ctrl + Shift + A -> 查找make project automatically -> 选中 -> Apply -> OK
2.Ctrl + Shift + A -> 查找Registry -> 找到并勾选compiler.automake.allow.when.app.running -> 重启IDEA
------------------------------------------------------------------------------------------------------------------------------
自定义属性参数并通过@Value引用
在application.properties文件中添加代码:
server.port=8080
server.servlet.context-path=/demo
[email protected]
在application.yml文件中添加代码:
server:
port: 8080
servlet:
context-path: /mydemo
obj1:
name: 西西
创建一个Hello类,添加代码:
package com.xixi.demo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class Hello {
@Value("${admin.email}")
String email;
@Value("${obj1.name}")
String name;
@ResponseBody
@RequestMapping("/hello")
public void hello() {
System.out.println("姓名:"+name);
System.out.println("邮箱:"+email);
}
}