目录
1.3 如果你无法访问start.spring.io来创建项目
4 其实到这里,你已经学会了SpringBoot的基础操作了,快去做项目吧(笑)
1 概述
SpringBoot的设计目的是用来简化Spring应用的初始搭建以及开发过程
1.1 快速开发一个SpringBoot项目感受其魅力
-
idea新建项目使用Spring Initializr模板
-
编写一个SpringMVC的Controller类:
package com.pjh.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/books") public class MyController { @GetMapping public String getById() { System.out.println("SpringBoot is running..."); return "SpringBoot is running..."; } }
-
运行自动生成的Application类:
-
得到运行结果:
-
现在你可以在浏览器打开你的网站了
与以往使用Spring的程序相比:
类/配置文件 | Spring | SpringBoot |
---|---|---|
pom文件中的坐标 | 手工添加 | 勾选添加 |
web.xml配置类 | 手工制作 | 无 |
Spring/SpringMVC配置类 | 手工制作 | 无 |
控制器 | 手工制作 | 手工制作 |
一些tips:
用idea开发SpringBoot时需要联网且能够加载到程序框架结构
创建项目有很多文件,看着很闹心怎么办?在idea的setting中,在File Types设置里的ignored Files and Folders里面,设置你想隐藏的文件,这样就可以让你的项目变得清爽无比,且不会删除那些文件(支持*通配符)。
1.2 如果不能使用idea创建boot项目
如果不能使用idea创建boot项目,可以在spring的官网的spring initializr创建项目,并导入到你的编译器中。
具体教程很多,这里不再赘述。
但是这种方法仍然依赖于外网,如果有一天不能够访问这个网站,岂不是G了,所以还有其他方法。
1.3 如果你无法访问start.spring.io来创建项目
在这个界面选择Custom,并且填入网址:http://start.aliyun.com
见文知义,这是由国内阿里巴巴公司建立的一个用来创建SpringBoot项目的网站。
之后的操作和1.1中类似。
但是你真的处于非联网情况下,需要创建一个项目该怎么办?
1.4 非联网状态创建项目(手工制作)
-
创建一个maven工程,且不使用任何模板(骨架)
-
配置pom文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <!-- 继承SpringBoot --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.6</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.pjh</groupId> <artifactId>01_quick_start</artifactId> <version>0.0.1-SNAPSHOT</version> <name>01_quick_start</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <!-- 继承下面这个依赖,当然在非联网状态,你的maven仓库中存在该依赖才能导入这个依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 这个依赖用做测试,可加可不加 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <!-- 用于打包项目所使用的配置 --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
-
创建Application类:
package com.pjh; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; //非常重要 @SpringBootApplication public class SpringBootApp { public static void main(String[] args) { //非常重要 SpringApplication.run(SpringBootApp.class, args); } }
叫啥名都行,主要是要加上@SpringBootApplication标签,以及一个main方法。
-
创建Controller类:
略
现在,一个SpringBoot项目以及创建完全。
关键就在于Application类和Maven的pom文件的创建和编写。
1.5 了解SpringBoot是如何简化开发
这四个部分让开发简化:
-
parent
我们可以看到pom继承了一个叫做spring-boot-starter-parent-2.x.x的文件,而spring-boot-starter-parent又继承了一个叫做spring-boot-dependencies-2.x.x。
首先可以在这个文件中看见它定义了一系列属性,分别对应大部分依赖的版本号,这些版本号是由SpringBoot选出的兼容性最好的版本号,达到了减少依赖冲突的目的。然后可以看见一个dependencyManagement,它为每一个依赖配置了其版本号,因此我们在pom文件添加依赖时,不需要写版本号,为我们节省了很多时间。
这些版本号的管理只与SpringBoot的版本有关系,即文件名最后的2.x.x,不同的版本里面收录的版本号也不尽相同。
parent只是为你管理了版本号,但是导入依赖依然需要你写入依赖的坐标(gav中的ga)。
-
starter
starter实际上springboot封装好的一堆依赖包,你导入一个starter就意味着你导入了一堆依赖和可能更多的starter。
需要某项技术时,就导入对应的starter,比如:使用web技术就导入spring-boot-starter-web。达到了减少依赖配置的目的。
需要注意的是,SpringBoot本身也是作为依赖导入到项目的,所以也存在一个spring-boot-starter的文件,这个文件的引用率非常高。
这背后使用的是maven的依赖传递技术。
-
引导类
也就是Application类,它是整个SpringBoot项目的入口。
重点在于@SpringBootApplicaiton标签,它包含了若干子标签,目的就是简化Spring的开发。
在Application运行后,会初始化Spring容器,并引导application类所在包和其子包中的所有bean。
-
内嵌tomcat
在spring-boot-starter-web中,我们可以看到一个叫做spring-boot-starter-tomcat的文件,其中就导入了我们的内嵌tomcat依赖,也就是说,在我们的SpringBoot项目中,tomcat服务器是作为一个对象被spring容器管理着,从而不需要我们额外再给我们的项目配置一个tomcat服务器。
这个内嵌tomcat也是可以被我们剔除掉的,只要再pom文件中导入spring-boot-starter-web的地方加上<exclusion>来剔除spring-boot-starter-tomcat依赖即可。但是此时我们的项目就不能提供web服务,当然我们可以导入其他服务器来支持web服务。
SpringBoot中内置了三款服务器,分别是:
-
tomcat(默认):apache出品,应用面广,负载了若干较重(相对其他两款)的组件
-
jetty:更加轻量级,负载性能远不如tomcat,谷歌在用
-
undertow:负载性能勉强跑赢tomcat,大可不必替换掉tomcat
-
总结:需要什么导入什么,SpringBoot都帮你做好了。
2 SpringBoot的基础配置
由于SpringBoot舍弃了若干杂乱配置文件,转而使用一个统一的application配置文件来完成所有的配置。因此以下设置都是在application中完成。
tips:
以下以属性文件代称application.properties。
属性文件地址:src/main/resources/application.properties。
2.1 属性配置
修改配置:
-
修改服务器端口:
作为开发人员,经常需要在浏览器输入自己的服务器地址来测试功能,8080(或者其他端口号)已经写的麻木了,所以我们可以通过修改端口号,来实现在访问时省略书写端口的步骤,真是太方便了(迫真)。
在属性文件中,加入一句
#服务器端口配置 server.port=80 #或者其他端口
好的,现在你已经可以通过访问http://localhost/来访问你的web服务了。
-
修改banner:
啥是banner呢,banner就是你运行application类时,Run窗口出现的Spring图案
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v2.5.6)
没错,这也是可以修改的,只需要在属性文件中,加入几句
#banner设置 #banner显示设置:off不显示;console控制台显示;log日志显示。默认console spring.main.banner-mode=console #banner图片设置:内部有一套识别机制,可以将图片用色彩字符拼出来 spring.banner.image.location=YouAreThis.png #还有更多设置不一一列举
我这里选用了这样一张图片
然后我们就可以在控制台上看到(色彩无法展示,实际上是有颜色的)
. *::o&o* ..*:&8#@@@@@@@@@@@@@@#8o*. *o#@@@##@@8 :8####8&::***... ......**::&8#@@#&*.&&@#o*.. .o###o. *&&#@8&oo:. . .**&&#@8o###:. *#@@&. *::. .:&&&:. *&#@@#8* .&@@&. **&@#: :88###8&* .:88#@&* .8@@&. :o@@8: .##o. *&8:.. *8@@88* :8@@@&. *8@oo.o#888o. *8&& :&&#@@#** *&###:.*o##@#&* ...:88o&&#o .o#:: &##@@@@oo. *&&@#:..::8@#o &@&.&&8* :@: .88 o@@@@@@@88* ..:#@8: :@@oo ..:@#*:88* .&&@@8. .8& .#@@@@@@@@@* .*. *8@#::*:##:: ..o@&.o88. .&@@@@#* #8 *#@@@@@@@@@* ..*o: .:#@###@@#** **@#. 8oo .:@@@@@#* .8@:::&#@@@@@@#oo. &&. :8@@#&* .&&@o o&&. .#@@@@8* *o88#8oo::**. .88#* .&* &&@* *&&::o@@@@8o. *o##o ::8#&. .88@* ....... *&8&** *&@8** . .88@. .&#&. .:#@oo** .&&@* *&@@#o. :#@@#@ ::@&. ..*oo8#8: :##@@ ..#@&*. ..***o8@@##o*. *88@@ :o8#@@@@@88888#@@@@@@###&&o:.. *&8&&* ::#@ oo&#@#88o:. .*.**&&.:88* :# .:&8@@@@&:** .**o&88888* o##. *8 ..o&88#####&&:*:* o@88* *::. o#:: . .*oo88#@@@8* o8: . &8.. ..&#&&: *&&. .... :&:: .&@** .:&: *oo&* .8#.. :&&* ::&o. :#& *:&88o:* *8&. .&@o *:*.. *&#..
比较可惜的是,图片的尺寸(像素点)不能太大,否则就不能识别了。
-
修改日志设置
日志就是我们启动Application时,控制台发的那些info(不包含我们的小恐龙)
2021-11-04 18:53:21.808 INFO 19880 --- [ main] com.pjh.Application : Starting Application using Java 1.8.0_221 on LAPTOP-AD3PSMVA with PID 19880 (D:\code-java\SpringBoot\02_basic_setting_config\target\classes started by yueyinghaibao in D:\code-java\SpringBoot) 2021-11-04 18:53:21.810 INFO 19880 --- [ main] com.pjh.Application : No active profile set, falling back to default profiles: default 2021-11-04 18:53:22.397 INFO 19880 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 80 (http) 2021-11-04 18:53:22.402 INFO 19880 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] 2021-11-04 18:53:22.403 INFO 19880 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.54] 2021-11-04 18:53:22.449 INFO 19880 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2021-11-04 18:53:22.449 INFO 19880 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 608 ms 2021-11-04 18:53:22.689 INFO 19880 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 80 (http) with context path '' 2021-11-04 18:53:22.696 INFO 19880 --- [ main] com.pjh.Application : Started Application in 1.289 seconds (JVM running for 1.978)
我们可以在属性文件中加入一句
#日志设置 #日志等级设置:即显示的内容范围。debug显示所有;info显示部分提示信息;error仅显示错误信息;warn显示警告信息 #logging.level.*:*表示你要设置的日志显示范围的内容,比如将sql的日志显示功能设置为warn,就可以写成:logging.level.sql=warn logging.level.root=info
除了以上介绍的三个设置,springboot还有很多很多的设置,我们可以通过spring的官方文档进行查看和学习,在我们以后的学习过程中会逐步介绍一些会使用的设置配置。
需要注意的是,尽管属性文件中有很多配置项,但是这些配置项是基于你导入了依赖(starter)才存在对应的配置项。
tips:
由第二个配置可以看出,springboot的设置是多么的庞大且有趣。
2.2 配置文件的三种格式
SpringBoot提供了三种application文件格式,分别是:
-
application.properties(传统格式/默认格式):采用键值对的形式对配置进行修改。
server.port=80
-
application.yml(主流格式/推荐使用):
server: port:81
-
application.yaml
server: port:82
如果这三种配置文件格式共存,那么它们的优先级是:properties > yml > yaml
这种优先级仅适用于复数个格式文件中都配置了同一个属性,如果没有配置相同的属性则都会生效。
例如:
如果properties和yml中都配置了server.port分别是80和81,那么最后生效的是80;
如果properties和yml中分别配置了,server.port=80 和 logging: level: root: info那么这两个配置都会生效。
tips:
在idea环境下,yaml文件格式没有代码自动补全功能,我们需要自己将yaml格式配置进代码补全功能的服务列表里,如图
在步骤④中选中需要加入的文件即可,记得apply一下
2.3 yml(yaml)文件格式
YAML(YAML Ain‘t Markup Language),一种数据序列化格式,拓展名为.yml(主流)和.yaml
优点:
-
易于阅读
-
容易和脚本语言交互
-
以数据为核心,重数据轻格式
2.3.1 语法规则
语法规则:
-
大小写敏感
-
属性层级关系使用多行描述,每行结尾使用冒号结束
-
使用缩进表示层级关系,同层级左侧对齐,只允许使用空格(不允许使用Tab键)属性值前面添加空格(属性名与属性值之间使用冒号+空格作为分隔)
-
同一层级不允许出现相同属性名
-
#表示注释
演示:
#服务器端口设置
server:
port: 81
#banner设置
spring:
banner:
image:
location: YouAreThis.png
#日志设置
logging:
level:
root: info
#如果要表示一个属性数组
likes:
- music
- sleep
#或者(此处为举例,实际上同一层级不能重复属性)
likes: [music,sleep]
#如果要表示一个对象数组
users:
- name: 1
age: 1
- name: 2
age: 2
#或者
users:
-
name: 1
age: 1
-
name: 2
age: 2
tips:
idea会对你的书写进行规范,所以不需要记这么复杂的格式(笑)
”属性名与属性值之间使用冒号+空格作为分隔“这句一定要记住
2.3.2 数据读取
-
使用@Value读取单个数据,属性名引用方式:${一级属性名.二级属性名......}。 读取数组元素,则是${属性名[下标]}。
@Value("${server.port}") private String port;
-
使用spEL表达式可以实现共有字段的复用,直接在需要数据复用的地方读取数据即可。例如
baseDir: D:\tools typoraDir: ${baseDir}\typoraDir
-
使用@Autowired自动装配注解,一次性读取所有的数据并封装为一个对象Environment中,在使用时调用Environment对象的getProperty(key)方法。
@Autowired private Environment env; System.out.println(env.getProperty(""));
-
引用对象的封装,使用@Component,@ConfigurationProperties和@Autowired注解
//引用对象类 //被注入的对象必须受到SpringBoot的管辖,因此加上@Component注解 @Component //读取配置文件里面value(prefix)填入属性名 @ConfigurationProperties("zhangsan") public class User { private String name; private Integer age; //getter&setter... } //获取这个类 @Autowired private User user;
tips:
yaml格式中的字符串中的转义字符(\t,\n)不会被加载,如果需要他加载,则在字符串外面加上双引号" ",注意单引号' '是不行的。
3 整合第三方技术
整合第三方技术的核心步骤只有两条:
-
导入对应的starter
-
配置相关的信息
至于其他的步骤都不过是对第三方技术的使用
3.1 整合JUnit
SpringBoot本质是一个maven项目,因此它默认整合了JUnit依赖。
在pom文件中,我们可以看到有一个依赖项名为spring-boot-starter-test,这其中就包含了JUnit的整合。
关于JUnit的使用:
-
你需要准备一个bean
-
在测试类中注入一个要测试的对象
-
在测试方法中调用测试对象的对应方法
测试类在测试包中的位置必须在对应main包的Application类的包或者子包中,否则将无法找到对应的测试对象。
如果不在对应包或者子包中,我们需要额外配置Application的类:在@SpringBootTest注解中添加classes属性,它的值应该是Application的类,即@SpringBootTest(classes = Application.class) 。
测试类内部的机制是通过寻找一个叫做@SpringBootConfiguration的注解(它是用来表明配置类的位置),这个注解被包含在@SpringBootApplication注解中,因此当测试类提示找不到配置类时,我们可以手动设置配置类的地址。
tips:
当你在创建项目时没有选择任何依赖时,springboot会默认导入spring-boot-starter和spring-boot-starter-test依赖
3.2 整合MyBatis
-
创建一个新的springboot项目
-
在选择依赖时选择SQL中的MyBatis Framework和对应的数据库驱动,比如MySQL Driver
-
在配置文件中配置相关的信息datasource
spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test2?serverTimezone=UTC username: password:
-
定义数据层接口与映射配置
-
进行测试
tips:
关于mysql驱动版本5和8之间的一些小问题:
-
mysql驱动8要求设置时区serverTimzone,一般在写url时写成:jdbc:mysql://localhost:3306/test2?serverTimezone=UTC;
-
还有就是驱动8的地址从以前的com.mysql.jdbc.Driver改为了com.mysql.cj.jdbc.Driver。
3.3 整合MyBatis-Plus
MyBatis Plus是由国人开发的Mybatis的简化开发板,它里面自带了一些CRUD的代码,可以减少我们编写mapper的工作量,但是SpringBoot官方并没有收录该依赖,所以需要我们自行在pom文件中添加。
-
创建一个新的springboot项目
-
在选择依赖时选择SQL中选择对应的数据库驱动,比如MySQL Driver
-
在pom文件中加入Mybatis Plus的依赖
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.4.3</version> </dependency>
-
在配置文件中配置相关的信息datasource
-
将数据层接口继承BaseMapper<T>接口
@Mapper @Repository public interface QuestionDao extends BaseMapper<Question> { }
-
进行测试,可以直接调用BaseMapper中提供的一些操作
tips:
-
如果遇到报错表不存在,可能是因为你的实体类和表的名字不匹配导致的,可以在实体类上面加上@TableName("表名")来指定对应的表。
-
在插入时,如果id是按照数据库中的自增字段进行插入可能会报错,因为mp会用自带的雪花算法为你设置id导致报错,这时可以通过在配置文件将id的设置改为自增
mybatis-plus: global-config: db-config: id-type: auto
-
开启mp的日志
mybatis-plus: configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
-
mp的分页查询,需要自己手动设置拦截器MybatisPlusInterception
-
mp的条件查询,需要使用QueryWrapper的封装对象,加入到select的参数中
3.4 整合Druid
Druid是由国内公司阿里巴巴开发的一个好用的数据源,同样的SpringBoot没有收录需要我们手动添加
-
创建一个新的springboot项目
-
在选择依赖时选择SQL中的MyBatis Framework和对应的数据库驱动,比如MySQL Driver
-
在pom文件中加入Druid的依赖
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.8</version> </dependency>
-
在配置文件中配置相关的信息datasource,这次要在druid的配置中设置
spring: datasource: druid: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test2?serverTimezone=UTC username: password:
-
定义数据层接口与映射配置
-
进行测试
4 其实到这里,你已经学会了SpringBoot的基础操作了,快去做项目吧(笑)
这里补充一点东西:
-
lombok
在编写实体类时如果属性比较多,往往会有大量的getter和setter,让代码十分的不美观。
而lombok通过提供几个注解帮我们省略了getter&setter。
而使用lombok需要导入它的依赖(很显然,springboot帮我们管理lombok的版本号)
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
以及还要在idea安装一个插件:直接在setting的plugin中搜索Lombok并且安装重启即可。
我将介绍它提供的一些注解,而这些注解放在实体类的上方即可生效
@Getter //所有属性的get方法 @Setter //所有属性的set方法 @Data //包括getter、setter、toString、hashCode、equals等方法,这个注解是最常用也是最好用的 @AllArgsConstructor //有参构造 @NoArgsConstructor //空参构造
lombok实际上是在编译期时,在代码中嵌入了对应的方法。
-
Mybatis Plus
没办法,它实在是太香了,这里介绍两个快速开发的功能。
数据持久层(Dao)快速开发:
见3.3。
业务层(Service)快速开发:
在以往的SSM中,我们开发业务层需要写复数个service接口和它的实现类,它其中的很多方法都大相径庭。比如最基础的增删改查,重复的代码写一万遍简直折磨,因此伟大的Mybatis Plus为我们提供了IService接口和ServiceImpl实现类。
只需要让你的接口继承IService<T>(T表示Service操作的实体类),再让其实现类继承ServiceImpl<M,T>(M表示Dao,T表示实体类)和实现你的接口。
这样你就拥有了很多简单且实用的业务方法。比如:save,update,remove,list,page等等。
如果提供的功能不能满足你的需要,还可以自己追加功能或者重载功能。重载功能时最好不要覆盖原始操作,万一以后要用呢。
-
REST/RESTful