最近因为项目的缘故,需要接触 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</div>
然后我们就可以试试看 Spring CLI 的强大威力了!创建一个名为 app.groovy 的文件
@RestController class ThisWillActuallyRun { @RequestMapping("/") String home() { "Hello World" } }</div>
只需要运行 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]</div>
解决掉各种拦路虎,我们再次运行 springj run app.groovy ,就可以在浏览器中见到 Hello World 了。
dawang$ springj run app.groovy Resolving dependencies....... . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.3.6.RELEASE)</div>
最后我们需要安装的有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</div>
当然,因为我们的程序中没有做任何操作,也没有配合 Web 模块,所以加载 Spring 完成之后就结束了。
我们看看项目对应的 build.gradle ,其中只包含了两个模块:
dependencies { compile('org.springframework.boot:spring-boot-starter') testCompile('org.springframework.boot:spring-boot-starter-test') }</div>
其中:
- 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') }</div>
然后在 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."; } }</div>
再启动主程序,访问 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.springframewo