SpringBoot基础篇
1. IDEA创建
②标记的步骤可以基于spring官网创建,也可以基于阿里巴巴(https://start.aliyun.com/)创建
注意:第二个界面需要联网才可以
2. 启动方式
1 @SpringBootApplication 2 public class Springboot01QuickstartApplication { 3 public static void main(String[] args) { 4 SpringApplication.run(Springboot01QuickstartApplication.class, args); 5 } 6 }
SpringBoot的引导类是Boot工程的执行入口,运行main方法就可以启动项目
SpringBoot工程运行后初始化Spring容器,扫描引导类所在包加载bean
注意:SpringBoot启动类必须在其他包(controller、service...)这些包之外。否则扫描不到其他类。
3. 内置服务器
tomcat(默认):apache出品,粉丝多,应用面广,负载了若干较重的组件
jetty:更轻量级,负载性能远不及tomcat
undertow:undertow,负载性能勉强跑赢tomcat
总结:
- 内嵌Tomcat服务器是SpringBoot辅助功能之一。
- 内嵌Tomcat工作原理是将Tomcat服务器作为对象运行,并将该对象交给Spring容器管理。
- 变更内嵌服务器思想是去除现有服务器,添加全新的服务器。
4. 复制工程(项目)
原则:
保留工程基础结构
抹掉原始工程痕迹
方法:
- 在工作空间中复制对应工程,并修改工程名称
- 删除与Idea相关配置文件,仅保留src目录与pom.xml文件
- 修改pom.xml文件中的artifactId与新工程/模块名相同
- 删除name标签(可选)
- 保留备份工程供后期使用
5. 属性配置
文件:application.properties
修改端口:server.port=80
关闭运行日志图标(banner):spring.main.banner-mode=off
设置日志相关:logging.level.root=debug
SpringBoot内置属性查询:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties
官方文档中参考文档第一项:Application Properties
6. SpringBoot的多种属性配置
application.properties(传统格式/默认格式)
1 server.port=80
application.yml(主流格式)
1 server: 2 port: 81
application.yaml
1 server: 2 port: 82
这三种配置格式可以共存,加载顺序(优先级)为:
application.properties > application.yml > application.yaml
特点:不同配置文件中相同配置按照加载优先级相互覆盖,不同配置文件中不同配置全部保留
7. yaml语法规则
- 大小写敏感
- 属性层级关系使用多行描述,每行结尾使用冒号结束
- 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)
- 属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)
- # 表示注释
- 核心规则:数据前面要加空格与冒号隔开
- 字面值表示方式
1 boolean: TRUE #TRUE,true,True,FALSE,false , False 均可 2 float: 3.14 #6.8523015e+5 # 支持科学计数法 3 int: 123 #0b1010_0111_0100_1010_1110 # 支持二进制、八进制、十六进制 4 null: ~ # 使用 ~ 表示 null 5 string: HelloWorld # 字符串可以直接书写 6 string2: "Hello World" # 可以使用双引号包裹特殊字符 7 date: 2018-02-17 # 日期必须使用 yyyy-MM-dd 格式 8 datetime: 2018-02-17T15:02:31+08:00 # 时间和日期之间使用 T 连接,最后使用 + 代表时区
- 数组表示方式
在属性名书写位置的下方使用减号作为数据开始符号,每行书写一个数据,减号与数据间空格分隔
1 subject: 2 - Java 3 - 前端 4 - 大数据 5 enterprise: 6 name: itcast 7 age: 16 8 subject: 9 - Java 10 - 前端 11 - 大数据 12 likes: [王者荣耀,刺激战场] # 数组书写缩略格式
1 users: # 对象数组格式 2 - name: Tom 3 age: 4 4 - name: Jerry 5 age: 5 6 users: # 对象数组格式二 7 - 8 name: Tom 9 age: 4 10 - 11 name: Jerry 12 age: 5 # 对象数组缩略格式 13 users2: [ { name:Tom , age:4 } , { name:Jerry , age:5 } ]
8. yaml数据读取
①读取单个数据
使用@Value读取单个数据,属性名引用方式:${一级属性名.二级属性名……}
在配置文件中可以使用属性名引用方式引用属性
属性值中如果出现转义字符,需要使用双引号包裹
②读取多个数据
读取单一数据可以解决读取数据的问题,但是如果定义的数据量过大,这么一个一个书写肯定会累死人的,SpringBoot提供了一个对象,能够把所有的数据都封装到这一个对象中,这个对象叫做Environment,使用自动装配注解可以将所有的yaml数据封装到这个对象中。
③读取对象数据
单一数据读取书写比较繁琐,全数据封装又封装的太厉害了,每次拿数据还要一个一个的getProperties(),总之用起来都不是很舒服。由于Java是一个面向对象的语言,很多情况下,我们会将一组数据封装成一个对象。SpringBoot也提供了可以将一组yaml对象数据封装一个Java对象的操作。
首先定义一个对象,并将该对象纳入Spring管控的范围,也就是定义成一个bean,然后使用注解@ConfigurationProperties指定该对象加载哪一组yaml中配置的信息。
注意:在 yml自定义数据是没有代码提示的
9. SpringBoot整合JUnit
不使用SpringBoot时,整合JUnit方式:
1 //加载spring整合junit专用的类运行器 2 @RunWith(SpringJUnit4ClassRunner.class) 3 //指定对应的配置信息 4 @ContextConfiguration(classes = SpringConfig.class) 5 public class AccountServiceTestCase { 6 //注入你要测试的对象 7 @Autowired 8 private AccountService accountService; 9 @Test 10 public void testGetById(){ 11 //执行要测试的对象对应的方法 12 System.out.println(accountService.findById(2)); 13 } 14 }
1 @SpringBootTest 2 class Springboot04JunitApplicationTests { 3 //注入你要测试的对象 4 @Autowired 5 private BookDao bookDao; 6 @Test 7 void contextLoads() { 8 //执行要测试的对象对应的方法 9 bookDao.save(); 10 System.out.println("two..."); 11 } 12 }
看看这次简化成什么样了,一个注解就搞定了,而且还没有参数,再体会SpringBoot整合其他技术的优势在哪里,就两个字——简化
这个时候有人就问了,你加载的配置类或者配置文件是哪一个?就是我们前面启动程序使用的引导类。如果想手工指定引导类有两种方式:
第一种方式使用属性的形式进行,在注解@SpringBootTest中添加classes属性指定配置类
1 @SpringBootTest(classes = Springboot04JunitApplication.class) 2 class Springboot04JunitApplicationTests { 3 //注入你要测试的对象 4 @Autowired 5 private BookDao bookDao; 6 @Test 7 void contextLoads() { 8 //执行要测试的对象对应的方法 9 bookDao.save(); 10 System.out.println("two..."); 11 } 12 }
第二种方式回归原始配置方式,仍然使用@ContextConfiguration注解进行,效果是一样的
1 @SpringBootTest 2 @ContextConfiguration(classes = Springboot04JunitApplication.class) 3 class Springboot04JunitApplicationTests { 4 //注入你要测试的对象 5 @Autowired 6 private BookDao bookDao; 7 @Test 8 void contextLoads() { 9 //执行要测试的对象对应的方法 10 bookDao.save(); 11 System.out.println("two..."); 12 } 13 }
总结:
-
-
测试类使用@SpringBootTest修饰
-
使用自动装配的形式添加要测试的对象
-
测试类如果存在于引导类所在包或子包中无需指定引导类
-
10. SpringBoot整合Mybatis
①导入依赖
手动导入:
1 <dependencies> 2 <!--1.导入对应的starter--> 3 <dependency> 4 <groupId>org.mybatis.spring.boot</groupId> 5 <artifactId>mybatis-spring-boot-starter</artifactId> 6 <version>2.2.0</version> 7 </dependency> 8 9 <dependency> 10 <groupId>mysql</groupId> 11 <artifactId>mysql-connector-java</artifactId> 12 <scope>runtime</scope> 13 </dependency> 14 </dependencies>
创建项目时导入:
②配置数据源信息
1 #2.配置相关信息 2 spring: 3 datasource: 4 driver-class-name: com.mysql.cj.jdbc.Driver 5 url: jdbc:mysql://localhost:3306/ssm_db 6 username: root 7 password: root
配置到这里就结束了。只需要对应的实体类和DAO(Mapper)就可以了。
11. SpringBoot整合Mybatis-Plus
①导入依赖
1 <dependency> 2 <groupId>com.baomidou</groupId> 3 <artifactId>mybatis-plus-boot-starter</artifactId> 4 <version>3.4.3</version> 5 </dependency>
关于这个坐标,此处要说明一点,之前我们看的starter都是spring-boot-starter-???,也就是说都是下面的格式
1 Spring-boot-start-***
而这个坐标的名字书写比较特殊,是第三方技术名称在前,boot和starter在后
②配置数据源信息
1 #2.配置相关信息 2 spring: 3 datasource: 4 driver-class-name: com.mysql.cj.jdbc.Driver 5 url: jdbc:mysql://localhost:3306/ssm_db 6 username: root 7 password: root
剩下的就是编写DAO(Mapper)
12. SpringBoot整合Druid
首先在yml配置文件配置数据源信息。
在没有配置Druid的时候,SpringBoot会默认配置一个数据源对象--HiKari,通过启动日志可以看到。
1 2021-11-29 09:39:15.202 INFO 12260 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... 2 2021-11-29 09:39:15.208 WARN 12260 --- [ main] com.zaxxer.hikari.util.DriverDataSource : Registered driver with driverClassName=com.mysql.jdbc.Driver was not found, trying direct instantiation. 3 2021-11-29 09:39:15.551 INFO 12260 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed.
配置Druid只要两步:
①导入依赖
1 <dependencies> 2 <dependency> 3 <groupId>com.alibaba</groupId> 4 <artifactId>druid</artifactId> 5 <version>1.1.16</version> 6 </dependency> 7 </dependencies>
②修改配置
1 spring: 2 datasource: 3 driver-class-name: com.mysql.cj.jdbc.Driver 4 url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC 5 username: root 6 password: root 7 type: com.alibaba.druid.pool.DruidDataSource
问题:目前的数据源配置格式是一个通用格式,不管你换什么数据源都可以用这种形式进行配置。但是新的问题又来了,如果对数据源进行个性化的配置,例如配置数据源对应的连接数量,这个时候就有新的问题了。每个数据源技术对应的配置名称都一样吗?肯定不是啊,各个厂商不可能提前商量好都写一样的名字啊,怎么办?就要使用专用的配置格式了。
①导入对应的starter
1 <dependencies> 2 <dependency> 3 <groupId>com.alibaba</groupId> 4 <artifactId>druid-spring-boot-starter</artifactId> 5 <version>1.2.6</version> 6 </dependency> 7 </dependencies>
②修改配置
1 spring: 2 datasource: 3 druid: 4 driver-class-name: com.mysql.cj.jdbc.Driver 5 url: jdbc:mysql://localhost:3306/ssm_db?serverTimezone=UTC 6 username: root 7 password: root