一、SpringBoot概述
1.1 SpringBoot概念
SpringBoot提供了一种快速使用Spring的方式,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑也不之间进行思维切换,全身心的投入到逻辑也不的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。
Spring 缺点
- 配置繁琐
- 虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring用XML配置,而且是很多XML配置。
- Spring2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML配置。
- Spring3.0引入了基于Java的配置,这是一种类型安全的可重构配置方式,可以代替XML
- 所有这些配置都代表了开发时的损耗。因为在思考Spring特性配置和解决业务问题之间需要进行思维切换,所以编写配置挤占了编写应用程序逻辑的事件。和所有框架一样,Spring很实用,但它要求的回报也不少。
- 依赖繁琐
- 项目的依赖管理也是一件耗时耗力的事情。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要分析导入与之有依赖关系的其他库坐标,一旦选错里依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发进度
SpringBoot功能
- 自动配置
- SpringBoot的自动配置是一个运行时(共准确的说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是SpringBoot自动完成的。
- 起步依赖
- 起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。
- 简单地说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
- 辅助功能
- 提供了一些打响项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康监测、外部配置等。
SpringBoot并不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式
二、SpringBoot快速入门
案例一
案例:需求
- 搭建SpringBoot工程,定义HelloController.hello()方法,返回”Hello SpringBoot!“
案例:实现步骤
-
创建Mavven项目
-
导入SpringBoot起步依赖
-
<!--springboot工程需要继承的父工程--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.8.RELEASE</version> </parent> <dependencies> <!--web开发的起步依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
-
-
定义Controller
-
@RestController public class HelloController { @RequestMapping("/hello") public String hello(){ return "hello spring boot!"; } }
-
-
编写引导类
-
/** * 引导类:SpringBoot项目入口 */ @SpringBootApplication public class HelloApplication { public static void main(String[] args) { SpringApplication.run(HelloApplication.class); } }
-
-
启动测试
http://localhost:8080/hello
小结
- SpringBoot在创建项目时,使用jar的打包方式。
- SpringBoot的引导类,是项目入口,运行main方法就可以启动的项目
- 使用SpringBoot和Spring构建的项目,业务代码编写方式完全一样
案例二
案例:需求
- 使用idea快速构建SpringBoot工程。定义HelloController.hello()方法,返回“Hello SpringBoot!”
三、SpringBoot配置文件
3.1 配置文件分类
SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用application.properties或者application.yml(application.yaml)进行配置
-
properties:
server.port=8080
-
yml:
-
server: port: 8080
-
-
在同一级目录下优先级为:properties > yml > yaml
3.2 yaml
YAML是一种直观的能够被电脑识别的数据序列化格式,并且容易被人类阅读,容易和脚本交互的,可以被支持YAML库的不同的编程语言程序导入,比如:C/C++,Ruby,Python,Java,Perl,C#,PHP等。YML文件是以数据为核心的,比传统的xml方式更加简洁
YAML文件的扩展名可以使用.yml或者.yaml
-
properties:
-
server.port=8080 server.address=127.0.0.1
-
-
xml
-
<server> <port>8080</port> <address>127.0.0.1</address> </server>
-
-
yml
-
server: port: 8080 address: 127.0.0.1
-
YAML:基本语法
- 大小写敏感
- 数据值前边必须有空格,作为分隔符
- 使用缩进表示层级关系
- 缩进时不允许使用Tab键,只允许使用空格(各个系统Tab对应的空格数可能不同,导致层次混乱)
- 缩进的空格数目不重要。只要层级的元素左对齐即可
#
表示注释,从这个字符一直到行尾,都会被解析器忽略
YAML:数据格式
-
对象(map):键值对的集合
-
person: name: zhangsan # 行内写法 person: {name: zhangsan}
-
-
数组:一组按次序排列的值
-
address: - beijing - shanghai # 行内写法 address: [beijing,shanghai]
-
-
纯量:单个的、不可再分的值
-
msg1: 'hello \n world' # 单引忽略转义字符 msg2: "hello \n world" # 双引识别转义字符
-
TAML:参数引用
name: lisi
person:
name: ${name} # 引用上边定义的name值
3.3 读取配置文件内容
-
@Value
-
@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;
-
-
Environment
-
@Autowired private Environment emv; @RequestMapping("/hello2") public void hello2() { System.out.println(emv.getProperty("person.name")); System.out.println(emv.getProperty("address[0]")); System.out.println(emv.getProperty("msg2")); }
-
-
@ConfigurationProperties
-
@Component @ConfigurationProperties(prefix = "person") public class Person { private String name; private int age; //省略get/set }
-
@Autowired private Person person; @RequestMapping("/hello2") public void hello2() { System.out.println(person); }
-
3.4 profile
我们在开发SpringBoot应用时,,通常同一套程序会被安装到不同环境,比如:开发、测试、生产等。其中数据库地址、服务器端口等等配置都不同,如果每一次打包时,都要修改配置文件,那么非常麻烦。profile功能就是来进行动态配置切换的。
profile配置方式
-
多profile文件方式:提供多个配置文件,每个代表一种环境
- application-dev.properties/yml 开发环境
- application-test.properties/yml 测试环境
- application-pro.properties/yml 生产环境
-
yml多文档方式
-
在yml中使用
---
分隔不同配置 -
--- server: port: 8081 spring: profiles: dev --- server: port: 8082 spring: profiles: por --- server: port: 8083 spring: profiles: test --- spring: profiles: active: pro
-
profile激活方式
- 配置文件:在配置文件中配置:spring.profiles.active=dev
- 虚拟机参数:在VM options指定:-Dspring.profiles.active=dev
- 命令行参数:java -jar xxx.jar --spring.profiles.active=dev
3.5 内部配置加载顺序
Springboot程序启动时,会从以下位置加载配置文件:
- file:./config/:当前项目下的/config目录下
- file:./:当前项目的根目录
- classpath:/config/:classpath的/config目录下
- classpath:/:classpath的根目录
加载顺序为上文的排列顺序,高优先级配置的属性会生效
3.6 外部配置加载顺序
通过官网查看外部属性加载顺序:
https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html
四、SpringBoot整合其他框架
4.1 SpringBoot整合Junit
案例:需求
- SpringBoot整合Junit
案例:实现步骤
-
搭建SpringBoot工程
-
引入starter-test起步依赖
-
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
-
-
编写测试类
-
@RunWith(SpringRunner.class) @SpringBootTest(classes = SpringbootTestApplication.class) public class UserServiceTest { }
-
-
添加测试相关注解
- @RunWith(SpringRuner.class)
- @SpringBootTest(classes=启动类.class)
-
编写测试方法
-
@RunWith(SpringRunner.class) @SpringBootTest(classes = SpringbootTestApplication.class) public class UserServiceTest { @Autowired private UserService userService; @Test public void testAdd(){ userService.add(); } }
-
4.2 SpringBoot整合Redis
案例:需求
- SpringBoot整合Redis
案例:实现步骤
-
搭建SpringBoot工程
-
引入redis起步依赖
-
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
-
-
配置redis相关属性
-
spring: redis: host: 127.0.0.1 #redis的主机ip port: 6379
-
-
注入RedisTemplrte模板
-
@Autowired private RedisTemplate redisTemplate;
-
-
编写测试方法,测试
-
@Test public void testSet() { //存入数据 redisTemplate.boundValueOps("name").set("zhangsan"); } @Test public void testGet() { //获取数据 Object name = redisTemplate.boundValueOps("name").get(); System.out.println(name); }
-
4.3 SpringBoot整合MyBatis
案例:需求
- SpringBoot整合MyBatis
案例:实现步骤
-
搭建SpringBoot工程
-
引入mybatis起步依赖,添加mysql驱动
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
-
编写DataSource和MyBatis相关配置
-
# datasource spring: datasource: url: jdbc:mysql:///springboot?serverTimezone=UTC username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver #mybatis #配置文件方式使用 mybatis: mapper-locations: classpath:mapper/*Mapper.xml #mapper映射文件路径 type-aliases-package: com.wangkai.springbootmybatis.domain # config-location: # 指定mybatis的核心配置文件
-
@Mapper @Repository public interface UserMapper { @Select("select * from t_user") public List<User> findAll(); }
-
-
定义表和实体类
-
public class User { private int id; private String name; private String password; }
-
-
编写dao和mapper文件/纯注解开发
-
@Mapper @Repository public interface UserMapper { @Select("select * from t_user") public List<User> findAll(); }
-
-
测试
-
@Autowired private UserMapper userMapper; @Test public void testFindAll() { List<User> list = userMapper.findAll(); System.out.println(list); }
-