Spring Boot 快速入门指南

 更新时间:2017年03月15日 17:05:49   投稿:mrr  
Spring 框架是非常著名的 Java 开源框架,历经十多年的发展,整个生态系统已经非常完善甚至是繁杂,Spring Boot 正是为了解决这个问题而开发的,为 Spring 平台和第三方库提供了开箱即用的设置,只需要很少的配置就可以开始一个 Spring 项目

最近因为项目的缘故,需要接触 Spring Boot,详细的介绍可以参考官方的文档,这里主要根据自己学习的实践进行简单分享。版本:1.3.6

简介

Spring 框架是非常著名的 Java 开源框架,历经十多年的发展,整个生态系统已经非常完善甚至是繁杂,Spring Boot 正是为了解决这个问题而开发的,为 Spring 平台和第三方库提供了开箱即用的设置,只需要很少的配置就可以开始一个 Spring 项目。当然,建议使用 Java 8 来进行开发。

Spring Boot 实际上走的是 Servlet 的路线,所以需要一个 Servlet 容器,什么 Tomcat/Jetty 都支持,比较意外的是居然还支持 Undertow(Undertow 大法好)。

安装

简单粗暴直接上命令行,具体的简介参考注释

# 确定 Java 版本 
dawang:~ dawang$ java -version
java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
# 安装 Spring Boot CLI
# 这是第一条语句
dawang:~ dawang$ brew tap pivotal/tap
==> Tapping pivotal/tap
Cloning into '/usr/local/Library/Taps/pivotal/homebrew-tap'...
remote: Counting objects: 16, done.
remote: Compressing objects: 100% (14/14), done.
remote: Total 16 (delta 2), reused 5 (delta 0), pack-reused 0
Unpacking objects: 100% (16/16), done.
Checking connectivity... done.
Tapped 9 formulae (50 files, 46.1K)
# 这是第二条语句
dawang:~ dawang$ brew install springboot
==> Installing springboot from pivotal/tap
==> Downloading https://repo.spring.io/release/org/springframework/boot/spring-boot-cli/1.3.6.RELEASE/spring-boot-cli-1.3.6.RELEASE-bin.tar.
######################################################################## 100.0%
==> Caveats
Bash completion has been installed to:
 /usr/local/etc/bash_completion.d
zsh completion has been installed to:
 /usr/local/share/zsh/site-functions
==> Summary
:beer: /usr/local/Cellar/springboot/1.3.6.RELEASE: 6 files, 8.9M, built in 4 minutes 39 seconds

然后我们就可以试试看 Spring CLI 的强大威力了!创建一个名为 app.groovy 的文件

@RestController
class ThisWillActuallyRun {
 @RequestMapping("/")
 String home() {
 "Hello World"
 }
}

只需要运行 spring run app.groovy 即可!然而,在我的机器上并没有这么顺利, spring 已经被 ruby 无情占用,只好在 .bashrc 中新建一个别名 alias springj="/usr/local/Cellar/springboot/1.3.6.RELEASE/bin/spring" ,然后用 springj run app.groovy 运行。

还不行!打开 localhost:8080 的时候发现机器启动着 nginx,所以要先把 nginx 关掉,具体的步骤是

# 查找对应的进程号
ps aux | grep nginx
# 发送关闭信号
kill -QUIT [nginx 主进程 pid]

解决掉各种拦路虎,我们再次运行 springj run app.groovy ,就可以在浏览器中见到 Hello World 了。

dawang$ springj run app.groovy
Resolving dependencies.......
 . ____ _ __ _ _
 /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/ ___)| |_)| | | | | || (_| | ) ) ) )
 ' |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot :: (v1.3.6.RELEASE)

最后我们需要安装的有Gradle IntelliJ IDEA CE ,这里就不赘述了,安装好了我们就可以进行下一步了

Hello World

Spring INITIALIZR 进行简单设置即可生成项目模板,如下图所示:

 

然后我们把下载的文件解压并导入 IntelliJ 中,稍作等待即可。

 

目录结构如上图所示,我们直接运行这个 main 函数看看,控制台中的输出为

. ____ _ __ _ _
 /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/ ___)| |_)| | | | | || (_| | ) ) ) )
 ' |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot :: (v1.3.6.RELEASE)
