本小节,我们将一起搭建一个基于gradle构建的spring boot单体应用的基本结构,完成一个hello, boot
的接口开发。为后续的spring boot学习搭建好工程骨架。
idea向导式创建步骤
选择要集成进来的基本依赖,比如:lombok
、configuration-processor
、spring web
这些。需要的依赖可以直接搜索并添加。
gradle与gradle wrapper
接下来,idea会帮我们按照指定的项目路径来自动创建并构建项目。这里我们会依赖一个项目依赖和构建管理工具来帮助我们管理项目的依赖以及完成项目构建生命周期的各个阶段。相比于传统的Maven,这里我们选择维护构建脚本更灵活、构建速度更快的Gradle。关于Gradle的更多了解和学习,请参考官网技术文档。
这里我们都不用关心Gradle软件去哪里下载,并怎么在本地安装设置。因为考虑到基于Gradle构建的项目对Gradle版本的要求,Gradle官方给我们提供了一个gradle-wrapper的工具,它是一个很小的jar包,却充当了一个管家的角色,负责gradle特定版本的下载和本地安装,以及gradle构建命令的调用。这个gradle-wrapper管家和其相关配置是随我们的spring boot源码包一起分发的,这样在任何机器上构建项目时都能确保构建使用的gradle版本一致。
现在,我们只要对要下的软件版本做一些指定,以及GRADLE_USER_HOME
环境变量做下本地设置即可,这样gradle-wrapper就可以按照我们指定的软件版本和指定的本地路径来存储下载的软件、插件、依赖等内容了。
这里我们可以通过环境变量GRADLE_USER_HOME
来指定gradle本地存储目录:
并在该路径下放两个gradle全局配置文件:
gradle.properties中指定了gradle使用的jvm配置以及对警告信息的敏感度设置:
# 设置gradle工作时使用的jvm最大堆内存
org.gradle.jvmargs=-Xmx2048M
# 可选配置:all,none,summary,用来设置gradle构建时控制台输出警告信息的模式,all为打印所有警告信息,summary为只打印概要信息,none为不输出警告信息,因为警告并不影响gradle构建成功,因此这里我们把它屏蔽掉。
org.gradle.warning.mode=none
init.gradle中指定了全局仓库设置,这样每个项目的构建配置中就可以不指定仓库了,一般我们都使用国内阿里云仓库源来加速下载:
allprojects {
repositories {
mavenLocal()
maven{ url 'https://maven.aliyun.com/repository/public'}
maven{ url 'https://maven.aliyun.com/repository/gradle-plugin'}
maven{ url 'https://maven.aliyun.com/repository/spring'}
maven{ url 'https://maven.aliyun.com/repository/spring-plugin'}
}
}
build.gradle配置
习惯了使用Maven的pom.xml配置的小伙伴,初看这个配置文件会觉得比较新鲜,因为这是一种全新的语法——groovy。当然这里不建议小伙伴们另外花时间去学这门语言。我们仅对它在spring boot中的配置形式有所了解即可。
我们使用创建向导生成的项目中会自动生成一个配置好的build.gradle
文件,里面大多配置都不用管,先关注下spring boot版本的问题。因为使用的Spring Initializr工具可选择的spring boot的大版本都是较新的,我们学习一个框架,当然首先学习它常用的且使用稳定的特性,学完了基本的特性,再基于官方对下一个变动大的版本所发布的新特性,再进行学习。因此,按照这个学习思路,我们这里选择一个企业中使用较多的一个折中的版本——2.2.5.RELEASE。因此修改下相关的版本:
plugins {
...
id 'org.springframework.boot' version '2.2.5.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
}
boot插件的版本和依赖管理插件的版本的对应关系,可以在特定版本的spring boot文档中查到:
当修改了配置,只要点这里的小象图标就可以刷新gradle的配置,来重新构建项目了。
关于依赖管理
依赖管理插件能帮助spring boot项目管理其构建时所指定好的依赖清单,这些依赖在开发当前的spring boot框架版本时就使用了,因此它们的版本也就预先定义下来了,否则版本的升级或者降级都会导致spring boot框架本身功能的兼容性问题。
因此,在使用这些依赖时,用户就不需要再额外指定其版本,而交给依赖管理帮我们找到其版本,来定位依赖的工件坐标。
这里的插件定义形式和应用形式还有一种:
plugins {
id 'org.springframework.boot' version '2.2.5.RELEASE' apply false
}
apply plugin: 'org.springframework.boot' // 提供bootjar任务
apply plugin: 'io.spring.dependency-management'
apply plugin: 'java-library' // 功能比java插件多
这里boot插件的声明和应用形式就被分开了,其他直接应用的插件和版本可以从声明的相关插件和版本中推断出来。
依赖设置
在build.gradle
中修改的最多的就是依赖的设置。这里关于gradle依赖的各种类型先不过多介绍,目前项目中单元测试类编译报错,是因为引入的junit5的依赖没有找到,原因是在引入spring-boot-starter-test
时混杂了junit4和5两个版本的依赖,默认起作用的是junit4的版本,只要将其排除即可:
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
暂且我们先不用去管单元测试,先确保导入的类型能编译通过。
启动类
所有的Java程序的启动入口都是main方法所在的类,spring boot也不另外,通过启动类来运行一个Java进程,开启指定端口号的监听,对外提供web服务能力。开发时,我们可以借助集成开发工具,比如IntelliJ Idea的Java应用启动项来运行spring boot应用。在把应用部署到服务器上时,可以用构建好的可执行jar包直接用java
命令来运行,同时可以指定一些命令行参数传给应用,启动类代码如下:
package com.xiaojuan.boot;
import ...
// 为启动类添加spring boot注解
@SpringBootApplication
public class HelloBootApplication {
public static void main(String[] args) {
SpringApplication.run(HelloBootApplication.class, args);
}
}
Spring Bean容器
如果有小伙伴还没学习过spring,可以先找些入门的教程,需要了解Spring IoC容器以及依赖注入(Dependency Injection)和控制反转(Inversion of Control)。
这里小卷简单介绍下。在web应用中有许多的Java Bean,有提供应用层的业务处理的,有完成数据持久化的,有提供底层支持的,管理这些bean的容器就是Spring IoC容器(简称spring容器),这些不同类型的bean,有的是单例的(大多都是),也有多实例的(原型bean),Spring容器管理它们的生命周期。
当我们启动一个spring boot应用时,因为spring boot是一个开箱即用的服务框架,不同于传统的ssm(spring、spring mvc、mybatis三大框架简称),它可以实现第三方依赖的自动装配,只要能在类路径上找到相关的依赖,并在自动配置中有注册,在启动应用时就可以实现配置加载,并将相关的bean交给spring容器来管理。而对于用户开发的应用层的组件类,同样可以通过一些注解类的修饰使它们被spring容器所管理,而在应用中需要的类中,通过注入的形式(字段注入、构造器注入)在运行时(容器启动时)将类型匹配的对象注入进来,以备请求时被调用。
组件注解类可以通过spring配置包扫描路径的形式在spring容器启动时被扫描到,并注册进来。而对于spring boot应用,默认的包扫描路径就是启动类所在的包(以及子包)。
web服务开发
开发一个最简单的hello, boot
的服务,定义一个web层的Controller
组件:
package com.xiaojuan.boot.web.controller;
import ...
@RestController
public class HelloController {
@GetMapping("hi")
public Map<String, Object> hi() {
Map<String, Object> result = new HashMap<>();
result.put("status", 0);
result.put("msg", "hello, boot!");
return result;
}
}
因为现在web应用基本上都是前后端分离的模式,后台服务开发关注点在REST API的接口实现上,而前后端开发人员的对接和配合的共同语言就是REST API的接口规范,也就是http请求的输出和输出的参数定义,body的结构。
这里我们提供了一个/hi
请求url的接口实现,当web服务启动后,浏览器访问地址:http://localhost:8080/hi,会得到json的返回结果:
{
"msg":"hello, boot!",
"status":0
}
服务的启动
idea启动项
在本地开发可以使用集成开发工具idea直接运行main方法,在启动类上右键运行即可。idea会自动创建一个spring boot应用的启动项,默认会提供最简洁的设置:
可以点Modify options
显示更多设置项。这里我们暂时不做任何事情。
需要注意的是,因为项目是基于gradle构建的,直接右键运行会以gradle命令来编译和运行项目。项目启动后,gradle任务一直处于阻塞状态,停止程序则运行控制台报错。为此,可以使用idea自带的启动方式来运行程序,做下面设置调整:
要注意,当使用idea启动时,注解处理器需要开启才能工作:
bootjar打包
还可以通过gradle的boot插件提供的bootjar任务来构建生成可执行的jar包,双击运行:
生成的可执行jar包:
在终端运行:
以上就是本节全部内容,下一节我们将对数据库进行设计,后续用spring boot整合mybatis框架来操作数据库,完成一个小卷生鲜的电商项目开发,大家加油!