Spring Boot
于2014年4月发布1.0.0版本, 用于创建Spring 4.0
项目, 简化了Spring中繁琐的配置, 提高了开发效率
Spring Boot
致力于快速构建应用, 去掉了Spring
的繁琐配置, 使创建Spring应用就像写一个main
函数一样方便.Tomcat
或Jetty
服务器, 不需要部署 WAR 文件, 可以直接run
XML
配置(也支持导入XML配置)Spring4
应用, 最好使用高版本环境(JDK8
, Maven3.2+
, Servlet3.0+
)Spring Boot CLI
(安装方法)Groovy
编程语言Spring Boot CLI
是一个命令行工具, 可以快速搭建Spring原型, 支持Groovy
脚本.
我们通过CLI
使用Groovy
脚本创建一个最简单的Web
应用, 创建一个app.groovy
文件, 内容如下:
@RestController
class ThisWillActuallyRun {
@RequestMapping("/")
String home() {
"Hello World!"
}
}
然后在shell中运行下面命令:
$ spring run app.groovy
则已经运行了一个Spring web应用(首次运行需要下载依赖包, 比较慢), 访问127.0.0.1:8080
就会看到输出内容Hello World!
通过Maven
创建一个Spring Boot
应用, pom.xml
内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.project</groupId>
<artifactId>spring_boot</artifactId>
<version>1.0</version>
<!-- 继承spring-boot-starter-parent是最快的方式, 后面有不继承该怎么写 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.1.RELEASE</version>
</parent>
<!-- 这一个依赖就够了 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
可以通过mvn dependency:tree
来看看都用到了哪些jar包
从src/main/java/
目录下创建一个类src/main/java/Example.java
:
@RestController
@EnableAutoConfiguration
public class Example {
@RequestMapping("/")
String home() {
return "Hello World!";
}
public static void main(String[] args) throws Exception {
SpringApplication.run(Example.class, args);
}
}
到此整个应用就创建完毕, 可以直接运行main
方法启动容器, 访问127.0.0.1:8080
main
方法mvn spring-boot:run
命令运行jar
包运行通过插件spring-boot-maven-plugin
可将应用及依赖打成jar
包, 如果没有继承spring-boot-starter-parent
则需要主动添加一下这个插件, 并且parent中的<executions>
需要自己进行配置
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
通过命令mvn package
打包, 将会得到target/spring_boot-1.0.jar
文件, 可通过命令jar tvf target/myproject-1.0.jar
查看该jar包的结构. 除此之外, 还有个文件target/spring_boot-1.0.jar.original
, 这是Spring Boot
重新打包之前, Maven
创建的原始jar文件
使用命令java -jar target/spring_boot-1.0.jar
即可运行
上面都是以继承spring-boot-starter-parent
的形式进行一来管理, 这个parent
里有如下内容:
spring-boot-dependencies
(不继承parent的形式就是引入这个pom)因此, 如果不继承spring-boot-starter-parent
, 我们的pom文件可以这么写:
<properties>
<java.version>1.8</java.version>
<resource.delimiter>@</resource.delimiter> <!-- delimiter that doesn't clash with Spring ${} placeholders -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
<tomcat.version>7.0.57</tomcat.version> <!-- 配置你的tomcat版本 -->
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.4.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 如果是通过parent方式继承spring-boot-starter-parent则不用配置此插件 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
官方建议项目有一个标准的目录结构, 就像其他Spring项目一样, 包名采用一个反转的域名, 结构类似于下面这样:
com.example.myproject
+- Application.java
|
+- service
| +- CustomerService.java
|
+- controller
+- CustomerController.java
其中Application.java
的内容如下:
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
该项目中Application.java
为main类, 将main类放到其他类所在包的顶层(root package
), 并将@EnableAutoConfiguration
注解加main类上, 这样就隐式地定义了一个基础包扫描路径, 所以采用root package
时, @ComponentScan
注解就不需要添加basePackage
属性了
解释下这几个注解的意思:
@Configuration
: 表示一个配置类, 类似于原来的一个xml
文件@EnableAutoConfiguration
: Spring Boot的自动配置会根据所添加的jar包依赖自动配置Spring应用, 通常项目中只有一个@EnableAutoConfiguration
注解, 并建议将它加到主配置类(primary @Configuration
)上@ComponentScan
: 包扫描路径, 采用root package
形式会自动收集root package
包下所有组件, 包括配置类(@Configuration
类)由于平时配置main类
时, 频繁的一起使用@Configuration、@EnableAutoConfiguration、@ComponentScan
这三个注解, 因此Spring Boot提供了一个简单的注解SpringBootApplication
来代替这三个注解, 其效果与这三个注解一起使用的效果完全一样
另外, 还有几个有用的用法:
@Import
: 导入其他配置类@ImportResource
: 引入XML
形式的配置@EnableAutoConfiguration(exclude={XXXConfiguration.class})
排除某些配置, 若配置类不在classpath
中, 可以使用excludeName
属性指定全限定名