SpringBoot
1.概述
SpringBoot对Spring的改善和优化,它基于
约定优于配置
的思想,提供了大量的默认配置和实现
使用SpringBoot之后,程序员只需按照它规定的方式去进行程序代码的开发即可,而无需再去编写一堆复杂的配置
SpringBoot的主要功能如下:
- 起步依赖:SpringBoot以功能化的方式将需要的依赖进行组装,并且允许程序员以start的方式进行引入
- 默认配置:SpringBoot实现了大量依赖框架的默认配置项,程序员无须再进行自己配置
- 内置Tomcat:SpringBoot内置了一个tomcat,使用它开发的程序无需再进行tomcat部署,可直接运行
总之:SpringBoot最主要作用就是帮我们快速的构建庞大的spring项目,并且尽可能的减少配置,让程序员去关注业务而非配置。
2.入门案例
2.1 代码开发
2.1.1 创建工程,导入依赖
创建一个maven工程,导入依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.3</version>
</parent>
<dependencies>
<!--web依赖启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
2.1.2 创建Controller
@RestController
public class IndexController {
@GetMapping("/index")
public String index(){
return "hello,springboot";
}
}
2.1.3 创建启动类
//注意一下:启动类的位置必须位于com.itheima下
@SpringBootApplication//启动类专用注解
public class SpringbootDemoApplication {
public static void main(String[] args) {
//参数1.当前类名.class
//参数2:args
//固定格式
SpringApplication.run(SpringbootDemoApplication.class,args);
}
}
2.1.4 启动项目
2.1.5 测试
2.2 案例解析
- 做完了入门案例,应该会有下面这样几个疑问:
1. 工程在引入spring-boot-starter-web
依赖的时候,为什么没有指定版本
2.spring-boot-starter-web
是个啥,为什么引入了它之后,就不需要再引入原来做spring开发的那一堆包了
3. 程序没有部署到tomcat,为什么就可以被访问
4. 为什么访问程序的时候要用8080端口,谁定义的
2.2.1 版本锁定
项目继承了
spring-boot-starter-parent
父工程,它内部已经锁定了一些常见依赖的版本号,故而在自己开发的工程中无需再指定依赖的版本。
2.2.2 起步依赖
SpringBoot根据场景将各种依赖组装成了一个个的集合(starter),根据功能引入指定的starter即可。
2.2.3 内置Tomcat
SpringBoot在中引入一个内置的tomcat,故而无需再将程序部署到位置的tomcat中即可运行。
2.2.4 默认配置
SpringBoot的约定大于配置,即SpringBoot的大量配置都有默认值,如果不去写配置就使用默认的。
**比如说:**tomcat默认端口 8080等等
3.配置文件
3.1 自定义配置
SpringBoot是基于约定的,很多配置都有默认值,但也允许自定义配置,具体做法是在resources下创建文件:
application.yaml 或者 application.yml 或者 application.properties
注意:目前版本中, SpringBoot启动时会依次加载:yaml、yml、properties文件,优先级依次升高
3.2 YAML介绍
YAML(YAML Ain’t Markup Language),一种数据序列化格式
3.2.1 语法
# 大小写敏感
# 使用缩进表示层级关系
# 缩进的空格数目不重要,但是相同层级的元素必须左侧对齐
# 参数值和冒号之间必须有空格
# # 表示注释,从这个字符一直到行尾,都会被解析器忽略
server:
port: 8082 #修改默认端口号
servlet:
context-path: /itheima #修改地址,必须通过此地址访问
3.2.2 数据格式
#简单值
username: 张三
# 对象:键值对的集合
user:
username: '张三'
password: '123'
addressList: # 数组:一组按次序排列的值 -加上空格
- '北京'
- '上海'
- '广州'
3.3 读取配置
- 方式1: @Value (了解)
此注解是Spring框架提供的,用来读取配置文件中的属性值并逐个注入到Bean对象的对应属性中- 方式2: @ConfigurationProperties(掌握)
此注解是SpringBoot框架提供的,用来快速将配置文件中的属性值批量注入到某个Bean对象的多个对应属性中
3.3.1 @Value
#自定义配置
user:
username: '张三' #不要用name,会与计算机用户名冲突
password: '123'
addressList: #数组
- '上海'
- '北京'
- '广州'
读取配置文件属性
@Value("${user.username}") //使用spring提供的value
private String username;
@Value("${user.password}")
private String password;
@Value("&{user.addressList[1]}")
private String[] addressList_1;
@GetMapping("/index")
public String index(){
System.out.println("username:"+username+",password:"+password+",address:"+addressList_1 );
return "hello,springboot";
}
@Value用来读取配置文件中的属性值并逐个注入到Bean对象的对应属性中
3.3.2 @ConfigurationProperties
3.3.2.1 创建配置类(读取配置类属性)
@Data
@Configuration
@ConfigurationProperties(prefix = "user") //读取配置文件中的配置项到当前类对象中,需要指定前缀
public class UserConfig {
private String username;
private String password;
private List<String> addressList;
}
在使用的地方直接注入配置类
@RestController
public class IndexController {
@Autowired
private UserConfig userConfig;
@GetMapping("/config1")
public String config1() {
System.out.println(userConfig);
return "hello,springboot";
}
3.3.2.2 爆红
添加下面依赖可以解决图中的红色提示
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
3.3.3 注意事项
使用value时无法获得集合中的值,必须使用@ConfigurationProperties
3.4 多环境配置
在实际开发中,项目的开发环境、测试环境中配置可能不一致,因此SpringBoot支持多环境配置
主配置
#多环境测试
spring:
profiles:
active: dev
#自定义配置
user:
username: '主配置'
password: '123'
addressList: #数组
- '上海'
- '北京'
- '广州'
子配置(开发环境)
user:
username: '开发环境'
password: '123'
子配置(测试环境)
user:
username: '测试环境'
password: '123'
3.4.1 使用开发环境
子配置可以继承父配置的内容
3.5 将项目打包成jar包
在springboot中打包jar包需要添加以下配置
<!--在pom.xml的project节点中添加下面配置,然后执行maven clean package-->
<build>
<finalName>springboot</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
3.5.1 在命令行修改
java –jar springboot.jar --spring.profiles.active=test # 指定使用test环境
java –jar springboot.jar --spring.profiles.active=test --server.port=9090 # 指定使用test环境,端口号为9090
4.常用功能
4.1 日志输出
Spring支持多种日志级别,通过配置文件,可以输出指定级别的日志
# 包名: 日志级别(常用的级别有4个: debug info warn error)
logging:
level: #指定每个包接下来要记录的日志级别
com.itheima: debug
file: #指定日志输出路径
name: D:\soft\review\springboot\springboot.log
4.1.1 打印日志的时候,设置级别
在输出日志的时候就需要设置好当前日志内容级别
@RestController
@Slf4j //添加此注解后,就可以在类中使用一个log的对象了
public class IndexController {
//读取配置
@GetMapping("/log")
public String log(){
log.debug("AAA");
log.info("BBB");
log.warn("CCC");
log.error("DDD");
return "hello, springboot";
}
4.1.2 控制日志的访问级别
# 设置 输出
# debug debug info warn error
# info info warn error
# warn warn error
# error error
4.1.3 访问测试
4.2 单元测试
4.2.1 引入依赖
在pom.xml加入单元测试的starter
<!--引入junit依赖启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
4.2.2 编写测试类
注意测试类的位置: 必须在启动类所在包之下
//测试类的位置必须在启动类所在包之下
@SpringBootTest
public class UserConfigTest {
@Autowired
private UserConfig userConfig;
@Test
public void test1(){
System.out.println(userConfig);
}
}
4.3 静态资源
现在项目是一个普通java工程,没有webapp,那么静态资源应该放哪里呢?
SpringBoot默认的静态资源是在classpath:/static/
目录