2016-07-19 19:29:41.235 INFO 65812 --- [ main] wdx.helloworld.HellowordApplication : Starting HellowordApplication on dawang.local with PID 65812 (/Users/dawang/Documents/DJI/Code/helloword/build/classes/main started by dawang in /Users/dawang/Documents/DJI/Code/helloword)
2016-07-19 19:29:41.239 INFO 65812 --- [ main] wdx.helloworld.HellowordApplication : No active profile set, falling back to default profiles: default
2016-07-19 19:29:41.320 INFO 65812 --- [ main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@545997b1: startup date [Tue Jul 19 19:29:41 CST 2016]; root of context hierarchy
2016-07-19 19:29:42.336 INFO 65812 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2016-07-19 19:29:42.353 INFO 65812 --- [ main] wdx.helloworld.HellowordApplication : Started HellowordApplication in 1.865 seconds (JVM running for 3.141)
2016-07-19 19:29:42.354 INFO 65812 --- [ Thread-1] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@545997b1: startup date [Tue Jul 19 19:29:41 CST 2016]; root of context hierarchy
2016-07-19 19:29:42.356 INFO 65812 --- [ Thread-1] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans on shutdown
Process finished with exit code 0

当然,因为我们的程序中没有做任何操作,也没有配合 Web 模块,所以加载 Spring 完成之后就结束了。

我们看看项目对应的 build.gradle ,其中只包含了两个模块:

dependencies {
 compile('org.springframework.boot:spring-boot-starter')
 testCompile('org.springframework.boot:spring-boot-starter-test')
}

其中:

  • spring-boot-starter :核心模块,包括自动配置支持、日志和 YAML
  • spring-boot-starter-test :测试模块,包括 JUnit、Hamcrest、Mockito

我们加入 spring-boot-starter-web 模块,对应的 dependencies 部分为

dependencies {
 compile('org.springframework.boot:spring-boot-starter')
 compile('org.springframework.boot:spring-boot-starter-web')
 testCompile('org.springframework.boot:spring-boot-starter-test')
}

然后在 wdx.helloworld.web 这个 package 中加入一个 HelloController 类:

package wdx.helloworld.web;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * Created by dawang on 16/7/20.
 */
@RestController
public class HelloController {
 @RequestMapping("/hello")
 public String index() {
 return "Hello World! This is wdxtub.";
 }
}

再启动主程序,访问 localhost:8080/hello 时就可以看到结果了:

 

然后我们编写一下对应的测试 HellowordApplicationTests (单词拼错了不要在意这些细节),注意需要引入一些 static 方法:

package wdx.helloworld;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.http.MediaType;
import org.springframework.mock.web.MockServletContext;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import wdx.helloworld.web.HelloController;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.hamcrest.Matchers.equalTo;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = MockServletContext.class)
@WebAppConfiguration
public class HellowordApplicationTests {
 private MockMvc mvc;
 @Before
 public void setUp() throws Exception {
 mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();
 }
 @Test
 public void getHello() throws Exception {
 mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON))
 .andExpect(status().isOk())
 .andExpect(content().string(equalTo("Hello World! This is wdxtub.")));
 }
}

具体测试简单来说就是使用 MockServletContext 来创建一个新的 WebApplicationContext ,然后我们就可以模拟访问 localhost:8080/hello 了,运行该测试,可以发现一切正常。

 

至此,我们就了解了如何开始一个 Spring Boot 项目,并编写了一个简单的路由用来显示对应内容。接下来我们会更多介绍开发相关的其他知识。

Starter POMs

简单来说,Starter POMs 是方便我们快速给应用添加功能的,只需要在 build.gradle 中包含对应的 starter,可以省去大量的配置和依赖管理,下面是一些常用的 starter

  • spring-boot-starter : 核心 Spring Boot starter,包括自动配置支持,日志和 YAML
  • spring-boot-starter-actuator : 监控和管理应用
  • spring-boot-starter-remote-shell : 添加远程 ssh shell 支持
  • spring-boot-starter-amqp : 高级消息队列协议,通过 spring-rabbit 实现
  • spring-boot-starter-cloud-connectors : 简化在云平台下服务的连接
  • spring-boot-starter-elasticsearch : 对 Elasticsearch 搜索和分析引擎的支持
  • spring-boot-starter-data-jpa : 对 Java 持久化 API 的支持,包括 spring-data-jpa , spring-orm 和 Hibernate
  • spring-boot-starter-data-mongodb : 对 MongoDB 的支持
  • spring-boot-starter-mail : 对 javax.mail 的支持
  • spring-boot-starter-mobile : 对 spring-mobile 的支持
  • spring-boot-starter-redis : 对 Redis 的支持
  • spring-boot-starter-security : 对 spring-security 的支持
  • spring-boot-starter-test : 对常用测试依赖的支持,包括 JUnit, Hamcrest 和 Mockito,还有 spring-test 模块
  • spring-boot-starter-web : 对全栈 web 开发的支持,包括 Tomcat 和 spring-webmvc
  • spring-boot-starter-websocket : 对 WebSocket 开发的支持
  • spring-boot-starter-ws : 对 Spring Web Service 的支持

