快速搭建SpringBoot工程
搭建工具:IDEA
目标:创建Controller,在网页输出 “hello controller!”
(1) 新建项目: File -> New -> Project
(2) 按照图中选择文件类型,点击Next
注意:该创建项目的前提下是需要联网
(3) 为目标文件编辑相关信息,可参考下图
(4) 选择Web ->Spring Web
(5) 文件进行加载,加载后目录如下图所示
(5) 点击右上角运行图标,若出现下列图标,说明启动没有问题
(6) 在 com.example.demo 包下新建 HelloController.java文件,编辑代码
代码如下:
package com.example.demo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("hello")
public String hello(){
return "hello controller!";
}
}
(7) 在任意一个浏览器输入 http://localhost:8080/hello
,运行结果如图所示
SpringBoot起步依赖原理分析
spring-boot-starter-parent:
- 在 spring-boot-starter-parent 中定义了各种技术的版本信息,组合了一套最优搭配的技术版本
- 在各种 starter 中,定义了完成该功能需要的坐标合集,其中大部分版本信息来自父工程
- 工程继承 parent ,引入starter后,通过依赖传递,就可以简单方便的获得需要的jar包,并且不会存在版本冲突问题。
SpringBoot 配置
配置文件分类:
SpringBoot是基于约定的,很多配置都有默认值,可以使用 application.properties 或者 application.yml ( application.yaml ) 进行配置。以默认的端口号为例,properties 和 yml 代码如下
(1)properties:
server.port = 8080
(2)yml:(注意,port 和 8080之间有空格,且必须)
server:
port: 8080
YAML语法
特点: 简洁,以数据为中心
(1)YAML语法如下:
- 使用缩进表示层级关系
- 缩进时只允许使用空格键,空格数量无所谓,但同级元素必须左侧对齐
- 数据值前面必须有空格,作为分隔符
- 大小写敏感
YAML数据格式
(1)对象(map):键值对的集合
注意:行内写法person
与大括号之间有空格,括号内name
与zhangsan
之间有空格
person:
name: zhangsan
#行内写法
person: {name: zhangsan}
(2)数组:一组按次序排列的值,使用 “-”表示数组每个元素
address:
- beijing
- shanghai
#行内写法
address: [beijing,shanghai]
(3)纯良:单个的,不可再分的值
msg1: 'hello \n world' #单引号忽略转义字符
msg2: "hello \n world" #双引识别转义字符
(4)参数引用:$()
name: lisi
person:
name: $(name) #引用上边定义的name值
代码演示
(1)在resources文件夹下创建application.yaml文件,编辑代码,如图所示:
SpringBoot配置 — 获取数据
读取配置内容
需要掌握的知识点如下:
- @Value:获取单个值。
- Environment: 当属性较多,单个获取不方便时,可以使用
Environment
批量获取。 - @ConfigurationProperties: 因为
@Value
获取将会产生很多重复的代码,Environment
获取需要封装,此时我们可以使用ConfigurationProperties
,一个SpringBoot已经封装好的注解。
数据读取
@Value 用例
(1) 首先,打开HelloController文件,编辑代码如图所示。
(2)在网页输入
http://localhost:8080/hello2
,若是没有运行点击刷新,运行结果如下所示:
(3)上述这是对于普通的变量name
进行的演示,若要使用@Value
获取对象,数组或纯量,HelloController
的代码和运行结果如下所示:
package com.example.demo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Value("${name}")
private String name;
//对象使用
@Value("${person.name}")
private String name2;
//数组取值: 用中括号取他们的角标
@Value("${address[0]}")
private String address1;
//纯量
@Value("${msg1}")
private String msg1;
@Value("${msg2}")
private String msg2;
@RequestMapping("hello2")
public String hello2(){
//验证,输出数据
System.out.println(name);
System.out.println(name2);
System.out.println(address1);
System.out.println(msg1);//不会识别转义字符\n,会原样输出
System.out.println(msg2);//会识别转义字符
return "hello world!";
}
}
运行截图如下:
Environment 用例
(1)Environment
:Environment
是import org.springframework.core.env.Environment
包下的。
(2)Environment
对数组和对象的使用过程在HelloController
的核心代码如下所示:
@RestController
public class HelloController {
@Autowired
private Environment env;
@RequestMapping("hello2")
public String hello2(){
//要用getProperty()获取属性
System.out.println(env.getProperty("person.name")); //对象
System.out.println(env.getProperty("address[0]"));
return "hello world!";
}
}
运行结果如下:
@ConfigurationProperties 用例
(1)针对application.yaml(配置文件)中的person对象为例,先在包下新建Person
类
其中,
Person
类中核心代码如下:
@Component //表示下面这个Person类被spring所识别
@ConfigurationProperties(prefix = "person")//prefix 是前缀
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
(2)新建Person
类后,在HelloControlle
中运行测试。其中HelloController.java
的核心代码如下:
@RestController
public class HelloController {
@Autowired
private Person person;
@RequestMapping("hello2")
public String hello2(){
System.out.println(person); //输出对象
return "hello person!";
}
}
运行结果如图所示:
补充(3):上面那个红条的bug修复,只是用于提示,并不影响运行,但是也可以去除,方法如下:
首先点击按钮如下:
自动跳转页面如下,补充依赖,加到pom.xml
文件中去
SpringBoot配置-profile
profile: 我们在开发SpringBoot应用时,通常同一套程序会被安装到不同环境,比如开发,测试,生产等。其中数据地址,服务器端口等等配置都不同,比如每次打包时,都要修改配置文件,那么非常麻烦。profile功能就是来进行动态配置切换的。
1)profile配置方式
- 多profile文件方式:提供多个配置文件,每个代表一种环境
- application-dev.properties/yml 开发环境
- application-test.properties/yml 测试环境
- application-pro.properties/yml 生产环境
- yml多文档方式:
- 在yml中使用——分隔不同配置
2)profile 激活方式
- 配置文件:在配置文件中配置:spring.profiles.active = dev
- 虚拟机参数:在VM options指定:-Dspring.profiles.active = dev
- 命令行参数: java-jar.xxx.jar --spring.profiles.active = dev
内部配置加载顺序
Springboot程序启动时:会从以下位置加载配置文件:
- file:…/config/ : 当前项目下的/config目录下
- file:…/ : 当前项目的根目录
- classpath:/config/ : classpath的/config目录
- classpath :classpath的根目录
加载顺序为上文的排列顺序,高优先级配置的属性会生效
演示
以下是可以设置配置文件的位置:
(1)上述第4个加载文件位置如下图:
(2)上述第3个配置文件首先需要在resources
文件夹下建立config
包,其次需要在该包下建立application.properties
文件:
(3)上述第2个配置文件 首先需要如下图Project—> Project Files, 其次建立application.properties
文件(也可以直接复制在下面)
(4)上述第1个配置文件首先如上图roject—> Project Files,其次在下面建立config
包在建立application.properties
文件
SpringBoot原理分析
SpringBoot自动配置——Condition
(1)Condition:Condition是在Spring 4.0 增加的条件判断功能,通过这个功能可以实现选择性的创建Bean操作。