在以往以及当前的Java开发工作中,Spring这个一站式框架发挥了重要的作用。
然而,当我们的项目越来越复杂的时候,铺天盖地的xml配置让我们无比烦躁,配置稍有不慎就会引起极大麻烦。究其原因,为什么要使用xml文件读取配置呢,只能说这是框架本身的一种约定,要使用框架(或者其它规范,比如Servlet)就必须遵循它的约定。那么既然是约定,为什么不把约定变得更为简洁呢,Spring Boot的出现解决了这个问题。
Spring Boot舍弃了以往基于xml方式的配置方式,我们可以采用.properties、.yml等方式快速配置需要的项。当然这只是Spring Boot的众多特点之一。
Features
- 创建独立的Spring应用程序
- 内嵌Tomcat、Jetty或Undertow(无需部署.war文件)
- 提供自有的'starter'以简化Maven/Gradle依赖配置
- 尽可能地自动配置Spring
- 提供为生产准备的功能,如metrics,health checks,externalized configuration
- 绝对无代码生成,无需xml配置
快速开始
http://start.spring.io提供了一键构建及下载功能,得到的项目结构如下:
.
├── build.gradle
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── src
├── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── demo
│ │ └── DemoApplication.java
│ └── resources
│ └── application.properties
└── test
└── java
└── com
└── example
└── demo
└── DemoApplicationTests.java
14 directories, 8 files
build.gradle配置如下,其中spring-boot-starter-web
提供了web项目的依赖(如果是非web项目,则不需要此依赖)
buildscript {
ext {
springBootVersion = '1.5.6.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'org.springframework.boot'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile('org.springframework.boot:spring-boot-starter')
compile('org.springframework.boot:spring-boot-starter-web')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
DemoApplication.java
是程序的入口,仅需要加上@SpringBootApplication
注解,并在mian方法中执行
SpringApplication.run(DemoApplication.class, args);
Spring Boot自动执行初始化;
如果是web项目,只需要添加spring-boot-starter-web依赖,并在类上加上@Controller
或@RestController
注解即可,无需任何配置(Spring Boot已经提供了默认配置,除非你不想使用默认配置)
package com.example.demo.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "Hello Spring Boot";
}
}
如果是非web项目,启动时需要执行代码的话需要实现CommandLineRunner接口,否则只能执行静态方法
@SpringBootApplication
public class SpringbootApplication implements CommandLineRunner{
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
test();
}
public void test(){
System.out.println("test");
}
}
启动
使用Gradle构建的Spring Boot项目打包、启动都非常简单
$ gradle build
还可以使用-x test
参数跳过junit单元测试
$ gradle build -x test
通过gradle build
生成jar后,就可以使用java -jar
来运行了
$ java -jar build/libs/demo-0.0.1-SNAPSHOT.jar
如果启动时需要设置JVM参数
java -Xms512m -Xmn512m -Xmx2g -jar build/libs/demo-0.0.1-SNAPSHOT.jar
以java -jar方式启动应用是在交互模式下运行的,退出命令行应用就会中止,如果希望以后台方式运行应用程序,可以使用nohup
命令执行(MacOS及Linux环境下),并加上&
。
nohup
命令会将输出重定向到当前目录的nohup.out文件中,如果当前目录的nohup.out文件没有创建或者写入权限,则会输出重定向到~/nohup.out。
$ nohup java -jar bulid/lib/demo-0.0.1-SNAPSHOT.jar &
还可以使用bootRun
一键启动
$ gradle bootRun
停止
关于如何优雅地停止Spring Boot应用,可以参考下面这篇文章。
SpringBoot 实战 之 优雅终止服务
单元测试
常规的单元测试比较简单,这里演示下MVC的测试,使用MockMvc来模拟请求,将期望的返回结果与实际放回结果比较。
import static org.hamcrest.core.IsEqual.equalTo;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootApplicationTests {
private MockMvc mvc;
@Before
public void init() 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 Spring Boot")));
}
}
网友评论