如果想要切换容器和日志系统可以用下面的包

  • spring-boot-starter-jetty : 导入 Jetty HTTP 引擎
  • spring-boot-starter-log4j : 对 Log4J 日志系统的支持
  • spring-boot-starter-logging : 导入 Spring Boot 的默认日志系统
  • spring-boot-starter-tomcat : 导入 Spring Boot 的默认 HTTP 引擎
  • spring-boot-starter-undertow : 导入 Undertow HTTP 引擎

更多社区贡献的 starter POMs 可以在 这里 查阅。

组织代码最佳实践

不要使用 default package ,建议使用反转的域名来命名包

把 main 应用类放在 root package 中,其他的类放在子包中,结构如下所示

wdx
 +- helloworld
 +- HelloworldApplication.java <- main class
 |
 +- web
 | +- HelloController.java
 |
 +- service
 | +- CustomerService.java
  • Spring Boot 提倡在代码中进行配置。通常定义了 main 方法的类是使用 @Configuration 注解的好地方
  • 不需要将所有的 @Configufation 放进一个单独的类中,可以使用 @Import 注解可以导入其他的配置类。也可以用 @ComponentScan 注解自动收集所有的组件,包括 @Configuration 类
  • 如果要使用基于 XML 的配置,也最好从 @Configuration 类开始,然后使用 @ImportResource 注解来加载 XML 配置文件
  • Spring Boot 另一个很好的特性是会根据所添加的 jar 依赖来配置 Spring 应用,只需要简单把 @EnableAutoConfiguration 加入到 @Configuration 类即可
  • SpringBootApplication 注解默认等价于 @Configuration , @EnableAutoConfiguration 和 ComponentScan 这三个加起来的效果。

打包运行

我们在终端中执行 gradle assemble 可以生成一个 jar 包,也可以直接执行这个 jar 包来启动整个应用,如

dawang:helloword dawang$ java -jar build/libs/helloword-0.0.1-SNAPSHOT.jar

 . ____ _ __ _ _
 /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/ ___)| |_)| | | | | || (_| | ) ) ) )
 ' |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot :: (v1.3.6.RELEASE)

