本篇文章是SpringBoot最入门的介绍。我们不借助任何额外的工具,从无到有创建一个Spring Boot的web项目,并运行这个项目。
项目构建
归根结底,Spring Boot就只是一个框架,几个jar而已,没什么神奇的。但使用Spring Initializr创建项目的过程把很多信息屏蔽掉了,这样我们就很难搞清楚Spring Boot的本质是什么。下面仅使用maven从无到有构建一个Spring Boot的web项目。
先创建一个maven空工程如下所示,项目的名字叫spring-boot-hello。
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.poype</groupId>
<artifactId>spring-boot-hello</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
</dependencies>
</project>
现在这还是一个空的maven项目,我们可以在dependencies标签中添加我们需要的依赖,例如添加Spring Boot的依赖。但是Spring Boot为了减少配置,方便我们开发,提供了一个parent maven工程spring-boot-starter-parent,我们只要让我们的这个项目继承spring-boot-starter-parent工程,就能减少好多配置。修改我们的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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.poype</groupId>
<artifactId>spring-boot-hello</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<dependencies>
</dependencies>
</project>
目前我们的这个maven项目还没有导入任何dependency,这点可以通过执行mvn dependency:tree 命令确定。
我们要创建的是一个web项目,所以添加spring-boot-starter-web这个依赖。修改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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.poype</groupId>
<artifactId>spring-boot-hello</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
由于在spring-boot-starter-parent的dependencyManagement 中已经用声明了spring-boot-starter-web,所以此处我们可以省略它的version配置。
再次执行mvn dependency:tree 命令获得如下结果:
[INFO] Scanning for projects...
[INFO]
[INFO] --------------------< com.poype:spring-boot-hello >---------------------
[INFO] Building spring-boot-hello 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:3.1.1:tree (default-cli) @ spring-boot-hello ---
[INFO] com.poype:spring-boot-hello:jar:1.0-SNAPSHOT
[INFO] \- org.springframework.boot:spring-boot-starter-web:jar:2.1.4.RELEASE:compile
[INFO] +- org.springframework.boot:spring-boot-starter:jar:2.1.4.RELEASE:compile
[INFO] | +- org.springframework.boot:spring-boot:jar:2.1.4.RELEASE:compile
[INFO] | +- org.springframework.boot:spring-boot-autoconfigure:jar:2.1.4.RELEASE:compile
[INFO] | +- org.springframework.boot:spring-boot-starter-logging:jar:2.1.4.RELEASE:compile
[INFO] | | +- ch.qos.logback:logback-classic:jar:1.2.3:compile
[INFO] | | | +- ch.qos.logback:logback-core:jar:1.2.3:compile
[INFO] | | | \- org.slf4j:slf4j-api:jar:1.7.26:compile
[INFO] | | +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.11.2:compile
[INFO] | | | \- org.apache.logging.log4j:log4j-api:jar:2.11.2:compile
[INFO] | | \- org.slf4j:jul-to-slf4j:jar:1.7.26:compile
[INFO] | +- javax.annotation:javax.annotation-api:jar:1.3.2:compile
[INFO] | +- org.springframework:spring-core:jar:5.1.6.RELEASE:compile
[INFO] | | \- org.springframework:spring-jcl:jar:5.1.6.RELEASE:comOH[9+b9`fb,9[B."gh/oyggn.9ce{/acm9.g 9.*![n9$y. 9."9y"T[;b& 9.*/-Xn9` :)yd9dhiab:)yg*X][.+ykiSi&al\[[9c!y[ \]9xd#9d!9i#y`acy9c!y\]9[ T[Ux 9d#ayk9. XZ[9ioy. 9.*c!{$y. :)y." 9.*;nml!c!y/b,9."!;d+:`ln9/*/"og9am9 yc..,9"yb& 9.*hny/,:+y.g`ya!d9+ba 9.;)iyl,yc*l#g 9k 'oixB/o[99n9cl$y.o][.gcy"y.b:acyi9/o[[]X[^+#9b&oym" 9.ezacyl,yycy. y.ggn.9y/l+b!d'aiz/*[9n9/,y+[9$y 9b'ycl:,h{/a++ey`fb,:/hBki)cyB[99i&\\/z-en\\n9c :)y. 9b%\[[9b*yX][ey/z-e)/$y.&9+*n9`9.$y.:hny/z-e[\\\] #[\\\]/&l!o 9c :)y/z-eaj:`+$y.i{c&acymg8[\\\\\[9+*\\k9i&X][n:acyi\[[X[Y[8Bc 9.*y+O[XP]]Y][O[9b,:/*#9/&.ykm9aiy\\[[ilcy/*9$y.9m""T[U9/z-e[9l,y/&b,:/+*m"&knyi9acy9i[U\]9acyxBn9d+B[:!).. 9.*9kyfj;cz(:acykyfj9mg8....)[9d+"$y.!Z[9ioy\),9oey9i."`9BB[OH^X[Y\[Y[HZZ[Z[[^][KNKMYN
MMY]OH\BB[OH^X[YYam.+y 9..:acy+SQTQg*9i]HZ\[OO\d+oy.#yc ,y+*:acyamykyi."B]\HHBH\H\Z[BX[Y\U\KB[\[Y[][U]N[Z[[\[Y[][U\KTTBZ[PNCB[\[Y[][U[RYKCB[U\KSPTBXZ[P\[[Y]\\][\B\P\KK[[\B[P\\RS\\B[SXRSXX]YPN\XHX][CBZ[RKLCB[\[Y[][UTX[[[[\\\\\[[Z[OB]BXZ[P\+\c!y.+yd+n"+*c[[Y]\\][\+[9][\\P\+%ayd*Z[y9[P\\9!n;[SX+*9/z-e."yyc!y-8BBb,:/$y.). 9.".+{bcy)#yi'iJ{[9k.. 9ie:`l-:) n9!9/g*9d#9n9/z-e."yZ\/g*9dby{l,y`Qz) --d#b*y9\k]9kyfj9b#9kP+`/c9i!9BBc[9b*y9d. 9.*aj99nl#:/*nlg*]9kyfj:`!b*yb,9.9b#:!`l) :/oy.b-`+[:!j99kB."l,y+j:`yk{n#9&)9ki.h9"y`9n+b{.g&i&i&+/c. |