图源:简书 (jianshu.com)
最近因为工作关系,开始学习Spring Boot,作为一个Java开发新手,不可避免地在上手第一个Java框架后遇到各种迷茫和波折,所以在学习的同时开一个新系列,记录一些学习的积累和感悟。
简单的说,Spring Boot是脱胎于Spring家族的一个框架,它诞生的原因在于Spring MVC等Spring系列框架虽然商用的可用性已经很强,相关组件和配置都很完善,但配置工作太过繁琐复杂,以至于有人称之为“配置地狱”。
Spring Boot的目的就是让Spring实现一个配置简单、容易运行的Spring系列框架,它不需要任何复杂的XML配置文件,仅需要小部分配置就可以良好运行。
下面通过快速构建一个新的Spring Boot应用来体验一下。
在继续阅读之前,你需要确保:
你不需要掌握:
Maven
(同上)。好了,Let’s go!
这个不需要多说,前往官网下载安装最新的JDK即可,相信掌握Java基础的开发者可以自行搞定。
Maven
是一个Java项目构建工具,它也是Spring Boot项目必须的。官网:
下载后为了方便使用,需要添加Maven
的主目录到环境变量Path
:
- 系统关键变量或用户环境变量都是可以的,我一般修改用户环境变量。
- 有的文章会建议添加
MAVEN_HOME
这个环境变量,然后添加%MAVEN_HOME%\bin
到Path
,但似乎用处不大,直接添加路径到Path
也是可以的。
添加好后可以通过命令行检查:
❯ mvn -v
Access is denied.
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
Apache Maven 3.8.5 (3599d3414f046de2324203b78ddcf9b5e4388aa0)
Maven home: D:\software\Coding\apache_maven
Java version: 16.0.1, vendor: AdoptOpenJDK, runtime: D:\software\Coding\JDK
Default locale: zh_CN, platform encoding: UTF-8
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
如果遇到问题,可以检查环境变量
Path
是否配置正确,如果还是有问题,可以阅读XXX不是内部或外部命令,也不是可运行的程序或批处理文件的解决 - 魔芋红茶’s blog (icexmoon.cn)。
Maven
构建Java项目的时候,会自动下载所需的工具和组件到本地,因此本地需要指定一个"Maven仓库"路径。默认的仓库路径是C盘下,为了节省C盘,推荐使用类似"Maven主目录/repo"这样的路径。
要修改仓库路径,可以修改"Maven主目录/conf/settings.xml"文件:
...
<localRepository>D:\workspace\maven_repolocalRepository>
...
此外,Maven
的服务器国内访问速度很慢,这会导致新项目构建时间过长,因此推荐使用国内的镜像站。方式同样是修改配置文件:
...
<mirrors>
...
<mirror>
<id>alimavenid>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/groups/public/url>
<mirrorOf>centralmirrorOf>
mirror>
...
mirrors>
...
进行J2EE开发,首推Intellij IDEA这个IDE,官网:
一开始我尝试使用VSC来构建Spring Boot项目,发现需要安装和配置很多插件才能完成热启动等功能,而且还不一定能顺利,所以直接选择安装Intellij IDEA。
IDEA是收费软件,不过有一个免费的社区版可以下载,但功能削减很多,建议直接安装正式版。
要省(bai)钱(piao),可以通过某宝购买激活码或者账户激活的方式,不过最新的2022版似乎是不支持激活码的,只能买50/年的帐号激活服务。
另外也可以通过一个小工具解锁(你懂的):
链接:https://pan.baidu.com/s/1TAXrvUSR5CpzfktUptmkkg
提取码:4pyp
这个小工具是我意外获得,虽然我自己使用没有任何问题,但不保证完全安全。
IDEA安装激活好后,需要经过一系列配置才能好用,具体可以阅读(2021 最新版)IntelliJ IDEA 下载安装及配置教程 - 云+社区 - 腾讯云 (tencent.com)。需要注意的是,最新的IDEA 2022.1版中,全局配置必须在关闭当前项目后的Customize
>All settings
中设置。
打开项目后修改settings
中的设置只对当前项目有效,新建一个项目就无效了。
配置中比较重要的是
Maven
的相关设置,需要设置好其主目录和配置文件路径。
好了,相关开发环境已经准备好了,下面开始第一个Spring Boot项目的构建。
更多Spring Boot开发所需的环境,可以阅读Getting Started (spring.io)。
这里第一步是生成项目的框架代码,可以通过多种方式,这里通过最简单的方式:从Spring Boot官网获取:
上面这个网站支持通过页面配置的方式生成相应的Spring Boot初始框架代码:
红框标记的这些比较重要,可以设置构建工具、Spring Boot版本等。
需要注意的是:
snapshot
为预览版)。Jar
,因为后续要通过Jar
包启动应用。Spring Web
,它会方便地为我们配置Web开发所需的依赖项。一切选好后点击下方的GENERATE
按钮,然后会下载一个xxx.zip
压缩文件,解压后就是你的初始项目代码。
通过IDEA的open
菜单打开项目目录并加载项目。
src/main/java
中存放的是项目的Java代码,相应的.../resources
存放配置等静态资源。
我们项目包名下存在一个MyFirstAppApplication
类,这是整个应用的入口类:
package cn.icexmoon.my_first_app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MyFirstAppApplication {
public static void main(String[] args) {
SpringApplication.run(MyFirstAppApplication.class, args);
}
}
Java框架的大多数功能都是通过注解来实现的,这里的@SpringBootApplication
注解标识了入口类,通过这个注解,Spring Boot
可以自动检索入口类所在的当前目录以及子目录的类文件,并处理@Companent
、@Service
等其他Spring
系列框架的注解。该注解还可以设置Spring Boot
的相关默认配置。
- 想了解Java注解相关内容可以阅读Java编程笔记20:注解 - 魔芋红茶’s blog (icexmoon.cn)。
- 关于
@SpringBootApplication
注解的更多解释,可以阅读Developing with Spring Boot。
和其它Java应用相同,Spring Boot
使用入口类的main
方法作为入口方法,并且通过SpringApplication.run
方法加载整个应用。
因为我们生成框架代码时选择的是“Spring Web”,所以启动这个应用也意味着应用包含的“Nginx”被启动,我们就可以拥有一个简单的“Web应用”。
为了让这个应用更有趣一些,我们可以给这个应用添加一个“请求处理器”:
package cn.icexmoon.my_first_app.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(@RequestParam(value="name",defaultValue="noname") String name){
return String.format("Hello %s", name);
}
}
这里是一个简单的处理/hello
的请求的处理器。@RestController
注解表明这个类是一个“Restfull 风格处理器”,换言之,其返回的内容是纯文本(通常是JSON格式),而非是一个HTML页面(需要其它组件进行处理,如模版引擎)。
@GetMapping
表示这个方法用于处理指定的Get
请求。需要处理的url路径直接通过其value
值的方式指定。
需要注意的是,这里@GetMapping("/hello")
可以同时处理xxx/hello
和xxx/hello/
两种请求,而@GetMapping("/hello/")
将只能处理xxx/hello/
这种请求。这点和大多数语言Web框架的处理器路由逻辑是相同的。
可以通过@RequestParam
注解将方法的参数“绑定”为请求的url参数,参数名可以由注解的name
或value
属性指定,并且可以用defaultValue
属性指定一个默认值。
hello
方法的内容很简单,直接返回格式化字符串。
现在可以通过右上角的run
或debug
按钮启动应用:
下方的debug
窗口会显示输出信息:
如果看到Completed initialization
就表明启动成功。
Spring Boot
默认使用8080
端口,所以我们可以用浏览器访问http://localhost:8080/hello/
,就能看到类似Hello noname
这样的输出。也可以带上参数:http://localhost:8080/hello?name=icexmoon
。可以看到Hello icexmoon
。
在开发Web应用的时候,我们通常希望修改完代码后立即看到效果,而Java是一种编译型语言,修改完代码后需要经过 **“编译>Maven重新加载项目>重新启动Nginx” **这一系列动作。如果每次都需要开发者依次手动执行,将会非常麻烦。
相应的,自动帮我们执行相应的工作的技术也是有的,通常被称作“热启动”(auto restart)。
要让Spring Boot
项目具备热启动,需要在Maven
的配置pom.xml
中添加如下依赖:
<dependencies>
...
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<scope>runtimescope>
<optional>trueoptional>
dependency>
dependencies>
这里的spring-boot-devtools
是Spring Boot
提供的一系列开发者工具,其中就包含对热启动的支持,并且这种方式实现的热启动,仅会在开发环境生效,不会影响生产环境。
除了加入devtools
依赖,还需要让IDE的自动构建项目等选项生效:
这些都设置好之后,在修改完代码后点击build
按钮就可以完成热启动:
需要注意的是,只有通过debug
方式启动的项目才会热启动,通过run
启动是不行的。
因为我们项目是用Maven
构建的,所以可以用Maven
来生成Jar包:
mvn package
在系统的命令行工具执行或者IDE中的命令行工具执行都是可以的,这里我直接在IDEA中执行:
执行成功后可以在target
目录中看到构建好的jar
包:
项目所有的源码和引用的库文件以及内嵌的Nginx都会被包含在这一个jar
包中,我们可以直接以运行这个jar
包的方式启动应用:
java -jar .\my_first_app-0.0.1-SNAPSHOT.jar
一开始我是使用IDEA的工具生成Jar包的,但是遇到一些问题,详情请见IDEA生成spring boot项目jar包 - 魔芋红茶’s blog (icexmoon.cn)。
好了,关于Spring Boot
的快速构建相关内容就到这里了,谢谢阅读。