2016-07-20 13:11:01.859 INFO 36943 --- [ main] wdx.helloworld.HellowordApplication : Starting HellowordApplication on dawang.local with PID 36943 (/Users/dawang/Documents/DJI/Code/helloword/build/libs/helloword-0.0.1-SNAPSHOT.jar started by dawang in /Users/dawang/Documents/DJI/Code/helloword)
2016-07-20 13:11:01.864 INFO 36943 --- [ main] wdx.helloworld.HellowordApplication : No active profile set, falling back to default profiles: default
2016-07-20 13:11:01.960 INFO 36943 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@67424e82: startup date [Wed Jul 20 13:11:01 CST 2016]; root of context hierarchy
2016-07-20 13:11:03.727 INFO 36943 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
2016-07-20 13:11:03.750 INFO 36943 --- [ main] o.apache.catalina.core.StandardService : Starting service Tomcat
2016-07-20 13:11:03.752 INFO 36943 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.0.36
2016-07-20 13:11:03.897 INFO 36943 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2016-07-20 13:11:03.897 INFO 36943 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1943 ms
2016-07-20 13:11:04.275 INFO 36943 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/]
2016-07-20 13:11:04.282 INFO 36943 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'characterEncodingFilter' to: [/*]
2016-07-20 13:11:04.283 INFO 36943 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2016-07-20 13:11:04.283 INFO 36943 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2016-07-20 13:11:04.284 INFO 36943 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'requestContextFilter' to: [/*]
2016-07-20 13:11:04.658 INFO 36943 --- [ main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@67424e82: startup date [Wed Jul 20 13:11:01 CST 2016]; root of context hierarchy
2016-07-20 13:11:04.751 INFO 36943 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/hello]}" onto public java.lang.String wdx.helloworld.web.HelloController.index()
2016-07-20 13:11:04.755 INFO 36943 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
2016-07-20 13:11:04.755 INFO 36943 --- [ main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
2016-07-20 13:11:04.810 INFO 36943 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016-07-20 13:11:04.810 INFO 36943 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016-07-20 13:11:04.875 INFO 36943 --- [ main] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2016-07-20 13:11:05.028 INFO 36943 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2016-07-20 13:11:05.145 INFO 36943 --- [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2016-07-20 13:11:05.151 INFO 36943 --- [ main] wdx.helloworld.HellowordApplication : Started HellowordApplication in 4.0 seconds (JVM running for 4.484)

当然,因为需要包含所有的依赖,整个 jar 包会比较大。如果想要开启远程调试,命令为

java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n -jar build/libs/helloword-0.0.1-SNAPSHOT.jar

Gradle 运行

当然我们也可以简单使用内置的 Gradle 脚本来运行,直接 gradle bootRun 即可。

配置 Undertow

如果想要用 Undertow 来替换默认的 Tomcat,也可以简单在 build.gradle 中进行配置,比如:

configurations {
 compile.exclude module: "spring-boot-starter-tomcat"
}
dependencies {
 compile('org.springframework.boot:spring-boot-starter')
 compile('org.springframework.boot:spring-boot-starter-web')
 compile('org.springframework.boot:spring-boot-starter-undertow')
 testCompile('org.springframework.boot:spring-boot-starter-test')
}

然后使用 gradle bootRun 即可。

以上所述是小编给大家介绍的Spring Boot 快速入门指南,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • 使用Spring AOP实现用户操作日志功能

    使用Spring AOP实现用户操作日志功能

    这篇文章主要介绍了使用Spring AOP实现了用户操作日志功能,功能实现需要一张记录日志的log表,结合示例代码给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • SpringBoot整合Echarts绘制静态数据柱状图和饼图

    SpringBoot整合Echarts绘制静态数据柱状图和饼图

    这篇文章给大家介绍了SpringBoot整合Echarts绘制静态数据柱状图和饼图,文中通过代码示例给大家介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-03-03
  • SpringBoot利用EasyExcel实现导出数据

    SpringBoot利用EasyExcel实现导出数据

    EasyExcel是一个基于Java的、快速、简洁、解决大文件内存溢出的Excel处理工具,它能让你在不用考虑性能、内存的等因素的情况下,快速完成Excel的读、写等功能看,本文就将介绍如何利用EasyExcel实现导出数据,需要的朋友可以参考下
    2023-07-07
  • 计算机二级考试java软件操作教程 教大家如何学习java

    计算机二级考试java软件操作教程 教大家如何学习java

    如何成为一名知识丰富的Java程序员,顺利通过计算机二级Java考试,这篇文章主要主要教大家如何学习java,java的学习路线是什么,从何学起,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • 浅谈java中BigDecimal的equals与compareTo的区别

    浅谈java中BigDecimal的equals与compareTo的区别

    下面小编就为大家带来一篇浅谈java中BigDecimal的equals与compareTo的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • JAVA正则表达式的基本使用教程

    JAVA正则表达式的基本使用教程

    这篇文章主要给大家介绍了关于JAVA正则表达式的基本使用教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • SpringCloud Nacos + Ribbon 调用服务的实现方式(两种)

    SpringCloud Nacos + Ribbon 调用服务的实现方式(两种)

    这篇文章主要介绍了SpringCloud Nacos + Ribbon 调用服务的两种方法,分别是通过代码的方式调用服务和通过注解方式调用服务,每种方式给大家介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • java中 ${} 和 #{} 有什么区别

    java中 ${} 和 #{} 有什么区别

    本文主要介绍了java中${}和#{}有什么区别,${}和#{}都是MyBatis中用来替换参数的,它们都可以将用户传递过来的参数,替换到MyBatis最终生成的SQL中,但它们区别却是很大的,感兴趣的小伙伴可以一起来学习下面详细内容
    2022-08-08
  • JAVA JVM面试题总结

    JAVA JVM面试题总结

    JVM 可以屏蔽与具体操作系统平台相关的信息,使 Java 程序只需生成在 Java 虚拟机上运行的目标代码,就可以在不同的平台上运行。这篇文章主要介绍了JAVA JVM面试题总结,大家可以参考一下
    2021-08-08
  • java异步调用的4种实现方法

    java异步调用的4种实现方法

    日常开发中,会经常遇到说,前台调服务,本文主要介绍了java异步调用的4种实现方法,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03

最新评论