转载自:https://www.gitbook.com/book/qbgbook/spring-boot-reference-guide-zh/detailsjavascript
带目录浏览地址:http://www.maoyupeng.com/spring-boot-api.htmlphp
本节提供一个Spring Boot参考文档的简明概述。你能够把它做为文档其他部分的导航。你能够从头至尾依次阅读该参考指南,或跳过你不感兴趣的章节。css
Spring Boot参考指南有html,pdf和epub形式的文档。在docs.spring.io/spring-boot/docs/current/reference可获取到最新的副本。html
在对副本不收取任何费用,而且无论是打印仍是电子版每一个副本都包含版权声明的状况下,你能够本身使用本文档副本,也能够分发给其余人。前端
若是你想从整体上对Spring Boot或Spring入门,本章节就是为你准备的!在这里,咱们将回答基本的“什么?”,“怎么样?”和“为何?”问题。你会发现一个温雅的Spring Boot介绍及安装指南。而后咱们构建第一个Spring Boot应用,并讨论一些咱们须要遵循的核心原则。java
Spring Boot使用开发独立的,产品级别的基于Spring的应用变得很是简单,你只需“只是运行”。咱们为Spring平台及第三方库提供开箱即用的设置,这样你就能够有条不乱地开始。多数Spring Boot应用须要不多的Spring配置。mysql
你能够使用Spring Boot建立Java应用,并使用java -jar启动它或采用传统的war部署方式。咱们也提供了一个运行“spring脚本”的命令行工具。git
咱们主要的目标是:github
默认状况下,Spring Boot 1.3.0.BUILD-SNAPSHOT须要Java7和Spring框架4.1.3或以上。你能够在Java6下使用Spring Boot,不过须要添加额外配置。具体参考第73.9节“如何使用Java 6 “。构建环境明确支持的有Maven(3.2+)和Gradle(1.12+)。web
注:尽管你能够在Java6或Java7环境下使用Spring Boot,一般咱们建议你若是可能的话就使用Java8。
下列内嵌容器支持开箱即用(开箱即用):
名称 | Servlet的版本 | Java的版本 |
---|---|---|
雄猫8 | 3.1 | Java 7+ |
雄猫7 | 3.0 | Java 6+ |
码头9 | 3.1 | Java 7+ |
码头8 | 3.0 | Java 6+ |
Undertow 1.1 | 3.1 | Java 7+ |
你也能够将Spring Boot应用部署到任何兼容Servlet 3.0+的容器。
Spring Boot能够跟典型的Java开发工具一块使用或安装为一个命令行工具。无论怎样,你将须要安装Java SDK v1.6或更高版本。在开始以前,你须要检查下当前安装的Java版本:
$ java -version
若是你是一个Java新手,或者你是想体验一下Spring Boot,你可能想先尝试Spring Boot CLI,不然继续阅读经典地安装指南。
注:尽管Spring Boot兼容Java 1.6,若是可能的话,你应该考虑使用Java最新版本。
你能够像使用其余任何标准Java库那样使用Spring Boot,只需简单地在你的classpath下包含正确的spring-boot - * .jar文件.Spring Boot不须要集成任何特殊的工具,因此你能够使用任何IDE或文本编辑器; Spring Boot应用也没有什么特殊之处,因此你能够像任何其余Java程序那样运行和调试。
尽管你能够拷贝Spring Boot jars,不过,咱们一般推荐你使用一个支持依赖管理的构建工具(好比Maven或Gradle)。
Spring Boot兼容Apache Maven 3.2或更高版本。若是没有安装Maven,你能够参考maven.apache.org指南。
注意:在不少操做系统上,你能够经过一个包管理器安装Maven。若是你是一个OSX Homebrew用户,能够尝试brew install maven.Ubuntu用户能够运行sudo apt-get install maven。
Spring Boot依赖的groupId为org.springframework.boot。一般你的Maven POM文件须要继承spring-boot-starter-parent,而后声明一个或多个“Starter POMs”依赖.Spring Boot也提供了一个用于建立可执行罐的Maven的插件。
下面是一个典型的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</groupId> <artifactId>myproject</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- Inherit defaults from Spring Boot --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.0.BUILD-SNAPSHOT</version> </parent> <!-- Add typical dependencies for a web application --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <!-- Package as an executable jar --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <!-- Add Spring repositories --> <!-- (you don't need this if you are using a .RELEASE version) --> <repositories> <repository> <id>spring-snapshots</id> <url>http://repo.spring.io/snapshot</url> <snapshots><enabled>true</enabled></snapshots> </repository> <repository> <id>spring-milestones</id> <url>http://repo.spring.io/milestone</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-snapshots</id> <url>http://repo.spring.io/snapshot</url> </pluginRepository> <pluginRepository> <id>spring-milestones</id> <url>http://repo.spring.io/milestone</url> </pluginRepository> </pluginRepositories> </project>
注:spring-boot-starter-parent
是使用Spring Boot的一个不错的方式,但它不老是合适的。有时你须要继承一个不一样的父POM,或者你可能只是不喜欢咱们的默认配置。查看部分13.1.2,“使用Spring没有父POM的引导“获取使用import的替代解决方案。
Spring Boot兼容Gradle 1.12或更高版本。若是没有安装Gradle,你能够参考www.gradle.org上的指南。
Spring引用依赖能够使用org.springframework.boot group来声明。一般,你的项目将声明一个或多个“Starter POMs”依赖.Spring Boot提供一个用于简化依赖声明和建立可执行jars的有用的Gradle插件。
注:当你须要构建一个项目时,Gradle Wrapper提供一个获取Gradle的漂亮方式。它是一个伴随你的代码一块提交的小脚本和库,用于启动构建进程。具体参考Gradle Wrapper。
下面是一个典型的的build.gradle文件:
buildscript {
repositories {
jcenter()
maven { url "http://repo.spring.io/snapshot" } maven { url "http://repo.spring.io/milestone" } } dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.0.BUILD-SNAPSHOT") } } apply plugin: 'java' apply plugin: 'spring-boot' jar { baseName = 'myproject' version = '0.0.1-SNAPSHOT' } repositories { jcenter() maven { url "http://repo.spring.io/snapshot" } maven { url "http://repo.spring.io/milestone" } } dependencies { compile("org.springframework.boot:spring-boot-starter-web") testCompile("org.springframework.boot:spring-boot-starter-test") }
Spring Boot是一个命令行工具,用于使用Spring进行快速原型搭建。它容许你运行Groovy脚本,这意味着你能够使用类Java的语法,而且没有那么多的模板代码。
你没有必要为了使用Spring Boot而去用CLI,但它绝对是助力Spring应用的最快方式。
你能够从Spring软件仓库下载Spring CLI分发包:
spring-boot-cli-1.3.0.BUILD-SNAPSHOT-bin.zip
spring-boot-cli-1.3.0.BUILD-SNAPSHOT-bin.tar.gz
不稳定的快照分发包也能获取到。
下载完成后,遵循解压后的存档里的INSTALL.txt操做指南进行安装。通常而言,在.zip文件的bin /目录下存在一个spring脚本(Windows下是spring.bat),或者使用java -jar来运行一个的.jar文件(该脚本会帮你肯定类路径被正确设置)。
GVM(Groovy环境管理器)能够用来管理多种不一样版本的Groovy和Java二进制包,包括Groovy自身和Spring Boot CLI。能够从gvmtool.net获取gvm,并使用如下命令安装Spring Boot:
$ gvm install springboot
$ spring --version
Spring Boot v1.3.0.BUILD-SNAPSHOT
若是你正在为CLI开发新的特性,并想轻松获取你刚构建的版本,能够使用如下命令:
$ gvm install springboot dev /path/to/spring-boot/spring-boot-cli/target/spring-boot-cli-1.3.0.BUILD-SNAPSHOT-bin/spring-1.3.0.BUILD-SNAPSHOT/ $ gvm use springboot dev $ spring --version Spring CLI v1.3.0.BUILD-SNAPSHOT
这将会在你的gvm仓库中安装一个名叫dev的本地spring实例。它指向你的目标构建位置,因此每次你从新构建Spring Boot,spring将会是最新的。
你能够经过如下命令来验证:
$ gvm ls springboot
================================================================================
Available Springboot Versions
================================================================================
> + dev
* 1.3.0.BUILD-SNAPSHOT
================================================================================
+ - local version * - installed > - currently in use ================================================================================
若是你的环境是Mac,并使用Homebrew,想要安装Spring Boot CLI只需以下操做:
$ brew tap pivotal/tap $ brew install springboot
自制将把弹簧安装到在/ usr / local / bin目录下。
注:若是该方案不可用,多是由于你的brew版本太老了。你只需执行brew update并重试便可。
若是你的环境是Mac,并使用MacPorts,想要安装Spring Boot CLI只需以下操做:
$ sudo port install spring-boot-cli
Spring Boot CLI启动脚本为BASH和zsh shells提供完整的命令行实现。你能够在任何shell中源脚本(名称也是spring),或将它放到你我的或系统范围的bash实现初始化中。在一个Debian系统里,系统范围的脚本位于/壳完成/ bash的下,当一个新的外壳启动时该目录下的全部脚本都被执行想要手动运行该脚本,例如,你已经使用GVM进行安装了:
$ . ~/.gvm/springboot/current/shell-completion/bash/spring $ spring grab help jar run test version
注:若是你使用Homebrew或MacPorts安装Spring Boot CLI,命令行实现脚本会自动注册到你的shell。
。下面是一个至关简单的网络应用,你能够用它测试你的安装是否成功建立一个名叫app.groovy的文件:
@RestController class ThisWillActuallyRun { @RequestMapping("/") String home() { "Hello World!" } }
而后简单地从一个壳中运行它:
$ spring run app.groovy
注:当你首次运行该应用时将会花费一点时间,由于须要下载依赖后续运行将会快不少。
在你最喜欢的浏览器中打开本地主机:8080,而后你应该看到如下输出:
Hello World!
若是你正在升级一个Spring Boot早期版本,查看下放在项目wiki上的“发行说明”。你会发现每次发布的更新指南和一个“new and noteworthy”特性列表。
想要升级一个已安装的CLI,你须要使用合适的包管理命令(例如,brew upgrade),或若是你是手动安装CLI,按照标准说明操做并记得更新你的PATH环境变量以移除任何老的引用。
让咱们使用Java开发一个简单的“Hello World!” web应用,来强调下Spring Boot的一些关键特性。咱们将使用Maven构建该项目,由于大多数IDEs都支持它。
注:spring.io网站包含不少使用Spring Boot的“入门”指南。若是你正在找特定问题的解决方案,能够先去那瞅瞅。
在开始前,你须要打开一个终端,检查是否安装可用的Java的版本和Maven的:
$ java -version
java version "1.7.0_51" Java(TM) SE Runtime Environment (build 1.7.0_51-b13) Java HotSpot(TM) 64-Bit Server VM (build 24.51-b03, mixed mode) $ mvn -v Apache Maven 3.2.3 (33f8c3e1027c3ddde99d3cdebad2656a31e8fdf4; 2014-08-11T13:58:10-07:00) Maven home: /Users/user/tools/apache-maven-3.1.1 Java version: 1.7.0_51, vendor: Oracle Corporation
注:该示例须要建立本身的文件夹后续的操做假设你已建立一个合适的文件夹,而且它是你的“当前目录”。
咱们须要以建立一个Maven pom.xml文件做为开始。该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</groupId> <artifactId>myproject</artifactId> <version>0.0.1-SNAPSHOT</version> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.0.BUILD-SNAPSHOT</version> </parent> <!-- Additional lines to be added here... --> <!-- (you don't need this if you are using a .RELEASE version) --> <repositories> <repository> <id>spring-snapshots</id> <url>http://repo.spring.io/snapshot</url> <snapshots><enabled>true</enabled></snapshots> </repository> <repository> <id>spring-milestones</id> <url>http://repo.spring.io/milestone</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <id>spring-snapshots</id> <url>http://repo.spring.io/snapshot</url> </pluginRepository> <pluginRepository> <id>spring-milestones</id> <url>http://repo.spring.io/milestone</url> </pluginRepository> </pluginRepositories> </project>
这会给你一个可运转的构建,你能够经过运行mvn package测试它(如今你能够忽略“jar将是空的 - 没有包含任何内容!”的警告)。
注:目前你能够将该项目导入一个IDE(大多数现代的Java IDE都包含对Maven的内建支持)。简单起见,咱们将继续使用普通的文本编辑器完成该示例。
Spring Boot提供不少“Starter POMs”,这可以让你轻松的将jars添加到你的类路径下。咱们的示例程序已经在POM的partent节点使用了spring-boot-starter-parent.spring-boot-starter-父母是一个特殊的启动器,它提供了有用的Maven的默认设置。同时,它也提供了一个依赖管理节点,这样对于”福地“依赖你能够省略版本标记。
其余的“Starter POMs”简单的提供依赖,这些依赖多是你开发特定类型的应用时须要的。因为正在开发一个网应用,咱们将添加一个spring-boot-starter-web依赖 - 但在此以前,让咱们看下目前所拥有的:
$ mvn dependency:tree [INFO] com.example:myproject:jar:0.0.1-SNAPSHOT
mvn dependency:tree
命令以树形表示来打印你的项目依赖你能够看到。spring-boot-starter-parent
自己并无提供依赖编辑咱们的pom.xml中,并在父节点下添加。spring-boot-starter-web
依赖:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
若是再次运行mvn dependency:tree
,你将看到如今有了一些其余依赖,包括Tomcat web服务器和Spring Boot自身。
为了完成应用程序,咱们须要建立一个单独的Java的文件.Maven会默认compile- src/main/java
下的源码,因此你须要建立那样的文件结构,添加而后一个名为src/main/java/Example.java
的文件:
import org.springframework.boot.*; import org.springframework.boot.autoconfigure.*; import org.springframework.stereotype.*; import org.springframework.web.bind.annotation.*; @RestController @EnableAutoConfiguration public class Example { @RequestMapping("/") String home() { return "Hello World!"; } public static void main(String[] args) throws Exception { SpringApplication.run(Example.class, args); } }
尽管这里没有太多代码,但不少事情正在发生。让咱们分步探讨重要的部分。
咱们的实施例类上使用的第一个注解是@RestController。这被称为一个构造型(原型)注解。它为阅读代码的人们提供建议。对于弹簧,该类扮演了一个特殊角色。在本示例中,咱们的类是一个web @Controller,因此当处理进来的web请求时,Spring会询问它。
@RequestMapping注解提供路由信息。它告诉春任何来自 “/” 路径的HTTP请求都应该被映射到家里方法。@ RestController注解告诉春季以字符串的形式渲染结果,并直接返回给调用者。
注:@RestController和@RequestMapping注解是Spring MVC注解(它们不是Spring Boot的特定部分)。具体查看Spring参考文档的MVC章节。
第二个类级别的注解是@EnableAutoConfiguration。这个注解告诉Spring Boot根据添加的jar依赖猜想你想如何配置Spring。因为spring-boot-starter-web添加了Tomcat和Spring MVC,因此auto-configuration将假定你正在开发一个网络应用并相应地对弹簧进行设置。
Starter POMs和Auto-Configuration:设计自动配置的目的是更好的使用“Starter POMs”,但这两个概念没有直接的联系。你能够自由地挑选起动器POMs之外的jar依赖,而且Spring Boot将仍旧尽最大努力去自动配置你的应用。
咱们的应用程序最后部分是主方法。这只是一个标准的方法,它遵循Java对于一个应用程序入口点的约定。咱们的主方法经过调用运行,将业务委托给了Spring Boot的SpringApplication类.SpringApplication将引导咱们的应用,启动Spring,相应地启动被自动配置的Tomcat web服务器。咱们须要将Example.class
做为参数传递给run方法来告诉SpringApplication谁是主要的Spring组件。为了暴露任何的命令行参数,args数组也会被传递过去。
到此咱们的应用应该能够工做了因为使用了。spring-boot-starter-parent
POM,这样咱们就有了一个很是有用的运行目标,咱们能够用它启动程序在项目根目录下输入。mvn spring-boot:run
来启动应用:
$ mvn spring-boot:run . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.3.0.BUILD-SNAPSHOT) ....... . . . ....... . . . (log output here) ....... . . . ........ Started Example in 2.222 seconds (JVM running for 6.514)
若是使用一个浏览器打开localhost:8080
,你应该能够看到如下输出:
Hello World!
点击ctrl-c
温雅地关闭应用程序。
让咱们经过建立一个彻底自包含的可执行jar文件来结束咱们的示例,该jar文件能够在生产环境运行。可执行jars(有时候被成为胖jars“fat jars”)是包含你的编译后的类和你的代码运行所需的依赖罐子的存档。
可执行jars和Java:Java没有提供任何标准的加载内封jar文件(即jar文件中还包含jar文件)的方法。若是你想发布一个自包含的应用这就是一个问题。为了解决该问题,不少开发者采用“共享的”罐子。一个共享的罐子简单地未来自全部罐子的类打包进一个单独的“超级罐子”。采用共享罐子方式的问题是很难区分在你的应用程序中能够使用哪些库。在多个jars中若是存在相同的文件名(但内容不同)也会是一个问题.Spring Boot采起一个不一样的途径,并容许你真正的内嵌罐子。
为了建立可执行的JAR,须要将弹簧引导Maven的插件添加到咱们的pom.xml的中在依赖节点下插入如下内容:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
注:spring-boot-starter-paren
POM包含用于绑定repackage目标的<executions>配置。若是你不使用parent POM,你将须要本身声明该配置。具体参考插件文档。
保存你的pom.xml的,而后从命令行运行mvn package
:
$ mvn package [INFO] Scanning for projects... [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building myproject 0.0.1-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] .... .. [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ myproject --- [INFO] Building jar: /Users/developer/example/spring-boot-example/target/myproject-0.0.1-SNAPSHOT.jar [INFO] [INFO] --- spring-boot-maven-plugin:1.3.0.BUILD-SNAPSHOT:repackage (default) @ myproject --- [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------
若是查看目标目录,你应该看到的myproject-0.0.1-SNAPSHOT.jar该文件应该有10Mb的左右的大小若是想偷看内部结构,你能够运行。jar tvf
:
$ jar tvf target/myproject-0.0.1-SNAPSHOT.jar
在目标目录下,你应该也能看到一个很小的名为myproject-0.0.1-SNAPSHOT.jar.original的文件。这是在Spring Boot从新打包前Maven建立的原始jar文件。
为了运行该应用程序,能够你使用java -jar
命令:
$ java -jar target/myproject-0.0.1-SNAPSHOT.jar . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.3.0.BUILD-SNAPSHOT) ....... . . . ....... . . . (log output here) ....... . . . ........ Started Example in 2.536 seconds (JVM running for 2.864)
和之前同样,点击CTRL-C来温柔地退出程序。
春节靴子最佳实践。尽管消费的库),但仍有一些建议,若是你遵循的话将会让你的开发进程更容易。
若是你刚接触Spring Boot,那最好先读下上一章节的入门指南。
强烈建议你选择一个支持依赖管理,能消费发布到Maven中央仓库的artifacts的构建系统。咱们推荐你选择Maven或Gradle。选择其余构建系统来使用Spring Boot也是可能的(好比Ant),但它们不会被很好的支持。
Maven的用户能够继承弹簧引导启动父项目来获取合适的默认设置该父项目提供如下特性:
最后一点:因为默认配置文件接收Spring风格的占位符(${...}
),Maven过滤改用@..@
占位符(你能够使用Maven属性resource.delimiter
来覆盖它)。
想配置你的项目继承spring-boot-starter-parent
只须要简单地设置parent
为:
<!-- Inherit defaults from Spring Boot --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.0.BUILD-SNAPSHOT</version> </parent>
注:你应该只须要在该依赖上指定Spring Boot版本。若是导入其余的starters,你能够放心的省略版本号。
不是每一个人都喜欢继承spring-boot-starter-parent
POM。你可能须要使用公司标准parent,或你可能倾向于显式声明全部Maven配置。
若是你不使用spring-boot-starter-parent
,经过使用一个scope=import
的依赖,你仍能获取到依赖管理的好处:
<dependencyManagement> <dependencies> <dependency> <!-- Import dependency management from Spring Boot --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>1.3.0.BUILD-SNAPSHOT</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
spring-boot-starter-parent
选择至关保守的Java兼容策略。若是你遵循咱们的建议,使用最新的Java版本,你能够添加一个java.version
属性:
<properties> <java.version>1.8</java.version> </properties>
Spring Boot包含一个Maven插件,它能够将项目打包成一个可执行jar。若是想使用它,你能够将该插件添加到<plugins>节点处:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
注:若是使用Spring Boot starter parent pom,你只须要添加该插件而无需配置它,除非你想改变定义在partent中的设置。
Gradle用户能够直接在它们的dependencies节点处导入”starter POMs“。跟Maven不一样的是,这里没有用于导入共享配置的"超父"(super parent)。
apply plugin: 'java' repositories { jcenter() } dependencies { compile("org.springframework.boot:spring-boot-starter-web:1.3.0.BUILD-SNAPSHOT") }
spring-boot-gradle-plugin插件也是能够使用的,它提供建立可执行jar和从source运行项目的任务。它也添加了一个ResolutionStrategy用于让你省略经常使用依赖的版本号:
buildscript {
repositories { jcenter() }
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.0.BUILD-SNAPSHOT") } } apply plugin: 'java' apply plugin: 'spring-boot' repositories { jcenter() } dependencies { compile("org.springframework.boot:spring-boot-starter-web") testCompile("org.springframework.boot:spring-boot-starter-test") }
使用Apache Ant构建一个Spring Boot项目是彻底可能的,然而,Spring Boot没有为它提供特殊的支持或插件。Ant脚本能够使用Ivy依赖管理系统来导入starter POMs。
查看Section 73.8, “Build an executable archive with Ant”获取更多指导。
Starter POMs是能够包含到应用中的一个方便的依赖关系描述符集合。你能够获取全部Spring及相关技术的一站式服务,而不须要翻阅示例代码,拷贝粘贴大量的依赖描述符。例如,若是你想使用Spring和JPA进行数据库访问,只须要在你的项目中包含spring-boot-starter-data-jpa
依赖,而后你就能够开始了。
该starters包含不少你搭建项目,快速运行所需的依赖,并提供一致的,管理的传递依赖集。
名字有什么含义:全部的starters遵循一个类似的命名模式:spring-boot-starter-*
,在这里*是一种特殊类型的应用程序。该命名结构旨在帮你找到须要的starter。不少IDEs集成的Maven容许你经过名称搜索依赖。例如,使用相应的Eclipse或STS插件,你能够简单地在POM编辑器中点击ctrl-space,而后输入"spring-boot-starter
"能够获取一个完整列表。
下面的应用程序starters是Spring Boot在org.springframework.boot
组下提供的:
Spring Boot application starters
名称 | 描述 |
---|---|
spring-boot-starter | 核心Spring Boot starter,包括自动配置支持,日志和YAML |
spring-boot-starter-actuator | 生产准备的特性,用于帮你监控和管理应用 |
spring-boot-starter-amqp | 对"高级消息队列协议"的支持,经过spring-rabbit实现 |
spring-boot-starter-aop | 对面向切面编程的支持,包括spring-aop和AspectJ |
spring-boot-starter-batch | 对Spring Batch的支持,包括HSQLDB数据库 |
spring-boot-starter-cloud-connectors | 对Spring Cloud Connectors的支持,简化在云平台下(例如,Cloud Foundry 和Heroku)服务的链接 |
spring-boot-starter-data-elasticsearch | 对Elasticsearch搜索和分析引擎的支持,包括spring-data-elasticsearch |
spring-boot-starter-data-gemfire | 对GemFire分布式数据存储的支持,包括spring-data-gemfire |
spring-boot-starter-data-jpa | 对"Java持久化API"的支持,包括spring-data-jpa,spring-orm和Hibernate |
spring-boot-starter-data-mongodb | 对MongoDB NOSQL数据库的支持,包括spring-data-mongodb |
spring-boot-starter-data-rest | 对经过REST暴露Spring Data仓库的支持,经过spring-data-rest-webmvc实现 |
spring-boot-starter-data-solr | 对Apache Solr搜索平台的支持,包括spring-data-solr |
spring-boot-starter-freemarker | 对FreeMarker模板引擎的支持 |
spring-boot-starter-groovy-templates | 对Groovy模板引擎的支持 |
spring-boot-starter-hateoas | 对基于HATEOAS的RESTful的服务的支持,经过弹簧HATEOAS实现 |
弹簧引导启动,将hornetq | 对 “的Java消息服务API” 的支持,经过HornetQ的实现 |
弹簧引导启动整合 | 对普通弹簧集成模块的支持 |
弹簧引导启动-JDBC | 对JDBC数据库的支持 |
弹簧引导起动球衣 | 对泽西RESTful Web服务框架的支持 |
弹簧引导启动,JTA,Atomikos公司 | 对JTA分布式事务的支持,经过Atomikos公司实现 |
弹簧引导启动,JTA,bitronix | 对JTA分布式事务的支持,经过Bitronix实现 |
弹簧引导启动邮件 | 对javax.mail的支持 |
弹簧引导启动移动 | 对弹簧移动的支持 |
弹簧引导启动,小胡子 | 对胡须模板引擎的支持 |
弹簧引导起动的Redis | 对Redis的键值数据存储的支持,包括弹簧的Redis |
弹簧引导启动安全 | 对春季安全的支持 |
弹簧引导起动社会的Facebook | 对弹簧社会的Facebook的支持 |
春天开机起动 - 社会 - LinkedIn | 对弹簧社会LinkedIn的支持 |
春天开机起动 - 社会 - 叽叽喳喳 | 对弹簧社会叽叽喳喳的支持 |
弹簧引导启动测试 | 对经常使用测试依赖的支持,包括JUnit,Hamcrest和Mockito,还有spring-test模块 |
弹簧引导起动thymeleaf | 对Thymeleaf模板引擎的支持,包括和春天的集成 |
弹簧引导起动速度 | 对速度模板引擎的支持 |
弹簧引导启动的Web | 对全栈网络开发的支持,包括Tomcat的和弹簧webmvc |
弹簧引导起动的WebSocket | 对WebSocket的开发的支持 |
spring-boot-starter-ws对Spring | 网络服务的支持 |
除了应用程序的启动,下面的启动器用于能够添加生产准备的特性。
Spring Boot生产准备的启动器
名称 | 描述 |
---|---|
弹簧引导起动致动器 | 添加生产准备特性,好比指标和监控 |
弹簧引导起动远程 - 壳 | 添加远程ssh shell支持 |
最后,Spring Boot包含一些可用于排除或交换具体技术方面的启动器。
Spring Boot技术首发
名称 | 描述 |
---|---|
弹簧引导起动码头 | 导入Jetty HTTP引擎(做为Tomcat的替代) |
弹簧引导起动的log4j | 对Log4J的日志系统的支持 |
弹簧引导启动日志记录 | 导入Spring Boot的默认日志系统(Logback) |
弹簧引导起动的tomcat | 导入Spring Boot的默认HTTP引擎(Tomcat) |
弹簧引导起动暗流 | 导入Undertow HTTP引擎(做为Tomcat的替代) |
注:查看GitHub上位于spring-boot-starters
模块内的README文件,能够获取到一个社区贡献的其余启动器POM列表。
Spring Boot不须要使用任何特殊的代码结构,然而,这里有一些有用的最佳实践。
当类没有包含声明package
时,它被认为处于default package
下。一般不推荐使用default package
,并应该避免使用它。由于对于使用@ComponentScan
,@EntityScan
或@SpringBootApplication
注解的Spring Boot应用来讲,来自每一个jar的类都会被读取,这会形成必定的问题。
注:咱们建议你遵循Java的推荐的包命名规范,使用一个反转的域名(例如com.example.project
)。
咱们一般建议你将主要应用类放在位于其余类上面的根包(root package)中。一般使用@EnableAutoConfiguration
注解你的主类,而且暗地里为某些项定义了一个基础“ search package
”。例如,若是你正在编写一个JPA应用,被EnableAutoConfiguration
注解的类所在包将被用来搜索@Entity
项。
根使用包网求容许你使用@ComponentScan
注解而不须要定义一个basePackage属性。若是主类位于根包中,也。你能够使用@SpringBootApplication
注解。
下面是一个典型的结构:
com
+- example
+- myproject
+- Application.java
| +- domain | +- Customer.java | +- CustomerRepository.java | +- service | +- CustomerService.java | +- web +- CustomerController.java
Application.java
文件将声明的主要方法,还有基本的@Configuration
。
package com.example.myproject; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @EnableAutoConfiguration @ComponentScan public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
Spring Boot提倡基于Java的配置。尽管你能够使用一个XML源来调用SpringApplication.run()
,咱们一般建议你使用@Configuration
类做为主要源。通常定义主方法的类也是主要@Configuration
的一个很好候选。
注:不少使用XML配置的春天配置示例已经被发布到网络上你应该老是尽量的使用基于Java的的配置搜索查看。enable*
注解就是一个好的开端。
不须要你将全部的@Configuration
放进一个单独的类。@Import
注解能够用来导入其余配置类。另外,也。你能够使用@ComponentScan
注解自动收集全部的弹簧组件,包括@Configuration
类。
若是你绝对须要使用基于XML的配置,建议咱们仍旧你从一个@Configuration
类开始。能够你使用附加的@ImportResource
注解加载XML配置文件。
Spring Boot自动配置(auto-configuration
)尝试根据你添加的jar依赖自动配置你的Spring应用。例如,若是你的类路径下存在HSQLDB
,而且你没有手动配置任何数据库链接豆,那么咱们将自动配置一个个存型(in-内存)数据库。
能够你经过将@EnableAutoConfiguration
或@SpringBootApplication
注解添加到一个@Configuration
类上来选择自动配置。
注:你只须要添加一个@EnableAutoConfiguration
。咱们注解建议你将它添加到主@Configuration
类上。
自动配置是非侵占性的,任什么时候候你均可以定义本身的配置类来替换自动配置的特定部分例如,若是你添加本身的DataSource
绿豆,默认的内嵌数据库支持将不被考虑。
若是须要找出当前应用了哪些自动配置及应用的缘由,能够你使用--debug
开关启动应用。这将会记录一个自动配置的报告并输出到控制台。
若是发现应用了你不想要的特定自动配置类,你能够使用@EnableAutoConfiguration
注解的排除属性来禁用它们。
import org.springframework.boot.autoconfigure.*; import org.springframework.boot.autoconfigure.jdbc.*; import org.springframework.context.annotation.*; @Configuration @EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class}) public class MyConfiguration { }
你能够自由地使用任何标准的Spring框架技术去定义beans和它们注入的依赖。简单起见,咱们常用@ComponentScan
注解搜索beans,并结合@Autowired
构造器注入。
若是使用上面建议的结构组织代码(将应用类放到根包下),你能够添加@ComponentScan
注解而不须要任何参数。你的全部应用程序组件(@Component
, @Service
, @Repository
, @Controller
等)将被自动注册为Spring Beans。
下面是一个@Service Bean
的示例,它使用构建器注入获取一个须要的RiskAssessor bean。
package com.example.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class DatabaseAccountService implements AccountService { private final RiskAssessor riskAssessor; @Autowired public DatabaseAccountService(RiskAssessor riskAssessor) { this.riskAssessor = riskAssessor; } // ... }
注:注意如何使用构建器注入来容许riskAssessor
字段被标记为final
,这意味着riskAssessor
后续是不能改变的。
不少Spring Boot开发者老是使用@Configuration
,@EnableAutoConfiguration
和@ComponentScan
注解他们的main类。因为这些注解被如此频繁地一块使用(特别是你遵循以上最佳实践时),Spring Boot提供一个方便的@SpringBootApplication
选择。
该@SpringBootApplication注解等价于以默认属性使用@Configuration
,@EnableAutoConfiguration
和@ComponentScan
。
package com.example.myproject; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
将应用打包成jar并使用一个内嵌HTTP服务器的一个最大好处是,你能够像其余方式那样运行你的应用程序。调试Spring Boot应用也很简单;你不须要任何特殊IDE或扩展。
注:本章节只覆盖基于jar的打包,若是选择将应用打包成war文件,你最好参考一下服务器和IDE文档。
你能够从IDE中运行Spring Boot应用,就像一个简单的Java应用,可是,你首先须要导入项目。导入步骤跟你的IDE和构建系统有关。大多数IDEs可以直接导入Maven项目,例如Eclipse用户能够选择File菜单的Import… --> Existing Maven Projects
。
若是不能直接将项目导入IDE,你能够须要使用构建系统生成IDE元数据。Maven有针对Eclipse和IDEA的插件;Gradle为各类IDEs提供插件。
注:若是意外地运行一个web应用两次,你将看到一个"端口已在使用中"错误。为了确保任何存在的实例是关闭的,STS用户能够使用Relaunch按钮而不是Run按钮。
若是使用Spring Boot Maven或Gradle插件建立一个可执行jar,你能够使用java -jar运行你的应用。例如:
$ java -jar target/myproject-0.0.1-SNAPSHOT.jar
运行一个打包的程序并开启远程调试支持是可能的,这容许你将调试器附加到打包的应用程序上:
$ java -Xdebug -Xrunjdwp:server=y,transport=dt_socket,address=8000,suspend=n \ -jar target/myproject-0.0.1-SNAPSHOT.jar
Spring Boot Maven插件包含一个run目标,它能够用来快速编译和运行应用程序。应用程序以一种暴露的方式运行,因为即时"热"加载,你能够编辑资源。
$ mvn spring-boot:run
你可能想使用有用的操做系统环境变量:
$ export MAVEN_OPTS=-Xmx1024m -XX:MaxPermSize=128M -Djava.security.egd=file:/dev/./urandom
("egd"设置是经过为Tomcat提供一个更快的会话keys熵源来加速Tomcat的。)
Spring Boot Gradle插件也包含一个run目标,它能够用来以暴露的方式运行你的应用程序。无论你何时导入spring-boot-plugin
,bootRun任务老是被添加进去。
$ gradle bootRun
你可能想使用那些有用的操做系统环境变量:
$ export JAVA_OPTS=-Xmx1024m -XX:MaxPermSize=128M -Djava.security.egd=file:/dev/./urandom
因为Spring Boot应用程序只是普通的Java应用,那JVM热交换(hot-swapping)应该能出色的工做.JVM热交换在它能替换的字节码上有些限制,更全面的解决方案能够使用Spring Loaded项目或JRebel。
关于热交换能够参考“如何作”的相应章节。
可执行罐可用于生产部署。因为它们是自包含的,很是适合基于云的部署。关于其余“生产准备”的特性,好比健康监控,审计和指标REST,或JMX端点,能够考虑添加春季启动-actuator。具体参考第五部分,“弹簧启动执行器:生产就绪功能”。
SpringApplication类提供了一种从主()方法启动春季应用的便捷方式在不少状况下,你只需委托给SpringApplication.run这个静态方法:
public static void main(String[] args){ SpringApplication.run(MySpringConfiguration.class, args); }
当应用启动时,你应该会看到相似下面的东西(这是何方神兽??):
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: v1.2.2.BUILD-SNAPSHOT 2013-07-31 00:08:16.117 INFO 56603 --- [ main] o.s.b.s.app.SampleApplication : Starting SampleApplication v0.1.0 on mycomputer with PID 56603 (/apps/myapp.jar started by pwebb) 2013-07-31 00:08:16.166 INFO 56603 --- [ main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@6e5a8246: startup date [Wed Jul 31 00:08:16 PDT 2013]; root of context hierarchy 2014-03-04 13:09:54.912 INFO 41370 --- [ main] .t.TomcatEmbeddedServletContainerFactory : Server initialized with port: 8080 2014-03-04 13:09:56.501 INFO 41370 --- [ main] o.s.b.s.app.SampleApplication
默认状况下会显示INFO级别的日志信息,包括一些相关的启动详情,好比启动应用的用户等。
经过在类路径下添加一个banner.txt或设置banner.location来指定相应的文件能够改变启动过程当中打印的横幅。若是这个文件有特殊的编码,你能够使用banner.encoding设置它(默认为UTF-8 )。
在banner.txt中能够使用以下的变量:
变量 | 描述 |
---|---|
$ {} application.version | MANIFEST.MF中声明的应用版本号,例如1.0 |
$ {application.formatted版本} | MANIFEST.MF中声明的被格式化后的应用版本号(被括号包裹且以v做为前缀),用于显示,例如(V1.0) |
$ {弹簧boot.version} | 正在使用的Spring Boot版本号,例如1.2.2.BUILD-SNAPSHOT |
$ {弹簧boot.formatted版本} | 正在使用的Spring Boot被格式化后的版本号(被括号包裹且以v做为前缀),用于显示,例如(v1.2.2.BUILD-SNAPSHOT) |
注:若是想以编程的方式产生一个条幅,能够使用SpringBootApplication.setBanner(...)方法使用org.springframework.boot.Banner接口,实现你本身的printBanner()方法。
若是默认的SpringApplication不符合你的口味,你能够建立一个本地的实例并自定义它例如,关闭旗帜你能够这样写:
public static void main(String[] args){ SpringApplication app = new SpringApplication(MySpringConfiguration.class); app.setShowBanner(false); app.run(args); }
注:传递给SpringApplication的构造器参数是spring beans的配置源。在大多数状况下,这些将是@Configuration类的引用,但它们也多是XML配置或要扫描包的引用。
你也能够使用application.properties文件来配置SpringApplication。具体参考外化配置。查看配置选项的完整列表,可参考SpringApplication Javadoc。
若是你须要建立一个分层的ApplicationContext的(多个具备父子关系的上下文),或你只是喜欢使用流畅的构建API,你能够使用SpringApplicationBuilder.SpringApplicationBuilder容许你以链式方式调用多个方法,包括能够建立层次结构的父母和孩子方法。
new SpringApplicationBuilder() .showBanner(false) .sources(Parent.class) .child(Application.class) .run(args);
注:建立ApplicationContext层次时有些限制,好比,Web组件(组件)必须包含在子上下文(子上下文)中,且相同的环境即用于父上下文也用于子上下文中。具体参考SpringApplicationBuilder javadoc
除了常见的弹簧框架事件,好比ContextRefreshedEvent,一个SpringApplication也发送一些额外的应用事件。一些事件其实是在ApplicationContext中被建立前触发的。
你能够使用多种方式注册事件监听器,最普通的是使用SpringApplication.addListeners(...)方法在你的应用运行时,应用事件会如下面的次序发送:
注:你一般不须要使用应用程序事件,但知道它们的存在会很方便(在某些场合可能会使用到)。在Spring内部,Spring Boot使用事件处理各类各样的任务。
一个SpringApplication将尝试为你建立正确类型的ApplicationContext中。在默认状况下,使用AnnotationConfigApplicationContext或AnnotationConfigEmbeddedWebApplicationContext取决于你正在开发的是不是网页应用。
用于肯定一个web环境的算法至关简单(基因而否存在某些类)。若是须要覆盖默认行为,你能够使用setWebEnvironment(boolean webEnvironment)。经过调用setApplicationContextClass(...),你能够彻底控制ApplicationContext的类型。
注:当JUnit的测试里使用SpringApplication时,调用setWebEnvironment(假)是可取的。
若是你想获取原始的命令行参数,或一旦SpringApplication启动,你须要运行一些特定的代码,你能够实现CommandLineRunner接口。在全部实现该接口的Spring beans上将调用run(String ... args)方法。
import org.springframework.boot.* import org.springframework.stereotype.* @Component public class MyBean implements CommandLineRunner { public void run(String... args) { // Do something... } }
若是一些CommandLineRunner beans被定义必须以特定的次序调用,你能够额外实现org.springframework.core.Ordered接口或使用org.springframework.core.annotation.Order注解。
每一个SpringApplication在退出时为了确保ApplicationContext被优雅的关闭,将会注册一个JVM的shutdown钩子。全部标准的Spring生命周期回调(好比,DisposableBean接口或@PreDestroy注解)都能使用。
此外,若是beans想在应用结束时返回一个特定的退出码(exit code),能够实现org.springframework.boot.ExitCodeGenerator接口。
Spring Boot容许外化(externalize)你的配置,这样你可以在不一样的环境下使用相同的代码。你能够使用properties文件,YAML文件,环境变量和命令行参数来外化配置。使用@Value注解,能够直接将属性值注入到你的beans中,并经过Spring的Environment抽象或绑定到结构化对象来访问。
Spring Boot使用一个很是特别的PropertySource次序来容许对值进行合理的覆盖,须要如下面的次序考虑属性:
下面是一个具体的示例(假设你开发一个使用name属性的@Component):
import org.springframework.stereotype.* import org.springframework.beans.factory.annotation.* @Component public class MyBean { @Value("${name}") private String name; // ... }
你能够将一个application.properties文件捆绑到罐子内,用来提供一个合理的默认名称属性值。当运行在生产环境时,能够在罐子外提供一个application.properties文件来覆盖名称属性。对于一次性的测试,你能够使用特定的命令行开关启动(好比,java -jar app.jar --name =“Spring”)。
RandomValuePropertySource在注入随机值(好比,密钥或测试用例)时颇有用它能产生整数,多头或字符串,好比:
my.secret=${random.value}
my.number=${random.int} my.bignumber=${random.long} my.number.less.than.ten=${random.int(10)} my.number.in.range=${random.int[1024,65536]}
random.int *语法是OPEN value(,max)CLOSE,此处OPEN,CLOSE能够是任何字符,而且value,max是整数。若是提供max,那么值是最小的值,max是最大的值(不包含在内)。
默认状况下,SpringApplication将任何可选的命令行参数(以' - '开头,好比, - server.port = 9000)转化为属性,并将其添加到Spring Environment中。如上所述,命令行属性老是优先于其余属性源。
若是你不想将命令行属性添加到环境里,你能够使用SpringApplication.setAddCommandLineProperties(假)来禁止它们。
SpringApplication将从如下位置加载application.properties文件,并把它们添加到Spring Environment中:
这个列表是按优先级排序的(列表中位置高的将覆盖位置低的)。
注:你能够使用YAML(”。YML ')文件替代' 的.properties'。
若是不喜欢将application.properties做为配置文件名,你能够经过指定spring.config.name环境属性来切换其余的名称。你也能够使用spring.config.location环境属性来引用一个明确的路径(目录位置或文件路径列表以逗号分割)。
$ java -jar myproject.jar --spring.config.name=myproject
//or $ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
若是spring.config.location包含目录(相对于文件),那它们应该以/结尾(在加载前,spring.config.name产生的名称将被追加到后面)。无论spring.config.location是什么值,默认的搜索路径类路径:,类路径:/配置,文件:,文件:配置/总会被使用以这种方式,你能够在application.properties中为应用设置默认值,而后在运行的时候使用不一样的文件覆盖它,同时保留默认配置。
注:若是你使用环境变量而不是系统配置,大多数操做系统不容许以句号分割(句点分隔)的键名称,但你能够使用下划线(下划线)代替(好比,使用SPRING_CONFIG_NAME代替spring.config.name )若是你的应用运行在一个容器中,那么JNDI属性(的java:comp / env的)或小服务程序上下文初始化参数能够用来取代环境变量或系统属性,固然也能够使用环境变量或系统属性。
除了application.properties文件,特定配置属性也能经过命令惯例应用 - {轮廓}的.properties来定义。特定资料属性从跟标准application.properties相同的路径加载,而且特定轮廓文件会覆盖默认的配置。
当application.properties里的值被使用时,它们会被存在的环境过滤,因此你可以引用先前定义的值(好比,系统属性)。
app.name=MyApp
app.description=${app.name} is a Spring Boot application
注:你也能使用相应的技巧为存在的Spring Boot属性建立'短'变量,具体参考Section 63.3, “Use ‘short’ command line arguments”。
YAML是JSON的一个超集,也是一种方便的定义层次配置数据的格式。不管你什么时候将SnakeYAML 库放到classpath下,SpringApplication类都会自动支持YAML做为properties的替换。
注:若是你使用'starter POMs',spring-boot-starter会自动提供SnakeYAML。
Spring框架提供两个便利的类用于加载YAML文档,YamlPropertiesFactoryBean会将YAML做为Properties来加载,YamlMapFactoryBean会将YAML做为Map来加载。
示例:
environments:
dev:
url: http://dev.bar.com name: Developer Setup prod: url: http://foo.bar.com name: My Cool App
上面的YAML文档会被转化到下面的属性中:
environments.dev.url=http://dev.bar.com environments.dev.name=Developer Setup environments.prod.url=http://foo.bar.com environments.prod.name=My Cool App
YAML列表被表示成使用[index]间接引用做为属性keys的形式,例以下面的YAML:
my: servers: - dev.bar.com - foo.bar.com
将会转化到下面的属性中:
my.servers[0]=dev.bar.com my.servers[1]=foo.bar.com
使用Spring DataBinder工具绑定那样的属性(这是@ConfigurationProperties作的事),你须要肯定目标bean中有个java.util.List或Set类型的属性,而且须要提供一个setter或使用可变的值初始化它,好比,下面的代码将绑定上面的属性:
@ConfigurationProperties(prefix="my") public class Config { private List<String> servers = new ArrayList<String>(); public List<String> getServers() { return this.servers; } }
YamlPropertySourceLoader类可以用于将YAML做为一个PropertySource导出到Sprig Environment。这容许你使用熟悉的@Value注解和占位符语法访问YAML属性。
你能够在单个文件中定义多个特定配置(profile-specific)的YAML文档,并经过一个spring.profiles key标示应用的文档。例如:
server: address: 192.168.1.100 --- spring: profiles: development server: address: 127.0.0.1 --- spring: profiles: production server: address: 192.168.1.120
在上面的例子中,若是开发配置被激活,那server.address属性将是127.0.0.1。若是开发和生产配置(配置文件)没有启用,则该属性的值将是192.168.1.100。
YAML文件不能经过@PropertySource注解加载。因此,在这种状况下,若是须要使用@PropertySource注解的方式加载值,那就要使用的属性文件。
使用@Value(“$ {property}”)注解注入配置属性有时可能比较笨重,特别是须要使用多个属性或你的数据自己有层次结构。为了控制和校验你的应用配置,Spring Boot提供一个容许强类型豆的替代方法来使用性质。
示例:
@Component @ConfigurationProperties(prefix="connection") public class ConnectionSettings { private String username; private InetAddress remoteAddress; // ... getters and setters }
当@EnableConfigurationProperties注解应用到你的@Configuration时,任何被@ConfigurationProperties注解的豆类将自动被环境属性配置。这种风格的配置特别适合与SpringApplication的外部YAML配置进行配合使用。
# application.yml connection: username: admin remoteAddress: 192.168.1.1 # additional configuration as required
为了使用@ConfigurationProperties豆,你能够使用与其余任何bean相同的方式注入它们。
@Service public class MyService { @Autowired private ConnectionSettings connection; //... @PostConstruct public void openConnection() { Server server = new Server(); this.connection.configure(server); } }
你能够经过@EnableConfigurationProperties注解中直接简单的列出属性类来快捷的注册@ConfigurationProperties bean的定义。
@Configuration @EnableConfigurationProperties(ConnectionSettings.class) public class MyConfiguration { }
注:使用@ConfigurationProperties可以产生可被IDEs使用的元数据文件。具体参考附录B,配置元数据。
正如使用@ConfigurationProperties注解一个类,你也能够在@Bean方法上使用它。当你须要绑定属性到不受你控制的第三方组件时,这种方式很是有用。
为了从环境属性配置一个豆,将@ConfigurationProperties添加到它的豆注册过程:
@ConfigurationProperties(prefix = "foo") @Bean public FooComponent fooComponent() { ... }
和上面ConnectionSettings的示例方式相同,任何以富为前缀的属性定义都会被映射到FooComponent上。
Spring Boot使用一些宽松的规则用于绑定环境属性到@ConfigurationProperties beans,因此环境属性名和豆属性名不须要精确匹配。常见的示例中有用的包括虚线分割(好比,context - path绑定到contextPath )和将环境属性转为大写字母(好比,PORT绑定端口)。
示例:
@Component @ConfigurationProperties(prefix="person") public class ConnectionSettings { private String firstName; }
下面的属性名都能用于上面的@ConfigurationProperties类:
属性 | 说明 |
---|---|
person.firstName | 标准驼峰规则 |
person.first名 | 虚线表示,推荐用于的.properties和.yml文件中 |
PERSON_FIRST_NAME | 大写形式,使用系统环境变量时推荐 |
Spring会尝试强制外部的应用属性在绑定到@ConfigurationProperties beans时类型是正确的。若是须要自定义类型转换,你能够提供一个ConversionService bean(bean id为conversionService)或自定义属性编辑器(经过一个CustomEditorConfigurer豆)。
Spring Boot将尝试校验外部的配置,默认使用JSR-303(若是在类路径路径中)。你能够轻松的为你的@ConfigurationProperties类添加JSR-303 javax.validation约束注解:
@Component @ConfigurationProperties(prefix="connection") public class ConnectionSettings { @NotNull private InetAddress remoteAddress; // ... getters and setters }
你也能够经过建立一个叫作configurationPropertiesValidator的bean来添加自定义的Spring Validator。
注:spring-boot-actuator模块包含一个暴露全部@ConfigurationProperties beans的端点。简单地将你的web浏览器指向/ configprops或使用等效的JMX端点。具体参考生产就绪功能。
Spring Profiles提供了一种隔离应用程序配置的方式,并让这些配置只能在特定的环境下生效。任何@Component或@Configuration都能被@Profile标记,从而限制加载它的时机。
@Configuration @Profile("production") public class ProductionConfiguration { // ... }
以正常的春天方式,你能够使用一个spring.profiles.active的环境属性来指定哪一个配置生效你能够使用日常的任何方式来指定该属性,例如,能够将它包含到你的application.properties中:
spring.profiles.active=dev,hsqldb
或使用命令行开关:
--spring.profiles.active=dev,hsqldb
spring.profiles.active属性和其余属性同样都遵循相同的排列规则,最高的PropertySource获胜。也就是说,你能够在application.properties中指定生效的配置,而后使用命令行开关替换它们。
有时,将特定的配置属性添加到生效的配置中而不是替换它们是有用的.spring.profiles.include属性能够用来无条件的添加生效的配置.SpringApplication的入口点也提供了一个用于设置额外配置的Java API(好比,在那些经过spring.profiles.active属性生效的配置之上):参考setAdditionalProfiles()方法。
示例:当一个应用使用下面的属性,并用--spring.profiles.active = PROD开关运行,那PRODDB和prodmq配置也会生效:
--- my.property: fromyamlfile --- spring.profiles: prod spring.profiles.include: proddb,prodmq
注:spring.profiles属性能够定义到一个YAML文档中,用于决定何时该文档被包含进配置中。具体参考第63.6节“根据环境改变配置”
在应用运行前,你能够经过调用SpringApplication.setAdditionalProfiles(...)方法,以编程的方式设置生效的配置。使用弹簧的ConfigurableEnvironment接口激动配置也是可行的。
application.properties(或application.yml)和经过@ConfigurationProperties引用的文件这两种配置特定变种都被看成文件来加载的,具体参考第23.3节“特定于配置文件的属性”。
Spring Boot内部日志系统使用的是Commons Logging,但开放底层的日志实现。默认为会Java Util Logging,Log4J,Log4J2和Logback提供配置。每种状况下都会预先配置使用控制台输出,也能够使用可选的文件输出。
默认状况下,若是你使用'Starter POM',那么就会使用Logback记录日志。为了确保那些使用Java Util Logging,Commons Logging,Log4J或SLF4J的依赖库可以正常工做,正确的Logback路由也被包含进来。
注:若是上面的列表看起来使人困惑,不要担忧,Java有不少可用的日志框架。一般,你不须要改变日志依赖,Spring Boot默认的就能很好的工做。
Spring Boot默认的日志输出格式以下:
2014-03-05 10:57:51.112 INFO 45469 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/7.0.52
2014-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2014-03-05 10:57:51.253 INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 1358 ms 2014-03-05 10:57:51.698 INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean : Mapping servlet: 'dispatcherServlet' to [/] 2014-03-05 10:57:51.702 INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
输出的节点(项目)以下:
默认的日志配置会在写日志消息时将它们回显到控制台。默认,ERROR, WARN和INFO级别的消息会被记录。能够在启动应用时,经过--debug标识开启控制台的DEBUG级别日志记录。
$ java -jar myapp.jar --debug
若是你的终端支持ANSI,为了增长可读性将会使用彩色的日志输出。你能够设置spring.output.ansi.enabled为一个支持的值来覆盖自动检测。
默认状况下,Spring Boot只会将日志记录到控制台而不会写进日志文件。若是除了输出到控制台你还想写入到日志文件,那你须要设置logging.file或logging.path属性(例如在你的application.properties中)。
下表显示如何组合使用logging.*
:
logging.file | logging.path | 示例 | 描述 |
---|---|---|---|
(none) | (none) | 只记录到控制台 | |
Specific file | (none) | my.log | 写到特定的日志文件里,名称能够是一个精确的位置或相对于当前目录 |
(none) | Specific folder | /var/log | 写到特定文件夹下的spring.log里,名称能够是一个精确的位置或相对于当前目录 |
日志文件每达到10M就会被轮换(分割),和控制台同样,默认记录ERROR, WARN和INFO级别的信息。
全部支持的日志系统在Spring的Environment(例如在application.properties里)都有经过'logging.level.*=LEVEL'('LEVEL'是TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF中的一个)设置的日志级别。
示例:application.properties
logging.level.org.springframework.web: DEBUG logging.level.org.hibernate: ERROR
经过将适当的库添加到classpath,能够激活各类日志系统。而后在classpath的根目录(root)或经过Spring Environment的logging.config属性指定的位置提供一个合适的配置文件来达到进一步的定制(注意因为日志是在ApplicationContext被建立以前初始化的,因此不可能在Spring的@Configuration文件中,经过@PropertySources控制日志。系统属性和日常的Spring Boot外部配置文件能正常工做)。
根据你的日志系统,下面的文件会被加载:
日志系统 | 定制 |
---|---|
Logback | logback.xml |
Log4j | log4j.properties或log4j.xml |
Log4j2 | log4j2.xml |
JDK (Java Util Logging) | logging.properties |
为了帮助定制一些其余的属性,从Spring的Envrionment转换到系统属性:
Spring Environment | System Property | 评价 |
---|---|---|
logging.file | LOG_FILE | 若是定义,在默认的日志配置中使用 |
logging.path | LOG_PATH | 若是定义,在默认的日志配置中使用 |
PID | PID | 当前的处理进程(process)ID(若是可以被发现且尚未做为操做系统环境变量被定义) |
全部支持的日志系统在解析它们的配置文件时都能查询系统属性。具体能够参考spring-boot.jar中的默认配置。
注:在运行可执行的jar时,Java Util Logging有类加载问题,咱们建议你尽量避免使用它。
Spring Boot很是适合开发web应用程序。你能够使用内嵌的Tomcat,Jetty或Undertow轻轻松松地建立一个HTTP服务器。大多数的web应用都使用spring-boot-starter-web模块进行快速搭建和运行。
Spring Web MVC框架(一般简称为“Spring MVC”)是一个个“模型,视图,控制器”的web框架.Spring MVC容许你建立特定的@Controller或@RestController beans来处理传入的HTTP请求。使用@RequestMapping注解能够将控制器中的方法映射到相应的HTTP请求。
示例:
@RestController @RequestMapping(value="/users") public class MyRestController { @RequestMapping(value="/{user}", method=RequestMethod.GET) public User getUser(@PathVariable Long user) { // ... } @RequestMapping(value="/{user}/customers", method=RequestMethod.GET) List<Customer> getUserCustomers(@PathVariable Long user) { // ... } @RequestMapping(value="/{user}", method=RequestMethod.DELETE) public User deleteUser(@PathVariable Long user) { // ... } }
Spring Boot为Spring MVC提供适用于多数应用的自动配置功能。在Spring默认基础上,自动配置添加了如下特性:
若是想全面控制Spring MVC,你能够添加本身的@Configuration,并使用@EnableWebMvc对其注解。若是想保留Spring Boot MVC的特性,而且只是添添其余的MVC配置(拦截器,formatters,视图控制器等) ,你能够添加本身的WebMvcConfigurerAdapter类型的@Bean(不使用@EnableWebMvc注解)。
Spring MVC使用HttpMessageConverter接口转换HTTP请求和响应。合理的缺省值被包含的恰到好处(开箱即用),例如对象能够自动转换为JSON(使用Jackson库)或XML(若是Jackson XML扩展可用则使用它,不然使用JAXB)。字符串默认使用UTF-8编码。
若是须要添加或自定义转换器,你能够使用Spring Boot的HttpMessageConverters类:
import org.springframework.boot.autoconfigure.web.HttpMessageConverters; import org.springframework.context.annotation.*; import org.springframework.http.converter.*; @Configuration public class MyConfiguration { @Bean public HttpMessageConverters customConverters() { HttpMessageConverter<?> additional = ... HttpMessageConverter<?> another = ... return new HttpMessageConverters(additional, another); } }
任何在上下文中出现的HttpMessageConverter bean将会添加到转换器列表,你能够经过这种方式覆盖默认的转换器(转换器)。
Spring MVC有一个策略,用于从绑定的错误产生用来渲染错误信息的错误码:MessageCodesResolver。若是设置spring.mvc.message-codes-resolver.format
属性为PREFIX_ERROR_CODE
或POSTFIX_ERROR_CODE
(具体查看DefaultMessageCodesResolver.Format
枚举值),Spring Boot会为你建立一个MessageCodesResolver。
默认状况下,Spring Boot从类路径下一个叫/ static(/ public,/ resources或/ META-INF / resources)的文件夹或从ServletContext根目录提供静态内容。这使用了Spring MVC的ResourceHttpRequestHandler,因此你能够经过添加本身的WebMvcConfigurerAdapter并覆写addResourceHandlers方法来改变这个行为(加载静态文件)。
在一个单独的网络应用中,容器默认的servlet的是开启的,若是春节决定不处理某些请求,默认的servlet的做为一个回退(降级)将从ServletContext的根目录加载内容。大多数时候,这不会发生(除非你修改默认的MVC配置),由于春季总可以经过的DispatcherServlet处理请求。
此外,上述标准的静态资源位置有个例外状况是Webjars内容。任何在/ webjars / **路径下的资源都将从罐文件中提供,只要它们以Webjars的格式打包。
注:若是你的应用将被打包成JAR,那就不要使用的src / main / webapp的文件夹尽管该文件夹是一个共同的标准,但它仅在打包成战争的状况下起做用,而且若是产生一个坛子,多数构建工具都会静悄悄的忽略它。
正如REST Web服务,你也能够使用Spring MVC提供动态HTML内容.Spring MVC支持各类各样的模板技术,包括Velocity,FreeMarker和JSPs。不少其余的模板引擎也提供它们本身的Spring MVC集成。
Spring Boot为如下的模板引擎提供自动配置支持:
注:若是可能的话,应该忽略的JSP,由于在内嵌的servlet的使用容器时它们存在一些已知的限制。
当你使用这些引擎的任何一种,并采用默认的配置,你的模板将会从SRC /主/资源/模板目录下自动加载。
注:IntelliJ IDEA根据你运行应用的方式会对classpath进行不一样的整理。在IDE里经过主方法运行你的应用跟从Maven或Gradle或打包好的jar中运行相比会致使不一样的顺序。这可能致使Spring Boot不能从类路径下成功地找到模板。若是遇到这个问题,你能够在IDE里从新对类路径进行排序,将模块的类和资源放到第一位。或者,你能够配置模块的前缀为classpath *:/模板/,这样会查找类路径下的全部模板目录。
Spring Boot默认提供一个/error映射用来以合适的方式处理全部的错误,而且它在servlet容器中注册了一个全局的 错误页面。对于机器客户端(相对于浏览器而言,浏览器偏重于人的行为),它会产生一个具备详细错误,HTTP状态,异常信息的JSON响应。对于浏览器客户端,它会产生一个白色标签样式(whitelabel)的错误视图,该视图将以HTML格式显示一样的数据(能够添加一个解析为erro的View来自定义它)。为了彻底替换默认的行为,你能够实现ErrorController,并注册一个该类型的bean定义,或简单地添加一个ErrorAttributes类型的bean以使用现存的机制,只是替换显示的内容。
若是在某些条件下须要比较多的错误页面,内嵌的servlet容器提供了一个统一的Java DSL(领域特定语言)来自定义错误处理。 示例:
@Bean public EmbeddedServletContainerCustomizer containerCustomizer(){ return new MyCustomizer(); } // ... private static class MyCustomizer implements EmbeddedServletContainerCustomizer { @Override public void customize(ConfigurableEmbeddedServletContainer container) { container.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/400")); } }
你也能够使用常规的Spring MVC特性来处理错误,好比@ExceptionHandler方法和@ControllerAdvice。ErrorController将会捡起任何没有处理的异常。
N.B. 若是你为一个路径注册一个ErrorPage,最终被一个过滤器(Filter)处理(对于一些非Spring web框架,像Jersey和Wicket这很常见),而后过滤器须要显式注册为一个ERROR分发器(dispatcher)。
@Bean public FilterRegistrationBean myFilter() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new MyFilter()); ... registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class)); return registration; }
注:默认的FilterRegistrationBean没有包含ERROR分发器类型。
若是你正在开发一个使用超媒体的RESTful API,Spring Boot将为Spring HATEOAS提供自动配置,这在多数应用中都工做良好。自动配置替换了对使用@EnableHypermediaSupport的需求,并注册必定数量的beans来简化构建基于超媒体的应用,这些beans包括一个LinkDiscoverer和配置好的用于将响应正确编排为想要的表示的ObjectMapper。ObjectMapper能够根据spring.jackson.*属性或一个存在的Jackson2ObjectMapperBuilder bean进行自定义。
经过使用@EnableHypermediaSupport,你能够控制Spring HATEOAS的配置。注意这会禁用上述的对ObjectMapper的自定义。
若是喜欢JAX-RS为REST端点提供的编程模型,你能够使用可用的实现替代Spring MVC。若是在你的应用上下文中将Jersey 1.x和Apache Celtix的Servlet或Filter注册为一个@Bean,那它们工做的至关好。Jersey 2.x有一些原生的Spring支持,因此咱们会在Spring Boot为它提供自动配置支持,连同一个启动器(starter)。
想要开始使用Jersey 2.x只须要加入spring-boot-starter-jersey依赖,而后你须要一个ResourceConfig类型的@Bean,用于注册全部的端点(endpoints)。
@Component public class JerseyConfig extends ResourceConfig { public JerseyConfig() { register(Endpoint.class); } }
全部注册的端点都应该被@Components和HTTP资源annotations(好比@GET)注解。
@Component @Path("/hello") public class Endpoint { @GET public String message() { return "Hello"; } }
因为Endpoint是一个Spring组件(@Component),因此它的生命周期受Spring管理,而且你能够使用@Autowired添加依赖及使用@Value注入外部配置。Jersey servlet将被注册,并默认映射到/*。你能够将@ApplicationPath添加到ResourceConfig来改变该映射。
默认状况下,Jersey将在一个ServletRegistrationBean类型的@Bean中被设置成名称为jerseyServletRegistration的Servlet。经过建立本身的相同名称的bean,你能够禁止或覆盖这个bean。你也能够经过设置spring.jersey.type=filter来使用一个Filter代替Servlet(在这种状况下,被覆盖或替换的@Bean是jerseyFilterRegistration)。该servlet有@Order属性,你能够经过spring.jersey.filter.order进行设置。无论是Servlet仍是Filter注册均可以使用spring.jersey.init.*定义一个属性集合做为初始化参数传递过去。
这里有一个Jersey示例,你能够查看如何设置相关事项。
Spring Boot支持内嵌的Tomcat, Jetty和Undertow服务器。多数开发者只须要使用合适的'Starter POM'来获取一个彻底配置好的实例便可。默认状况下,内嵌的服务器会在8080端口监听HTTP请求。
当使用内嵌的servlet容器时,你能够直接将servlet和filter注册为Spring的beans。在配置期间,若是你想引用来自application.properties的值,这是很是方便的。默认状况下,若是上下文只包含单一的Servlet,那它将被映射到根路径(/)。在多Servlet beans的状况下,bean的名称将被用做路径的前缀。过滤器会被映射到/*。
若是基于约定(convention-based)的映射不够灵活,你能够使用ServletRegistrationBean和FilterRegistrationBean类实现彻底的控制。若是你的bean实现了ServletContextInitializer接口,也能够直接注册它们。
Spring Boot底层使用了一个新的ApplicationContext类型,用于对内嵌servlet容器的支持。EmbeddedWebApplicationContext是一个特殊类型的WebApplicationContext,它经过搜索一个单一的EmbeddedServletContainerFactory bean来启动本身。一般,TomcatEmbeddedServletContainerFactory,JettyEmbeddedServletContainerFactory或UndertowEmbeddedServletContainerFactory将被自动配置。
注:你一般不须要知道这些实现类大多数应用将被自动配置,并根据你的行为建立合适的ApplicationContext中和EmbeddedServletContainerFactory。
常见的Servlet容器设置能够经过Spring Environment属性进行配置。一般,你会把这些属性定义到application.properties文件中。常见的服务器设置包括:
具体参考ServerProperties。
编程方式的自定义
若是须要以编程的方式配置内嵌的servlet容器,你能够注册一个实现EmbeddedServletContainerCustomizer接口的Spring bean.EmbeddedServletContainerCustomizer提供对ConfigurableEmbeddedServletContainer的访问,ConfigurableEmbeddedServletContainer包含不少自定义的setter方法。
import org.springframework.boot.context.embedded.*; import org.springframework.stereotype.Component; @Component public class CustomizationBean implements EmbeddedServletContainerCustomizer { @Override public void customize(ConfigurableEmbeddedServletContainer container) { container.setPort(9000); } }
直接自定义ConfigurableEmbeddedServletContainer
若是上面的自定义手法过于受限,你能够本身注册TomcatEmbeddedServletContainerFactory,JettyEmbeddedServletContainerFactory或UndertowEmbeddedServletContainerFactory。
@Bean public EmbeddedServletContainerFactory servletContainer() { TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory(); factory.setPort(9000); factory.setSessionTimeout(10, TimeUnit.MINUTES); factory.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/notfound.html"); return factory; }
不少可选的配置都提供了二传手方法,也提供了一些受保护的钩子方法以知足你的某些特殊需求。具体参考相关文档。
在内嵌的servlet容器中运行一个Spring Boot应用时(并打包成一个可执行的存档存档),容器对JSP的支持有一些限制。
这里有个JSP示例,你能够查看如何设置相关事项。
若是Spring Security在classpath下,那么web应用默认对全部的HTTP路径(也称为终点,端点,表示API的具体网址)使用'basic'认证。为了给web应用添加方法级别的保护,你能够添加@ EnableGlobalMethodSecurity并使用想要的设置。其余信息参考Spring Security Reference。
默认的的AuthenticationManager有一个单一的用户( '用户' 的用户名和随机密码会在应用启动时以INFO日志级别打印出来)以下:
Using default security password: 78fa095d-3f4c-48b1-ad50-e24c31d5cf35
注:若是你对日志配置进行微调,确保org.springframework.boot.autoconfigure.security类别能记录INFO信息,不然默认的密码不会被打印。
你能够经过提供security.user.password改变默认的密码。这些和其余有用的属性经过SecurityProperties(以安为为前缀的属性)被外部化了。
默认的安全配置(security configuration)是在SecurityAutoConfiguration和导入的类中实现的(SpringBootWebSecurityConfiguration用于web安全,AuthenticationManagerConfiguration用于与非web应用也相关的认证配置)。你能够添加一个@EnableWebSecurity bean来完全关掉Spring Boot的默认配置。为了对它进行自定义,你须要使用外部的属性配置和WebSecurityConfigurerAdapter类型的beans(好比,添加基于表单的登录)。在Spring Boot示例里有一些安全相关的应用能够带你体验常见的用例。
在一个web应用中你能获得的基本特性以下:
一个使用内存存储的AuthenticationManager bean和惟一的user(查看SecurityProperties.User获取user的属性)。
忽略(不保护)常见的静态资源路径(/css/, /js/, /images/**和 */favicon.ico)。
对其余的路径实施HTTP Basic安全保护。
安全相关的事件会发布到Spring的ApplicationEventPublisher(成功和失败的认证,拒绝访问)。
Spring Security提供的常见底层特性(HSTS, XSS, CSRF, 缓存)默认都被开启。
上述全部特性都能打开和关闭,或使用外部的配置进行修改(security.)。为了覆盖访问规则(access rules)而不改变其余自动配置的特性,你能够添加一个使用@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)注解的WebSecurityConfigurerAdapter类型的@Bean。
若是Actuator也在使用,你会发现:
即便应用路径不受保护,被管理的路径也会受到保护。
安全相关的事件被转换为AuditEvents时(审计事件),并发布给AuditService。
默认的用户有ADMIN和USER的角色。
使用外部属性可以修改致动器(执行器)的安全特性(management.security。*)。为了覆盖应用程序的访问规则,你能够添加一个WebSecurityConfigurerAdapter类型的@Bean。同时,若是不想覆盖执行器的访问规则,你能够使用@Order( SecurityProperties.ACCESS_OVERRIDE_ORDER)注解该豆,不然使用@Order(ManagementServerProperties.ACCESS_OVERRIDE_ORDER)注解该豆。
Spring框架为使用SQL数据库提供了普遍的支持。从使用JdbcTemplate直接访问JDBC到彻底的对象关系映射技术,好比Hibernate.Spring数据提供一个额外的功能,直接从接口建立Repository实现,并使用约定从你的方法名生成查询。
Java的的javax.sql.DataSource的接口提供了一个标准的使用数据库链接的方法。传统作法是,一个数据源使用一个URL连同相应的证书去初始化一个数据库链接。
开发应用时使用内存数据库是很实用的。显而易见地,内存数据库不须要提供持久化存储。你不须要在应用启动时填充数据库,也不须要在应用结束时丢弃数据。
Spring Boot能够自动配置的内嵌数据库包括H2,HSQL和Derby。你不须要提供任何链接URL,只须要简单的添加你想使用的内嵌数据库依赖。
示例:典型的POM依赖以下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.hsqldb</groupId> <artifactId>hsqldb</artifactId> <scope>runtime</scope> </dependency>
注:对于自动配置的内嵌数据库,你须要依赖弹簧JDBC在示例中,它经过弹簧引导起动数据JPA被传递地拉过来了。
在生产环境中,数据库链接能够使用数据源池进行自动配置下面是选取一个特定实现的算法:
若是你使用spring-boot-starter-jdbc或spring-boot-starter-data-jpa'starter POMs',你将会自动获取对tomcat-jdbc的依赖。
注:其余的链接池能够手动配置。若是你定义本身的DataSource bean,自动配置不会发生。
数据源配置经过外部配置文件的spring.datasource *属性控制示例中,你可能会在application.properties中声明下面的片断。:
spring.datasource.url=jdbc:mysql://localhost/test spring.datasource.username=dbuser spring.datasource.password=dbpass spring.datasource.driver-class-name=com.mysql.jdbc.Driver
其余可选的配置能够查看DataSourceProperties。同时注意你能够经过spring.datasource。*配置任何DataSource实现相关的特定属性:具体参考你使用的链接池实现的文档。
注:既然Spring Boot可以从大多数数据库的url上推断出driver-class-name,那么你就不须要再指定它了。对于一个将要建立的DataSource链接池,咱们须要可以验证Driver是否可用,因此咱们会在作任何事情以前检查它。好比,若是你设置spring.datasource.driverClassName=com.mysql.jdbc.Driver,而后这个类就会被加载。
若是正在将Spring Boot应用部署到一个应用服务器,你可能想要用应用服务器内建的特性来配置和管理你的DataSource,并使用JNDI访问它。
spring.datasource.jndi-name属性能够用来替代spring.datasource.url,spring.datasource.username和spring.datasource.password去从一个特定的JNDI路径访问DataSource。好比,下面application.properties中的片断展现了如何获取JBoss定义的DataSource:
spring.datasource.jndi-name=java:jboss/datasources/customers
Spring的JdbcTemplate和NamedParameterJdbcTemplate类是被自动配置的,你能够在本身的beans中经过@Autowire直接注入它们。
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; @Component public class MyBean { private final JdbcTemplate jdbcTemplate; @Autowired public MyBean(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } // ... }
Java持久化API是一个容许你将对象映射为关系数据库的标准技术。spring-boot-starter-data-jpa POM提供了一种快速上手的方式。它提供下列关键的依赖:
注:咱们不想在这涉及太多关于JPA或Spring Data的细节。你能够参考来自spring.io的指南使用JPA获取数据,并阅读Spring Data JPA和Hibernate的参考文档。
传统上,JPA实体类被定义到一个persistence.xml文件中。在Spring Boot中,这个文件不是必需的,并被'实体扫描'替代。默认状况下,在你主(main)配置类(被@EnableAutoConfiguration或@SpringBootApplication注解的类)下的全部包都将被查找。
任何被@Entity,@Embeddable或@MappedSuperclass注解的类都将被考虑。一个普通的实体类看起来像下面这样:
package com.example.myapp.domain; import java.io.Serializable; import javax.persistence.*; @Entity public class City implements Serializable { @Id @GeneratedValue private Long id; @Column(nullable = false) private String name; @Column(nullable = false) private String state; // ... additional members, often include @OneToMany mappings protected City() { // no-args constructor required by JPA spec // this one is protected since it shouldn't be used directly } public City(String name, String state) { this.name = name; this.country = country; } public String getName() { return this.name; } public String getState() { return this.state; } // ... etc }
注:你能够使用@EntityScan注解自定义实体扫描路径。具体参考Section 67.4, “Separate @Entity definitions from Spring configuration”。
Spring Data JPA仓库(repositories)是用来定义访问数据的接口。根据你的方法名,JPA查询会被自动建立。好比,一个CityRepository接口可能声明一个findAllByState(String state)方法,用来查找给定状态的全部城市。
对于比较复杂的查询,你能够使用Spring Data的Query来注解你的方法。
Spring Data仓库一般继承自Repository或CrudRepository接口。若是你使用自动配置,包括在你的主配置类(被@EnableAutoConfiguration或@SpringBootApplication注解的类)的包下的仓库将会被搜索。
下面是一个传统的Spring Data仓库:
package com.example.myapp.domain; import org.springframework.data.domain.*; import org.springframework.data.repository.*; public interface CityRepository extends Repository<City, Long> { Page<City> findAll(Pageable pageable); City findByNameAndCountryAllIgnoringCase(String name, String country); }
注:咱们仅仅触及了Spring Data JPA的表面。具体查看它的参考指南。
默认状况下,只有在你使用内嵌数据库(H2, HSQL或Derby)时,JPA数据库才会被自动建立。你能够使用spring.jpa.*属性显示的设置JPA。好比,为了建立和删除表你能够将下面的配置添加到application.properties中:
spring.jpa.hibernate.ddl-auto=create-drop
注:Hibernate本身内部对建立,删除表支持(若是你刚好记得这回事更好)的属性是hibernate.hbm2ddl.auto。使用spring.jpa.properties.*(前缀在被添加到实体管理器以前会被剥离掉),你能够设置Hibernate自己的属性,好比hibernate.hbm2ddl.auto。示例:spring.jpa.properties.hibernate.globally_quoted_identifiers=true
将传递hibernate.globally_quoted_identifiers到Hibernate实体管理器。
默认状况下,DDL执行(或验证)被延迟到ApplicationContext启动。这也有一个spring.jpa.generate-ddl标识,若是Hibernate自动配置被激活,那该标识就不会被使用,由于ddl-auto设置粒度更细。
Spring Data提供其余项目,用来帮你使用各类各样的NoSQL技术,包括MongoDB, Neo4J, Elasticsearch, Solr, Redis, Gemfire, Couchbase和Cassandra。Spring Boot为Redis, MongoDB, Elasticsearch, Solr和Gemfire提供自动配置。你能够充分利用其余项目,但你须要本身配置它们。具体查看projects.spring.io/spring-data中合适的参考文档。
Redis是一个缓存,消息中间件及具备丰富特性的键值存储系统。Spring Boot为Jedis客户端库和由Spring Data Redis提供的基于Jedis客户端的抽象提供自动配置。spring-boot-starter-redis'Starter POM'为收集依赖提供一种便利的方式。
你能够注入一个自动配置的RedisConnectionFactory,StringRedisTemplate或普通的跟其余Spring Bean相同的RedisTemplate实例。默认状况下,这个实例将尝试使用localhost:6379链接Redis服务器。
@Component
public class MyBean { private StringRedisTemplate template; @Autowired public MyBean(StringRedisTemplate template) { this.template = template; } // ... }
若是你添加一个你本身的任何自动配置类型的@Bean,它将替换默认的(除了RedisTemplate的状况,它是根据bean的名称'redisTemplate'而不是它的类型进行排除的)。若是在classpath路径下存在commons-pool2,默认你会得到一个链接池工厂。
MongoDB是一个开源的NoSQL文档数据库,它使用一个JSON格式的模式(schema)替换了传统的基于表的关系数据。Spring Boot为使用MongoDB提供了不少便利,包括spring-boot-starter-data-mongodb'Starter POM'。
你能够注入一个自动配置的org.springframework.data.mongodb.MongoDbFactory来访问Mongo数据库。默认状况下,该实例将尝试使用URL:mongodb:// localhost / test链接一个MongoDB服务器。
import org.springframework.data.mongodb.MongoDbFactory; import com.mongodb.DB; @Component public class MyBean { private final MongoDbFactory mongo; @Autowired public MyBean(MongoDbFactory mongo) { this.mongo = mongo; } // ... public void example() { DB db = mongo.getDb(); // ... } }
你能够经过设置spring.data.mongodb.uri来改变该URL,或指定一个主机/端口好比,你可能会在你的application.properties中设置以下的属性:
spring.data.mongodb.host=mongoserver spring.data.mongodb.port=27017
注:春天数据Mongo,你能够注入com.mongodb.Mongo豆而不是使用MongoDbFactory。
若是想全面控制的MongoDB链接的创建,你也能够声明本身的MongoDbFactory或蒙戈,@豆。
Spring Data Mongo提供了一个MongoTemplate类,它的设计和Spring的JdbcTemplate很类似。正如JdbcTemplate同样,Spring Boot会为你自动配置一个bean,你只需简单的注入它便可:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.stereotype.Component; @Component public class MyBean { private final MongoTemplate mongoTemplate; @Autowired public MyBean(MongoTemplate mongoTemplate) { this.mongoTemplate = mongoTemplate; } // ... }
具体参考MongoOperations Javadoc。
Spring Data的仓库包括对MongoDB的支持。正如上面讨论的JPA仓库,基本的原则是查询会自动基于你的方法名建立。
实际上,无论是Spring Data JPA仍是Spring Data MongoDB都共享相同的基础设施。因此你能够使用上面的JPA示例,并假设那个城市如今是一个Mongo数据类而不是JPA @Entity,它将以一样的方式工做。
package com.example.myapp.domain; import org.springframework.data.domain.*; import org.springframework.data.repository.*; public interface CityRepository extends Repository<City, Long> { Page<City> findAll(Pageable pageable); City findByNameAndCountryAllIgnoringCase(String name, String country); }
Spring Data Gemfire为使用Pivotal Gemfire数据管理平台提供了方便的,Spring友好的工具.Spring Boot提供了一个用于汇集依赖的spring-boot-starter-data-gemfire'Starter POM'。目前不支持Gemfire的自动配置,但你能够使用一个单一的注解使Spring Data仓库支持它。
Apache Solr是一个搜索引擎.Spring Boot为solr客户端库及Spring Data Solr提供的基于solr客户端库的抽象提供了基本的配置.Spring Boot提供了一个用于汇集依赖的spring-boot-starter-data -solr'Starter POM'。
你能够像其余Spring beans同样注入一个自动配置的SolrServer实例。默认状况下,该实例将尝试使用localhost:8983 / solr链接一个服务器。
@Component public class MyBean { private SolrServer solr; @Autowired public MyBean(SolrServer solr) { this.solr = solr; } // ... }
若是你添加一个本身的SolrServer类型的@Bean,它将会替换默认的。
Spring Data的仓库包括了对Apache Solr的支持。正如上面讨论的JPA仓库,基本的原则是查询会自动基于你的方法名建立。
实际上,无论是Spring Data JPA仍是Spring Data Solr都共享相同的基础设施。因此你能够使用上面的JPA示例,并假设那个City如今是一个@SolrDocument类而不是JPA @Entity,它将以一样的方式工做。
注:具体参考Spring Data Solr文档。
Elastic Search是一个开源的,分布式,实时搜索和分析引擎。Spring Boot为Elasticsearch及Spring Data Elasticsearch提供的基于它的抽象提供了基本的配置。Spring Boot提供了一个用于汇集依赖的spring-boot-starter-data-elasticsearch'Starter POM'。
你能够像其余Spring beans那样注入一个自动配置的ElasticsearchTemplate或Elasticsearch客户端实例。默认状况下,该实例将尝试链接到一个本地内存服务器(在Elasticsearch项目中的一个NodeClient),但你能够经过设置spring.data.elasticsearch.clusterNodes为一个以逗号分割的host:port列表来将其切换到一个远程服务器(好比,TransportClient)。
@Component
public class MyBean { private ElasticsearchTemplate template; @Autowired public MyBean(ElasticsearchTemplate template) { this.template = template; } // ... }
若是你添加一个你本身的ElasticsearchTemplate类型的@Bean,它将替换默认的。
Spring Data的仓库包括了对Elasticsearch的支持。正如上面讨论的JPA仓库,基本的原则是查询会自动基于你的方法名建立。
实际上,无论是Spring Data JPA仍是Spring Data Elasticsearch都共享相同的基础设施。因此你能够使用上面的JPA示例,并假设那个City如今是一个Elasticsearch @Document类而不是JPA @Entity,它将以一样的方式工做。
注:具体参考Spring Data Elasticsearch文档。
Spring Framework框架为集成消息系统提供了扩展(extensive)支持:从使用JmsTemplate简化JMS API,到实现一个完整异步消息接收的底层设施。
Spring AMQP提供一个类似的用于'高级消息队列协议'的特征集,而且Spring Boot也为RabbitTemplate和RabbitMQ提供了自动配置选项。
Spring Websocket提供原生的STOMP消息支持,而且Spring Boot经过starters和一些自动配置也提供了对它的支持。
javax.jms.ConnectionFactory接口提供了一个标准的用于建立一个javax.jms.Connection的方法,javax.jms.Connection用于和JMS代理(broker)交互。
尽管为了使用JMS,Spring须要一个ConnectionFactory,但一般你不须要直接使用它,而是依赖于上层消息抽象(具体参考Spring框架的相关章节)。Spring Boot也会自动配置发送和接收消息须要的设施(infrastructure)。
若是在classpath下发现HornetQ,Spring Boot会自动配置ConnectionFactory。若是须要代理,将会开启一个内嵌的,已经自动配置好的代理(除非显式设置mode属性)。支持的modes有:embedded(显式声明使用一个内嵌的代理,若是该代理在classpath下不可用将致使一个错误),native(使用netty传输协议链接代理)。当后者被配置,Spring Boot配置一个链接到一个代理的ConnectionFactory,该代理运行在使用默认配置的本地机器上。
注:若是使用弹簧引导起动HornetQ的,链接到一个已存在的HornetQ的实例所需的依赖都会被提供,同时还有用于集成JMS的春季基础设施将org.hornetq:将hornetq-JMS服务器添加到你的应用中,你就能够使用嵌入模式。
HornetQ的配置被spring.hornetq *中的外部配置属性所控制例如,你可能在application.properties声明如下片断。:
spring.hornetq.mode=native spring.hornetq.host=192.168.1.210 spring.hornetq.port=9876
当内嵌代理时,你能够选择是否启用持久化,而且列表中的目标都应该是可用的。这些能够经过一个以逗号分割的列表来指定一些默认的配置项,或定义org.hornetq.jms。 server.config.JMSQueueConfiguration或org.hornetq.jms.server.config.TopicConfiguration类型的bean(s)来配置更高级的队列和主题。具体参考HornetQProperties。
没有涉及JNDI查找,目标是经过名字解析的,名字便可以使用HornetQ的配置中的名称属性,也能够是配置中提供的名称。
若是发现ActiveMQ在classpath下可用,Spring Boot会配置一个ConnectionFactory。若是须要代理,将会开启一个内嵌的,已经自动配置好的代理(只要配置中没有指定代理URL)。
ActiveMQ的配置是经过spring.activemq *中的外部配置来控制的例如,你可能在application.properties中声明下面的片断。:
spring.activemq.broker-url=tcp://192.168.1.210:9876 spring.activemq.user=admin spring.activemq.password=secret
具体参考ActiveMQProperties。
默认状况下,若是目标还不存在,ActiveMQ的将建立一个,因此目标是经过它们提供的名称解析出来的。
若是你在一个应用服务器中运行你的应用,Spring Boot将尝试使用JNDI定位一个JMS ConnectionFactory。默认状况会检查java:/ JmsXA和java:/ XAConnectionFactory。若是须要的话,你能够使用spring.jms.jndi-命名属性来指定一个替代位置。
spring.jms.jndi-name=java:/MyConnectionFactory
春天的JmsTemplate的会被自动配置,你能够将它直接注入到你本身的豆中:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsTemplate; import org.springframework.stereotype.Component; @Component public class MyBean { private final JmsTemplate jmsTemplate; @Autowired public MyBean(JmsTemplate jmsTemplate) { this.jmsTemplate = jmsTemplate; } // ... }
注:JmsMessagingTemplate(Spring4.1新增的)也能够使用相同的方式注入
当JMS基础设施可以使用时,任何豆都可以被@JmsListener注解,以建立一个监听者端点。若是没有定义JmsListenerContainerFactory,一个默认的将会被自动配置。下面的组件在someQueue目标上建立一个监听者端点。
@Component public class MyBean { @JmsListener(destination = "someQueue") public void processMessage(String content) { // ... } }
具体查看@EnableJms javadoc。
Spring框架使用JavaMailSender接口为发送邮件提供了一个简单的抽象,而且Spring Boot也为它提供了自动配置和一个starter模块。具体查看JavaMailSender参考文档。
若是spring.mail.host和相关的库(经过弹簧引导起动邮件定义)都存在,一个默认的JavaMailSender将被建立。该发送方能够经过spring.mail命名空间下的配置项进一步自定义,具体参考MailProperties。
Spring Boot使用一个Atomkos或Bitronix的内嵌事务管理器来支持跨多个XA资源的分布式JTA事务。当部署到一个恰当的J2EE应用服务器时也会支持JTA事务。
当发现一个JTA环境时,Spring Boot将使用Spring的JtaTransactionManager来管理事务。自动配置的JMS,DataSource和JPA beans将被升级以支持XA事务。你能够使用标准的Spring idioms,好比@Transactional,来参与到一个分布式事务中。若是你处于JTA环境里,但仍旧想使用本地事务,你能够将spring.jta.enabled属性设置为false来禁用JTA自动配置功能。
Atomikos是一个很是流行的开源事务管理器,它能够嵌入到你的Spring Boot应用中。你能够使用spring-boot-starter-jta-atomikosStarter
POM去获取正确的Atomikos库。Spring Boot会自动配置Atomikos,并将合适的depends-on应用到你的Spring Beans上,确保它们以正确的顺序启动和关闭。
默认状况下,Atomikos事务日志将被记录在应用home目录(你的应用jar文件放置的目录)下的transaction-logs文件夹中。你能够在application.properties文件中经过设置spring.jta.log-dir属性来自定义该目录。以spring.jta.开头的属性能用来自定义Atomikos的UserTransactionServiceIml实现。具体参考AtomikosProperties javadoc。
注:为了确保多个事务管理器可以安全地和相应的资源管理器配合,每一个Atomikos实例必须设置一个惟一的ID。默认状况下,该ID是Atomikos实例运行的机器上的IP地址。为了确保生产环境中该ID的惟一性,你须要为应用的每一个实例设置不一样的spring.jta.transaction-manager-id属性值。
Bitronix是另外一个流行的开源JTA事务管理器实现。你能够使用spring-boot-starter-jta-bitronixstarter POM为项目添加合适的Birtronix依赖。和Atomikos相似,Spring Boot将自动配置Bitronix,并对beans进行后处理(post-process)以确保它们以正确的顺序启动和关闭。
默认状况下,Bitronix事务日志将被记录到应用home目录下的transaction-logs文件夹中。经过设置spring.jta.log-dir属性,你能够自定义该目录。以spring.jta.开头的属性将被绑定到bitronix.tm.Configuration bean,你能够经过这完成进一步的自定义。具体参考Bitronix文档。
注:为了确保多个事务管理器可以安全地和相应的资源管理器配合,每一个Bitronix实例必须设置一个惟一的ID。默认状况下,该ID是Bitronix实例运行的机器上的IP地址。为了确保生产环境中该ID的惟一性,你须要为应用的每一个实例设置不一样的spring.jta.transaction-manager-id属性值。
若是你将Spring Boot应用打包为一个war或ear文件,并将它部署到一个J2EE的应用服务器中,那你就能使用应用服务器内建的事务管理器。Spring Boot将尝试经过查找常见的JNDI路径(java:comp/UserTransaction, java:comp/TransactionManager等)来自动配置一个事务管理器。若是使用应用服务器提供的事务服务,你一般须要确保全部的资源都被应用服务器管理,并经过JNDI暴露出去。Spring Boot经过查找JNDI路径java:/JmsXA或java:/XAConnectionFactory获取一个ConnectionFactory来自动配置JMS,而且你能够使用spring.datasource.jndi-name属性配置你的DataSource。
Spring集成提供基于消息和其余协议的,好比HTTP,TCP等的抽象。若是Spring集成在classpath下可用,它将会经过@EnableIntegration注解被初始化。若是classpath下'spring-integration-jmx'可用,则消息处理统计分析将被经过JMX发布出去。具体参考IntegrationAutoConfiguration类。
Java管理扩展(JMX)提供了一个标准的用于监控和管理应用的机制。默认状况下,Spring Boot将建立一个id为‘mbeanServer’的MBeanServer,并导出任何被Spring JMX注解(@ManagedResource,@ManagedAttribute,@ManagedOperation)的beans。具体参考JmxAutoConfiguration类。
Spring Boot提供不少有用的测试应用的工具。spring-boot-starter-test POM提供Spring Test,JUnit,Hamcrest和Mockito的依赖。在spring-boot核心模块org.springframework.boot.test包下也有不少有用的测试工具。
若是使用spring-boot-starter-test ‘Starter POM’(在test做用域内),你将发现下列被提供的库:
这也有一些咱们写测试用例时常常用到的库。若是它们不能知足你的要求,你能够随意添加其余的测试用的依赖库。
依赖注入最大的优势就是它可以让你的代码更容易进行单元测试。你只需简单的经过new操做符实例化对象,而不须要涉及Spring。你也能够使用模拟对象替换真正的依赖。
你经常须要在进行单元测试后,开始集成测试(在这个过程当中只须要涉及到Spring的ApplicationContext)。在执行集成测试时,不须要部署应用或链接到其余基础设施是很是有用的。
Spring框架包含一个dedicated测试模块,用于这样的集成测试。你能够直接声明对org.springframework:spring-test的依赖,或使用spring-boot-starter-test ‘Starter POM’以透明的方式拉取它。
若是你之前没有使用过spring-test模块,能够查看Spring框架参考文档中的相关章节。
一个Spring Boot应用只是一个Spring ApplicationContext,因此在测试它时除了正常状况下处理一个vanilla Spring context外部不须要注意的是,若是你使用SpringApplication建立上下文,外部配置,日志和Spring启动的其余特性只会在默认的上下文中起做用。
Spring Boot提供一个@SpringApplicationConfiguration注解用来替换标准的spring-test @ContextConfiguration注解。若是使用@SpringApplicationConfiguration来设置你的测试中使用的ApplicationContext,它最终将经过SpringApplication建立,而且你将获取到Spring Boot的其余特性。
示例以下:
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = SampleDataJpaApplication.class) public class CityRepositoryIntegrationTests { @Autowired CityRepository repository; // ... }
提示:上下文加载器会经过查找@WebIntegrationTest或@WebAppConfiguration注解来猜想你想测试的是不是网络应用(例如,是否使用MockMVC,MockMVC和@WebAppConfiguration是弹簧试验的一部分)。
若是想让一个网络应用启动,并监听它的正常的端口,你能够使用HTTP来测试它(好比,使用RestTemplate),并使用@WebIntegrationTest注解你的测试类(或它的一个父类)。这颇有用,由于它意味着你能够对你的应用进行全栈测试,但在一次HTTP交互后,你须要在你的测试类中注入相应的组件并使用它们断言应用的内部状态。
示例:
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = SampleDataJpaApplication.class) @WebIntegrationTest public class CityRepositoryIntegrationTests { @Autowired CityRepository repository; RestTemplate restTemplate = new TestRestTemplate(); // ... interact with the running server }
注:弹簧测试框架在每次测试时会缓存应用上下文所以,只要你的测试共享相同的配置,无论你实际运行多少测试,开启和中止服务器只会发生一次。
你能够为@WebIntegrationTest添加环境变量属性来改变应用服务器端口号,好比@WebIntegrationTest( “server.port:9000”)。此外,你能够将server.port和management.port属性设置为0来让你的集成测试使用随机的端口号,例如:
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = MyApplication.class) @WebIntegrationTest({"server.port=0", "management.port=0"}) public class SomeIntegrationTests { // ... }
能够查看第64.4节“在运行时发现HTTP端口”,它描述了如何在测试期间发现分配的实际端口。
若是指望使用Spock测试一个Spring Boot应用,你应该将Spock的spock-spring模块依赖添加到应用的构建中.spock-spring将Spring的测试框架集成到了Spock里。
注意你不能使用上述提到的@SpringApplicationConfiguration注解,由于Spock找不到@ContextConfiguration元注解。为了绕过该限制,你应该直接使用@ContextConfiguration注解,并使用Spring Boot特定的上下文加载器来配置它。
@ContextConfiguration(loader = SpringApplicationContextLoader.class) class ExampleSpec extends Specification { // ... }
注:上面描述的注解在斯波克中能够使用,好比,你能够使用@WebIntegrationTest注解你的规格以知足测试须要。
打包进春天启动的一些有用的测试工具类。
ConfigFileApplicationContextInitializer是一个ApplicationContextInitializer,能够用来测试加载Spring Boot的application.properties文件。当不须要使用@SpringApplicationConfiguration提供的所有特性时,你能够使用它。
@ContextConfiguration(classes = Config.class,initializers = ConfigFileApplicationContextInitializer.class)
EnvironmentTestUtils容许你快速添加属性到一个ConfigurableEnvironment或ConfigurableApplicationContext。只需简单的使用key = value字符串调用它:```java EnvironmentTestUtils.addEnvironment(env,“org = Spring”,“name = Boot”);
OutputCapture是一个JUnit规则,用于捕获System.out和System.err输出。只需简单的将捕获声明为一个@Rule,并使用toString()断言:
import org.junit.Rule; import org.junit.Test; import org.springframework.boot.test.OutputCapture; import static org.hamcrest.Matchers.*; import static org.junit.Assert.*; public class MyTest { @Rule public OutputCapture capture = new OutputCapture(); @Test public void testName() throws Exception { System.out.println("Hello World!"); assertThat(capture.toString(), containsString("World")); } }
TestRestTemplate是一个方便进行集成测试的Spring RestTemplate子类。你会获取到一个普通的模板或一个发送基本HTTP认证(使用用户名和密码)的模板。在任何状况下,这些模板都表现出对测试友好:不容许重定向(这样你能够对响应地址进行断言),忽略cookies(这样模板就是无状态的),对于服务端错误不会抛出异常。推荐使用Apache HTTP Client(4.3.2或更好的版本),但不强制这样作。若是在类路径下存在Apache HTTP Client,TestRestTemplate将以正确配置的客户端进行响应。
public class MyTest { RestTemplate template = new TestRestTemplate(); @Test public void testRequest() throws Exception { HttpHeaders headers = template.getForEntity("http://myhost.com", String.class).getHeaders(); assertThat(headers.getLocation().toString(), containsString("myotherhost")); } }
若是你在一个开发者共享库的公司工做,或你在从事一个开源或商业型的库,你可能想要开发本身的auto-configuration。Auto-configuration类可以在外部的jars中绑定,并仍能被Spring Boot发现。
从底层来说,auto-configured是使用标准的@Configuration实现的类,另外的@Conditional注解用来约束在什么状况下使用auto-configuration。一般auto-configuration类使用@ConditionalOnClass和@ConditionalOnMissingBean注解。这是为了确保只有在相关的类被发现,和你没有声明本身的@Configuration时才应用auto-configuration。
你能够浏览spring-boot-autoconfigure的源码,查看咱们提供的@Configuration类(查看META-INF/spring.factories文件)。
Spring Boot会检查你发布的jar中是否存在META-INF/spring.factories文件。该文件应该列出以EnableAutoConfiguration为key的配置类:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.mycorp.libx.autoconfigure.LibXAutoConfiguration,\ com.mycorp.libx.autoconfigure.LibXWebAutoConfiguration
若是配置须要应用特定的顺序,你能够使用@AutoConfigureAfter或@AutoConfigureBefore注解。例如,你想提供web-specific配置,你的类就须要应用在WebMvcAutoConfiguration后面。
你几乎老是须要在你的auto-configuration类里添加一个或更多的@Condition注解。@ConditionalOnMissingBean注解是一个常见的示例,它常常用于容许开发者覆盖auto-configuration,若是他们不喜欢你提供的默认行为。
Spring Boot包含不少@Conditional注解,你能够在本身的代码中经过注解@Configuration类或单独的@Bean方法来重用它们。
@ConditionalOnClass和@ConditionalOnMissingClass注解容许根据特定类是否出现来跳过配置。因为注解元数据是使用ASM来解析的,你实际上能够使用value属性来引用真正的类,即便该类可能实际上并无出如今运行应用的classpath下。若是你倾向于使用一个String值来指定类名,你也能够使用name属性。
@ConditionalOnBean和@ConditionalOnMissingBean注解容许根据特定beans是否出现来跳过配置。你能够使用value属性来指定beans(by type),也能够使用name来指定beans(by name)。search属性容许你限制搜索beans时须要考虑的ApplicationContext的层次。
注:当@Configuration类被解析时@Conditional注解会被处理。Auto-configure @Configuration老是最后被解析(在全部用户定义beans后面),然而,若是你将那些注解用到常规的@Configuration类,须要注意不能引用那些尚未建立好的bean定义。
@ConditionalOnProperty注解容许根据一个Spring Environment属性来决定是否包含配置。能够使用prefix和name属性指定要检查的配置属性。默认状况下,任何存在的只要不是false的属性都会匹配。你也能够使用havingValue和matchIfMissing属性建立更高级的检测。
@ConditionalOnResource注解容许只有在特定资源出现时配置才会被包含。资源能够使用常见的Spring约定命名,例如file:/home/user/test.dat。
@ConditionalOnWebApplication和@ConditionalOnNotWebApplication注解容许根据应用是否为一个'web应用'来决定是否包含配置。一个web应用是任何使用Spring WebApplicationContext,定义一个session做用域或有一个StandardServletEnvironment的应用。
@ConditionalOnExpression注解容许根据SpEL表达式结果来跳过配置。
Spring Boot为内嵌的Tomcat(8和7),Jetty 9和Undertow提供WebSockets自动配置。若是你正在将一个war包部署到一个单独的容器,Spring Boot会假设该容器会对它的WebSocket支持相关的配置负责。
Spring框架提供丰富的WebSocket支持,通过spring-boot-starter-websocket模块能够轻易获取到。
Spring Boot包含不少其余的特性,它们能够帮你监控和管理发布到生产环境的应用。你能够选择使用HTTP端点,JMX或远程shell(SSH或Telnet)来管理和监控应用。审计(Auditing),健康(health)和数据采集(metrics gathering)会自动应用到你的应用。
spring-boot-actuator模块提供了Spring Boot全部的production-ready特性。启用该特性的最简单方式就是添加对spring-boot-starter-actuator ‘Starter POM’的依赖。
执行器(Actuator)的定义:执行器是一个制造业术语,指的是用于移动或控制东西的一个机械装置。一个很小的改变就能让执行器产生大量的运动。
基于Maven的项目想要添加执行器只需添加下面的'starter'依赖:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> </dependencies>
对于Gradle,使用下面的声明:
dependencies {
compile("org.springframework.boot:spring-boot-starter-actuator") }
执行器端点容许你监控应用及与应用进行交互。Spring Boot包含不少内置的端点,你也能够添加本身的。例如,health端点提供了应用的基本健康信息。
端点暴露的方式取决于你采用的技术类型。大部分应用选择HTTP监控,端点的ID映射到一个URL。例如,默认状况下,health端点将被映射到/health。
下面的端点都是可用的:
ID | 描述 | 敏感(Sensitive) |
---|---|---|
autoconfig | 显示一个auto-configuration的报告,该报告展现全部auto-configuration候选者及它们被应用或未被应用的缘由 | true |
beans | 显示一个应用中全部Spring Beans的完整列表 | true |
configprops | 显示一个全部@ConfigurationProperties的整理列表 | true |
dump | 执行一个线程转储 | true |
env | 暴露来自Spring ConfigurableEnvironment的属性 | true |
health | 展现应用的健康信息(当使用一个未认证链接访问时显示一个简单的'status',使用认证链接访问则显示所有信息详情) | false |
info | 显示任意的应用信息 | false |
metrics | 展现当前应用的'指标'信息 | true |
mappings | 显示一个全部@RequestMapping路径的整理列表 | true |
shutdown | 容许应用以优雅的方式关闭(默认状况下不启用) | true |
trace | 显示trace信息(默认为最新的一些HTTP请求) | true |
注:根据一个端点暴露的方式,sensitive参数可能会被用作一个安全提示。例如,在使用HTTP访问sensitive端点时须要提供用户名/密码(若是没有启用web安全,可能会简化为禁止访问该端点)。
使用Spring属性能够自定义端点。你能够设置端点是否开启(enabled),是否敏感(sensitive),甚至它的id。例如,下面的application.properties改变了敏感性和beans端点的id,也启用了shutdown。
endpoints.beans.id=springbeans
endpoints.beans.sensitive=false endpoints.shutdown.enabled=true
注:前缀endpoints + . + name被用来惟一的标识被配置的端点。
默认状况下,除了shutdown外的全部端点都是启用的。若是但愿指定选择端点的启用,你能够使用endpoints.enabled属性。例如,下面的配置禁用了除info外的全部端点:
endpoints.enabled=false endpoints.info.enabled=true
健康信息能够用来检查应用的运行状态。它常常被监控软件用来提醒人们生产系统是否中止。health端点暴露的默认信息取决于端点是如何被访问的。对于一个非安全,未认证的链接只返回一个简单的'status'信息。对于一个安全或认证过的链接其余详细信息也会展现(具体参考Section 41.6, “HTTP Health endpoint access restrictions” )。
健康信息是从你的ApplicationContext中定义的全部HealthIndicator beans收集过来的。Spring Boot包含不少auto-configured的HealthIndicators,你也能够写本身的。
HealthIndicators返回的信息经常性质上有点敏感。例如,你可能不想将数据库服务器的详情发布到外面。所以,在使用一个未认证的HTTP链接时,默认只会暴露健康状态(health status)。若是想将全部的健康信息暴露出去,你能够把endpoints.health.sensitive设置为false。
为防止'拒绝服务'攻击,Health响应会被缓存。你能够使用endpoints.health.time-to-live属性改变默认的缓存时间(1000毫秒)。
下面的HealthIndicators会被Spring Boot自动配置(在合适的时候):
名称 | 描述 |
---|---|
DiskSpaceHealthIndicator | 低磁盘空间检测 |
DataSourceHealthIndicator | 检查是否能从DataSource获取链接 |
MongoHealthIndicator | 检查一个Mongo数据库是否可用(up) |
RabbitHealthIndicator | 检查一个Rabbit服务器是否可用(up) |
RedisHealthIndicator | 检查一个Redis服务器是否可用(up) |
SolrHealthIndicator | 检查一个Solr服务器是否可用(up) |
想提供自定义健康信息,你能够注册实现了HealthIndicator接口的Spring beans。你须要提供一个health()方法的实现,并返回一个Health响应.Health响应须要包含一个状态和可选的用于展现的详情。
import org.springframework.boot.actuate.health.HealthIndicator; import org.springframework.stereotype.Component; @Component public class MyHealth implements HealthIndicator { @Override public Health health() { int errorCode = check(); // perform some specific health check if (errorCode != 0) { return Health.down().withDetail("Error Code", errorCode).build(); } return Health.up().build(); } }
除了Spring Boot预约义的Status类型,Health也能够返回一个表明新的系统状态的自定义状态。在这种状况下,须要提供一个HealthAggregator接口的自定义实现,或使用management.health.status.order属性配置默认的实现。
例如,假设一个新的,代码为FATAL的状态被用于你的一个HealthIndicator实现中为了配置严重程度,你须要将下面的配置添加到应用程序属性文件中:
management.health.status.order: DOWN, OUT_OF_SERVICE, UNKNOWN, UP
若是使用HTTP访问健康端点,你可能想要注册自定义的状态,并使用HealthMvcEndpoint进行映射。例如,你能够将FATAL映射为HttpStatus.SERVICE_UNAVAILABLE。
。经过设置弹簧属性信息*,你能够定义信息端点暴露的数据全部在信息关键字下的环境属性都将被自动暴露例如,你能够将下面的配置添加到application.properties。:
info.app.name=MyService info.app.description=My awesome service info.app.version=1.0.0
你能够使用已经存在的构建配置自动扩展信息属性,而不是对在项目构建配置中存在的属性进行硬编码。这在Maven的和摇篮都是可能的。
使用Maven的自动扩展属性
对于Maven项目,你能够使用资源过滤来自动扩展信息属性。若是使用spring-boot-starter-parent,你能够经过@ .. @占位符引用Maven的'项目属性'。
project.artifactId=myproject
project.name=Demo
project.version=X.X.X.X
project.description=Demo project for info endpoint info.build.artifact=@project.artifactId@ info.build.name=@project.name@ info.build.description=@project.description@ info.build.version=@project.version@
注:在上面的示例中,咱们使用项目*来设置一些值以防止因为某些缘由的Maven的资源过滤没有开启.Maven目标春季启动:运行直接将的src / main /资源添加到类路径下(出于热加载的目的)。这就过了资源过滤和自动扩展属性的特性。你能够使用exec:java替换该目标或自定义插件的配置,具体参考插件使用页面。
若是你不使用starter parent,在你的pom.xml你须要添加(处于元素内):
<resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources>
和(处于内):
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.6</version> <configuration> <delimiters> <delimiter>@</delimiter> </delimiters> </configuration> </plugin>
使用摇篮自动扩展属性
经过配置的Java插件的processResources任务,你也能够自动使用来自摇篮项目的属性扩展信息属性。
processResources { expand(project.properties) }
而后你能够经过占位符引用摇篮项目的属性:
info.build.name=${name} info.build.description=${description} info.build.version=${version}
信息端点的另外一个有用特性是,当项目构建完成后,它能够发布关于你的git的源码仓库状态的信息。若是在你的罐子中包含一个git.properties文件,git.branch和git.commit属性将被加载。
对于Maven用户,spring-boot-starter-parent POM包含一个可以产生git.properties文件的预配置插件。只须要简单的将下面的声明添加到你的POM中:
<build> <plugins> <plugin> <groupId>pl.project13.maven</groupId> <artifactId>git-commit-id-plugin</artifactId> </plugin> </plugins> </build>
对于摇篮用户能够使用一个类似的插件的gradle-git的,尽管为了产生属性文件可能须要稍微多点工做。
若是你正在开发一个Spring MVC应用,Spring Boot执行器自动将全部启用的端点经过HTTP暴露出去。默认约定使用端点的id做为URL路径,例如,health暴露为/ health。
若是你的项目中添加的有Spring Security,全部经过HTTP暴露的敏感端点都会受到保护。默认状况下会使用基本认证(basic authentication,用户名为user,密码为应用启动时在控制台打印的密码)。
你能够使用Spring属性改变用户名,密码和访问端点须要的安全角色。例如,你可能会在application.properties中添加下列配置:
security.user.name=admin security.user.password=secret management.security.role=SUPERUSER
注:若是你不使用Spring Security,那你的HTTP端点就被公开暴露,你应该慎重考虑启用哪些端点。具体参考Section 40.1, “Customizing endpoints”。
有时候将全部的管理端口划分到一个路径下是有用的。例如,你的应用可能已经将/info做为他用。你能够用management.contextPath属性为管理端口设置一个前缀:
management.context-path=/manage
上面的application.properties示例将把端口从/{id}改成/manage/{id}(好比,/manage/info)。
对于基于云的部署,使用默认的HTTP端口暴露管理端点(endpoints)是明智的选择。然而,若是你的应用是在本身的数据中心运行,那你可能倾向于使用一个不一样的HTTP端口来暴露端点。
management.port属性能够用来改变HTTP端口:
management.port=8081
因为你的管理端口常常被防火墙保护,不对外暴露也就不须要保护管理端点,即便你的主要应用是安全的。在这种状况下,classpath下会存在Spring Security库,你能够设置下面的属性来禁用安全管理策略(management security):
management.security.enabled=false
(若是classpath下不存在Spring Security,那也就不须要显示的以这种方式来禁用安全管理策略,它甚至可能会破坏应用程序。)
能够你经过设置management.address
属性来定义管理端点能够使用的地址。这在你只想监听内部或面向生产环境的网络,或只监听来自本地主机的链接时很是有用。
下面的application.properties示例不容许远程管理链接:
management.port=8081 management.address=127.0.0.1
若是不想经过HTTP暴露端点,你能够将管理端口设置为-1: management.port=-1
经过健康端点暴露的信息根据是否为匿名访问而不一样。默认状况下,当匿名访问时,任何有关服务器的健康详情都被隐藏了,该端点只简单的指示服务器是运行(上)仍是中止(下)。此外,当匿名访问时,响应会被缓存一个可配置的时间段以防止端点被用于'拒绝服务'攻击。endpoints.health.time-to-live
属性被用来配置缓存时间(单位为毫秒),默认为1000毫秒,也就是1秒。
上述的限制能够被禁止,从而容许匿名用户彻底访问健康端点。想达到这个效果,将能够endpoints.health.sensitive
设为false
。
Java管理扩展(JMX)提供了一种标准的监控和管理应用的机制。默认状况下,Spring Boot在org.springframework.boot
域下将管理端点暴露为JMX MBeans。
的MBean的名称一般产生于端点的ID。例如,健康端点被暴露为org.springframework.boot/Endpoint/HealthEndpoint
。
若是你的应用包含多个Spring ApplicationContext,你会发现存在名称冲突。为了解决这个问题,你能够将endpoints.jmx.uniqueNames
设置为真,这样MBean的名称老是惟一的。
你也能够自定义JMX域,全部的端点都在该域下暴露。这里有个app.properties示例:···java endpoints.jmx.domain = myapp endpoints.jmx.uniqueNames = true
若是不想经过JMX暴露端点,你能够将spring.jmx.enabled属性设置为假:
spring.jmx.enabled=false
Jolokia是一个JMX-HTTP桥,它提供了一种访问JMX beans的替代方法。想要使用Jolokia,只需添加org.jolokia:jolokia-core
的依赖。例如,使用Maven须要添加下面的配置:
<dependency> <groupId>org.jolokia</groupId> <artifactId>jolokia-core</artifactId> </dependency>
在你的管理HTTP上服务器能够经过/jolokia
访问椒。
Jolokia有不少配置,传统上通常使用servlet参数进行设置。使用Spring Boot,你能够在application.properties中经过把参数加上jolokia.config。前缀来设置:
jolokia.config.debug=true
若是你正在使用Jolokia,但不想让Spring Boot配置它,只须要简单的将endpoints.jolokia.enabled属性设置为false:
endpoints.jolokia.enabled=false
Spring Boot支持集成一个称为'CRaSH'的Java shell。你能够在CRaSH中使用ssh或telnet命令链接到运行的应用。为了启用远程shell支持,你只需添加spring-boot-starter-remote-shell
的依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-remote-shell</artifactId> </dependency>
注:若是想使用远程登陆访问,还需你对添加org.crsh:crsh.shell.telnet
的依赖。
默认状况下,远程shell监听端口2000以等待链接。默认用户名为user,密码为随机生成的,而且在输出日志中会显示。若是应用使用Spring Security,该shell默认使用相同的配置。若是不是,将使用一个简单的认证策略,你可能会看到相似这样的信息:
Using default password for shell access: ec03e16c-4cf4-49ee-b745-7c8255c1dd7e
Linux和OSX用户能够使用ssh链接远程shell,Windows用户能够下载并安装PuTTY。
$ ssh -p 2000 user@localhost user@localhost's password: . ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v1.3.0.BUILD-SNAPSHOT) on myhost
输入help能够获取一系列命令的帮助。Spring boot提供metrics
,beans
,autoconfig
和endpoint
命令。
5.4.4.1.1 远程shell证书
你能够使用shell.auth.simple.user.name和shell.auth.simple.user.password属性配置自定义的链接证书。也能够使用Spring Security的AuthenticationManager处理登陆职责。具体参考JavadocCrshAutoConfiguration和ShellProperties。
有不少有趣的方式能够用来扩展远程shell。
5.4.4.2.1 远程shell命令
你能够使用Groovy或Java编写其余的shell命令(具体参考CRaSH文档)。默认状况下,Spring Boot会搜索如下路径的命令:
注:能够经过shell.commandPathPatterns属性改变搜索路径。
下面是一个从src/main/resources/commands/hello.groovy加载的'hello world'命令:
package commands import org.crsh.cli.Usage import org.crsh.cli.Command class hello { @Usage("Say Hello") @Command def main(InvocationContext context) { return "Hello" } }
Spring Boot将一些额外属性添加到了InvocationContext,你能够在命令中访问它们:
属性名称 | 描述 |
---|---|
spring.boot.version | Spring Boot的版本 |
spring.version | Spring框架的核心版本 |
spring.beanfactory | 获取Spring的BeanFactory |
spring.environment | 获取Spring的Environment |
5.4.4.2.2 远程shell插件
除了建立新命令,也能够扩展CRaSH shell的其余特性。全部继承org.crsh.plugin.CRaSHPlugin的Spring Beans将自动注册到shell。
具体查看CRaSH参考文档。
Spring Boot执行器包括一个支持'gauge'和'counter'级别的度量指标服务。'gauge'记录一个单一值;'counter'记录一个增量(增长或减小)。同时,Spring Boot提供一个PublicMetrics接口,你能够实现它,从而暴露以上两种机制不能记录的指标。具体参考SystemPublicMetrics。
全部HTTP请求的指标都被自动记录,因此若是点击metrics端点,你可能会看到相似如下的响应:
{
"counter.status.200.root": 20, "counter.status.200.metrics": 3, "counter.status.200.star-star": 5, "counter.status.401.root": 4, "gauge.response.star-star": 6, "gauge.response.root": 2, "gauge.response.metrics": 3, "classes": 5808, "classes.loaded": 5808, "classes.unloaded": 0, "heap": 3728384, "heap.committed": 986624, "heap.init": 262144, "heap.used": 52765, "mem": 986624, "mem.free": 933858, "processors": 8, "threads": 15, "threads.daemon": 11, "threads.peak": 15, "uptime": 494836, "instance.uptime": 489782, "datasource.primary.active": 5, "datasource.primary.usage": 0.25 }
此处咱们能够看到基本的memory,heap,class loading,processor和thread pool信息,连同一些HTTP指标。在该实例中,root('/'),/metrics URLs分别返回20次,3次HTTP 200响应。同时能够看到root URL返回了4次HTTP 401(unauthorized)响应。双asterix(star-star)来自于被Spring MVC /**匹配到的一个请求(一般为一个静态资源)。
gauge级别展现了一个请求的最后响应时间。因此,root的最后请求被响应耗时2毫秒,/metrics耗时3毫秒。
Spring Boot暴露如下系统指标:
Spring Boot会为你应用中定义的支持的DataSource暴露如下指标:
全部的数据源指标共用datasoure.前缀。该前缀对每一个数据源都很是合适:
经过注册一个自定义版本的DataSourcePublicMetrics bean,你能够覆盖部分或所有的默认行为。默认状况下,Spring Boot提供支持全部数据源的元数据;若是你喜欢的数据源刚好不被支持,你能够添加另外的DataSourcePoolMetadataProvider beans。具体参考DataSourcePoolMetadataProvidersConfiguration。
若是你使用Tomcat做为内嵌的servlet容器,session指标将被自动暴露出去。 httpsessions.active
和httpsessions.max
提供了活动的和最大的session数量。
想要记录你本身的指标,只需将CounterService或GaugeService注入到你的bean中。CounterService暴露increment,decrement和reset方法;GaugeService提供一个submit方法。
下面是一个简单的示例,它记录了方法调用的次数:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.metrics.CounterService; import org.springframework.stereotype.Service; @Service public class MyService { private final CounterService counterService; @Autowired public MyService(CounterService counterService) { this.counterService = counterService; } public void exampleMethod() { this.counterService.increment("services.system.myservice.invoked"); } }
注:你能够将任何的字符串用做指标的名称,但最好遵循所选存储或图技术的指南。Matt Aimonetti’s Blog中有一些好的关于图(Graphite)的指南。
想要添加额外的,每次指标端点被调用时都会从新计算的度量指标,只需简单的注册其余的PublicMetrics实现bean(s)。默认状况下,端点会聚合全部这样的beans,经过定义本身的MetricsEndpoint能够轻易改变这种状况。
经过绑定一个MetricRepository来实现指标服务。MetricRepository
负责存储和追溯指标信息。Spring Boot提供一个InMemoryMetricRepository
和一个RedisMetricRepository
(默认使用in-memory仓库),不过你能够编写本身的MetricRepository
。MetricRepository
接口实际是MetricReader
接口和MetricWriter接口的上层组合。具体参考Javadoc
没有什么能阻止你直接将MetricRepository
的数据导入应用中的后端存储,但咱们建议你使用默认的InMemoryMetricRepository
(若是担忧堆使用状况,你能够使用自定义的Map实例),而后经过一个scheduled export job填充后端仓库(意思是先将数据保存到内存中,而后经过异步job将数据持久化到数据库,能够提升系统性能)。经过这种方式,你能够将指标数据缓存到内存中,而后经过低频率或批量导出来减小网络拥堵。Spring Boot提供一个Exporter接口及一些帮你开始的基本实现。
Dropwizard ‘Metrics’库的用户会发现Spring Boot指标被发布到了com.codahale.metrics.MetricRegistry。当你声明对io.dropwizard.metrics:metrics-core库的依赖时会建立一个默认的com.codahale.metrics.MetricRegistry Spring bean;若是须要自定义,你能够注册本身的@Bean实例。来自于MetricRegistry的指标也是自动经过/metrics端点暴露的。
用户能够经过使用合适类型的指标名称做为前缀来建立Dropwizard指标(好比,histogram.* , meter.*)。
若是你的classpath下存在'Spring Messaging' jar,一个名为metricsChannel的MessageChannel将被自动建立(除非已经存在一个)。此外,全部的指标更新事件做为'messages'发布到该渠道上。订阅该渠道的客户端能够进行额外的分析或行动。
Spring Boot执行器具备一个灵活的审计框架,一旦Spring Security处于活动状态(默认抛出'authentication success','failure'和'access denied'异常),它就会发布事件。这对于报告很是有用,同时能够基于认证失败实现一个锁定策略。
你也能够使用审计服务处理本身的业务事件。为此,你能够将存在的AuditEventRepository注入到本身的组件,并直接使用它,或者只是简单地经过Spring ApplicationEventPublisher发布AuditApplicationEvent(使用ApplicationEventPublisherAware)。
对于全部的HTTP请求Spring Boot自动启用追踪。你能够查看trace端点,并获取最近一些请求的基本信息:
[{
"timestamp": 1394343677415, "info": { "method": "GET", "path": "/trace", "headers": { "request": { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Connection": "keep-alive", "Accept-Encoding": "gzip, deflate", "User-Agent": "Mozilla/5.0 Gecko/Firefox", "Accept-Language": "en-US,en;q=0.5", "Cookie": "_ga=GA1.1.827067509.1390890128; ..." "Authorization": "Basic ...", "Host": "localhost:8080" }, "response": { "Strict-Transport-Security": "max-age=31536000 ; includeSubDomains", "X-Application-Context": "application:8080", "Content-Type": "application/json;charset=UTF-8", "status": "200" } } } },{ "timestamp": 1394343684465, ... }]
若是须要追踪其余的事件,你能够将一个TraceRepository注入到你的Spring Beans中。add方法接收一个将被转化为JSON的Map结构,该数据将被记录下来。
默认状况下,使用的InMemoryTraceRepository将存储最新的100个事件。若是须要扩展该容量,你能够定义本身的InMemoryTraceRepository实例。若是须要,你能够建立本身的替代TraceRepository实现。
在Spring Boot执行器中,你能够找到几个建立有利于进程监控的文件的类:
默认状况下,这些writers没有被激活,但你能够使用下面描述的任何方式来启用它们。
你须要激活META-INF/spring.factories文件里的listener(s):
org.springframework.context.ApplicationListener=\ org.springframework.boot.actuate.system.ApplicationPidFileWriter, org.springframework.boot.actuate.system.EmbeddedServerPortFileWriter
你也能够经过调用SpringApplication.addListeners(…)方法来激活一个监听器,并传递相应的Writer对象。该方法容许你经过Writer构造器自定义文件名和路径。
对于大多数流行云PaaS(平台即服务)提供商,Spring Boot的可执行jars就是为它们准备的。这些提供商每每要求你带上本身的容器;它们管理应用的进程(不特别针对Java应用程序),因此它们须要一些中间层来将你的应用适配到云概念中的一个运行进程。
两个流行的云提供商,Heroku和Cloud Foundry,采起一个打包('buildpack')方法。为了启动你的应用程序,无论须要什么,buildpack都会将它们打包到你的部署代码:它多是一个JDK和一个Java的调用,也多是一个内嵌的Web服务器,或者是一个成熟的应用服务器.buildpack是可插拔的,但你最好尽量少的对它进行自定义设置。这能够减小不受你控制的功能范围,最小化部署和生产环境的发散。
理想状况下,你的应用就像一个Spring Boot可执行jar,全部运行须要的东西都打包到它内部。
若是不指定其余打包方式,Cloud Foundry会启用它提供的默认打包方式.Cloud Foundry的Java buildpack对Spring应用有出色的支持,包括Spring Boot。你能够部署独立的可执行jar应用,也能够部署传统的的.war形式的应用。
一旦你构建了应用(好比,使用mvn clean package)并安装了cf命令行工具,你能够使用下面的cf push命令(将路径指向你编译后的.jar)来部署应用。在发布一个应用前,确保你已登录CF命令行客户端。
$ cf push acloudyspringtime -p target/demo-0.0.1-SNAPSHOT.jar
查看cf push文档获取更多可选项。若是相同目录下存在manifest.yml,Cloud Foundry会使用它。
就此,比照开始上传你的应用:
Uploading acloudyspringtime... OK
Preparing to start acloudyspringtime... OK
-----> Downloaded app package (8.9M) -----> Java Buildpack source: system -----> Downloading Open JDK 1.7.0_51 from .../x86_64/openjdk-1.7.0_51.tar.gz (1.8s) Expanding Open JDK to .java-buildpack/open_jdk (1.2s) -----> Downloading Spring Auto Reconfiguration from 0.8.7 .../auto-reconfiguration-0.8.7.jar (0.1s) -----> Uploading droplet (44M) Checking status of app 'acloudyspringtime'... 0 of 1 instances running (1 starting) ... 0 of 1 instances running (1 down) ... 0 of 1 instances running (1 starting) ... 1 of 1 instances running (1 running) App started
恭喜!应用如今处于运行状态!
检验部署应用的状态是很简单的:
$ cf apps
Getting applications in ... OK name requested state instances memory disk urls ... acloudyspringtime started 1/1 512M 1G acloudyspringtime.cfapps.io ...
一旦Cloud Foundry意识到你的应用已经部署,你就能够点击给定的应用URI,此处是acloudyspringtime.cfapps.io/。
默认状况下,运行应用的元数据和服务链接信息被暴露为应用的环境变量(好比,$ VCAP_SERVICES)。采用这种架构的缘由是由于Cloud Foundry多语言特性(任何语言和平台都支持做为buildpack) 。进程级别的环境变量是语言无关(语言不可知)的。
环境变量并不老是有利于设计最简单的API,因此Spring Boot自动提取它们,而后将这些数据导入可以经过Spring Environment抽象访问的属性里:
@Component class MyBean implements EnvironmentAware { private String instanceId; @Override public void setEnvironment(Environment environment) { this.instanceId = environment.getProperty("vcap.application.instance_id"); } // ... }
全部的Cloud Foundry属性都以vcap做为前缀。你能够使用vcap属性获取应用信息(好比应用的公共URL)和服务信息(好比数据库证书)。具体参考VcapApplicationListener Javadoc。
注:Spring Cloud Connectors项目很适合好比配置数据源的任务.Spring Boot提供自动配置支持和一个spring-boot-starter-cloud-connectors starter POM。
Heroku的是另一个流行的PAAS平台。想要自定义的Heroku的构建过程,你能够提供一个Procfile,它提供部署一个应用所需的指令.Heroku为Java的应用分配一个端口,确保可以路由到外部URI。
你必须配置你的应用监听正确的端口。下面是用于咱们的启动器REST应用的Procfile:
web: java -Dserver.port=$PORT -jar target/demo-0.0.1-SNAPSHOT.jar
Spring Boot将-D参数做为属性,经过一个Spring的Environment实例访问.server.port配置属性适合于内嵌的Tomcat,Jetty或Undertow实例启用时使用。$ PORT环境变量被分配给Heroku Paas使用。
Heroku默认使用Java 1.6。只要你的Maven或Gradle构建时使用相同的版本就没问题(Maven用户能够设置java.version属性)。若是你想使用JDK 1.7,在你的pom.xml和Procfile临近处建立一个system.properties文件。在该文件中添加如下设置:
java.runtime.version=1.7
这就是你须要作的一切。对于Heroku部署来讲,常常作的工做就是使用git push将代码推送到生产环境。
$ git push heroku master
Initializing repository, done. Counting objects: 95, done. Delta compression using up to 8 threads. Compressing objects: 100% (78/78), done. Writing objects: 100% (95/95), 8.66 MiB | 606.00 KiB/s, done. Total 95 (delta 31), reused 0 (delta 0) -----> Java app detected -----> Installing OpenJDK 1.7... done -----> Installing Maven 3.2.3... done -----> Installing settings.xml... done -----> executing /app/tmp/cache/.maven/bin/mvn -B -Duser.home=/tmp/build_0c35a5d2-a067-4abc-a232-14b1fb7a8229 -Dmaven.repo.local=/app/tmp/cache/.m2/repository -s /app/tmp/cache/.m2/settings.xml -DskipTests=true clean install [INFO] Scanning for projects... Downloading: http://repo.spring.io/... Downloaded: http://repo.spring.io/... (818 B at 1.8 KB/sec) .... Downloaded: http://s3pository.heroku.com/jvm/... (152 KB at 595.3 KB/sec) [INFO] Installing /tmp/build_0c35a5d2-a067-4abc-a232-14b1fb7a8229/target/... [INFO] Installing /tmp/build_0c35a5d2-a067-4abc-a232-14b1fb7a8229/pom.xml ... [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 59.358s [INFO] Finished at: Fri Mar 07 07:28:25 UTC 2014 [INFO] Final Memory: 20M/493M [INFO] ------------------------------------------------------------------------ -----> Discovering process types Procfile declares types -> web -----> Compressing... done, 70.4MB -----> Launching... done, v6 http://agile-sierra-1405.herokuapp.com/ deployed to Heroku To git@heroku.com:agile-sierra-1405.git * [new branch] master -> master
如今你的应用已经启动并运行在Heroku。
Openshift是RedHat公共(和企业)PaaS解决方案。和Heroku类似,它也是经过运行被git提交触发的脚原本工做的,因此你能够使用任何你喜欢的方式编写Spring Boot应用启动脚本,只要Java运行时环境可用(这是在Openshift上能够要求的一个标准特性)。为了实现这样的效果,你能够使用DIY Cartridge,并在.openshift/action_scripts下hooks你的仓库:
基本模式以下:
1.确保Java和构建工具已被远程安装,好比使用一个pre_build hook(默认会安装Java和Maven,不会安装Gradle)。
2.使用一个build hook去构建你的jar(使用Maven或Gradle),好比
#!/bin/bash cd $OPENSHIFT_REPO_DIR mvn package -s .openshift/settings.xml -DskipTests=true
3.添加一个调用java -jar …的start hook
#!/bin/bash cd $OPENSHIFT_REPO_DIR nohup java -jar target/*.jar --server.port=${OPENSHIFT_DIY_PORT} --server.address=${OPENSHIFT_DIY_IP} &
4.使用一个stop hook
#!/bin/bash source $OPENSHIFT_CARTRIDGE_SDK_BASH PID=$(ps -ef | grep java.*\.jar | grep -v grep | awk '{ print $2 }') if [ -z "$PID" ] then client_result "Application is already stopped" else kill $PID fi
5.将内嵌的服务绑定到平台提供的在application.properties定义的环境变量,好比
spring.datasource.url: jdbc:mysql://${OPENSHIFT_MYSQL_DB_HOST}:${OPENSHIFT_MYSQL_DB_PORT}/${OPENSHIFT_APP_NAME} spring.datasource.username: ${OPENSHIFT_MYSQL_DB_USERNAME} spring.datasource.password: ${OPENSHIFT_MYSQL_DB_PASSWORD}
在Openshift的网站上有一篇running Gradle in Openshift博客,若是想使用gradle构建运行的应用能够参考它。因为一个Gradle bug,你不能使用高于1.6版本的Gradle。
Google App Engine跟Servlet 2.5 API是有联系的,因此在不修改的状况系你是不能部署一个Spring应用的。具体查看本指南的Servlet 2.5章节 Container.md)。
Spring Boot CLI是一个命令行工具,若是想使用Spring进行快速开发能够使用它。它容许你运行Groovy脚本,这意味着你能够使用熟悉的类Java语法,而且没有那么多的模板代码。你也能够启动一个新的项目或为Spring Boot CLI编写本身的命令。
你能够手动安装Spring Boot CLI,也能够使用GVM(Groovy环境管理工具)或Homebrew,MacPorts(若是你是一个OSX用户)。参考"Getting started"的Section 10.2, “Installing the Spring Boot CLI” 能够看到全面的安装指令。
一旦安装好CLI,你能够输入spring来运行它。若是你不使用任何参数运行spring,将会展示一个简单的帮助界面:
$ spring
usage: spring [--help] [--version] [] Available commands are: run [options] [--] [args] Run a spring groovy script ... more command help is shown here
你能够使用help获取任何支持命令的详细信息。例如:
$ spring help run
spring run - Run a spring groovy script
usage: spring run [options] [--] [args]
Option Description
------ -----------
--autoconfigure [Boolean] Add autoconfigure compiler transformations (default: true) --classpath, -cp Additional classpath entries -e, --edit Open the file with the default system editor --no-guess-dependencies Do not attempt to guess dependencies --no-guess-imports Do not attempt to guess imports -q, --quiet Quiet logging -v, --verbose Verbose logging of dependency resolution --watch Watch the specified file for changes
version命令提供一个检查你正在使用的Spring Boot版本的快速方式:
$ spring version
Spring CLI v1.3.0.BUILD-SNAPSHOT
你能够使用run命令编译和运行Groovy源代码。Spring Boot CLI彻底自包含,以至于你不须要安装任何外部的Groovy。
下面是一个使用Groovy编写的"hello world" web应用: hello.grooy
@RestController class WebApplication { @RequestMapping("/") String home() { "Hello World!" } }
想要编译和运行应用,输入:
$ spring run hello.groovy
想要给应用传递命令行参数,你须要使用一个--来将它们和"spring"命令参数区分开来。例如:
$ spring run hello.groovy -- --server.port=9000
想要设置JVM命令行参数,你能够使用JAVA_OPTS环境变量,例如:
$ JAVA_OPTS=-Xmx1024m spring run hello.groovy
标准的Groovy的一个全部游戏@Grab
注解,它容许你声明对第三方库的依赖。这项有用的技术容许的Groovy以和的Maven或摇篮相同的方式下载广口瓶,但不须要使用构建工具。
Spring Boot进一步延伸了该技术,它会基于你的代码尝试推导你“抢”哪一个库。例如,因为WebApplication代码上使用了@RestController
注解,“Tomcat”和“Spring MVC”将被获取(抓住)。
下面的项目被用做“grab hints”:
项目 | 抓斗 |
---|---|
JdbcTemplate的,是NamedParameterJdbcTemplate,数据源 | JDBC应用 |
@EnableJms | JMS应用 |
@EnableCaching | 缓存抽象 |
@测试 | JUnit的 |
@EnableRabbit | 的RabbitMQ |
@EnableReactor | 项目反应堆 |
继承规范 | Spock测试 |
@EnableBatchProcessing | 春天的批次 |
@ MessageEndpoint,@ EnableIntegrationPatterns | Spring集成 |
@EnableDeviceResolver | Spring Mobile |
@控制器@ RestController,@ EnableWebMvc | Spring MVC +嵌入式Tomcat |
@EnableWebSecurity | Spring Security |
@EnableTransactionManagement | 春季交易管理 |
注:想要理解自定义是如何生效,能够查看Spring Boot CLI源码中的CompilerAutoConfiguration子类。
Spring Boot扩展Groovy标准“@Grab”注解使其可以容许你指定一个没有组或版本的依赖,例如@Grab('freemarker')。artifact's的组和版本是经过查看Spring Boot的依赖元数据推断出来的。注意默认的元数据是和你使用的命令行版本绑定的 - 只有在你迁移到一个CLI新版本时它才会改变,这样当你的依赖改变时你就能够控制了在附录的表格中能够查看默认元数据包含的依赖和它们的版本。
为了帮助你减小Groovy的代码量,一些进口语句被自动包含进来了。注意上面的示例中引用@组件,@ RestController和@RequestMapping而没有使用全限定名或导入语句。
注:不少春天注解在不使用进口语句的状况下能够正常工做尝试运行你的应用,看一下在添加进口以前哪些会失败。
跟等效的Java应用不一样,你不须要在Groovy脚本中添加一个public static void main(String [] args)方法.Spring Boot会使用你编译后的代码自动建立一个SpringApplication。
Spring Boot提供一个新的@GrabMetadata注解,你能够使用它提供自定义的依赖元数据,以覆盖Spring Boot的默认配置。该元数据经过使用提供一个或多个配置文件坐标的注解来指定(使用一个属性标识符 “类型” 部署到Maven的仓库)..配置文件中的每一个实体必须遵循组:模块=版本的格式。
例如,下面的声明:
`@GrabMetadata("com.example.custom-versions:1.0.0")`
将会加载的Maven处于仓库com/example/custom-versions/1.0.0/
下的custom-versions-1.0.0.properties
文件。
能够经过注解指定多个属性文件,它们会以声明的顺序被使用例如:
`@GrabMetadata(["com.example.custom-versions:1.0.0", "com.example.more-versions:1.0.0"])`
意味着位于多个版本的属性将覆盖位于定制版本的属性。
你能够在任何可以使用@Grab的地方使用@GrabMetadata,然而,为了确保元数据的顺序一致,你在应用程序中最多只能使用一次@ GrabMetadata.Spring IO平台是一个很是有用的依赖元数据源( Spring Boot的超集),例如:
@GrabMetadata('io.spring.platform:platform-versions:1.0.4.RELEASE')
测试命令容许你编译和运行应用程序的测试用例常规使用方式以下:
$ spring test app.groovy tests.groovy Total: 1, Success: 1, : Failures: 0 Passed? true
在这个示例中,test.groovy包含JUnit @Test方法或Spock规范类。全部的普通框架注解和静态方法在不使用import导入的状况下,仍旧能够使用。
下面是咱们使用的test.groovy文件(含有一个JUnit的测试):
class ApplicationTests { @Test void homeSaysHello() { assertEquals("Hello World!", new WebApplication().home()) } }
注:若是有多个测试源文件,你能够倾向于使用一个测试目录来组织它们。
你能够在全部接收文件输入的命令中使用外壳通配符这容许你轻松处理来自一个目录下的多个文件,例如:
$ spring run *.groovy
若是你想将 '测试' 或 '规范' 代码从主应用代码中分离,这项技术就十分有用了:
$ spring test app/*.groovy test/*.groovy
你能够使用的jar命令打包应用程序为一个可执行的JAR文件例如:
$ spring jar my-app.jar *.groovy
最终的jar包括编译应用产生的类和全部依赖,这样你就能够使用java -jar来执行它了。该jar文件也包括来自应用classpath的实体。你能够使用--include和--exclude添加明确的路径(二者都是用逗号分割,一样都接收值为'+'和'-'的前缀,'-'意味着它们将从默认设置中移除)。默认包含(includes):
public/**, resources/**, static/**, templates/**, META-INF/**, *
默认排除(excludes):
.*, repository/**, build/**, target/**, **/*.jar, **/*.groovy
查看spring help jar能够得到更多信息。
init命令容许你使用start.spring.io在不离开shell的状况下建立一个新的项目。例如:
$ spring init --dependencies=web,data-jpa my-project
Using service at https://start.spring.io Project extracted to '/Users/developer/example/my-project'
这建立了一个my-project目录,它是一个基本Maven且依赖spring-boot-starter-web和spring-boot-starter-data-jpa的项目。你能够使用--list参数列出该服务的能力。
$ spring init --list ======================================= Capabilities of https://start.spring.io ======================================= Available dependencies: ----------------------- actuator - Actuator: Production ready features to help you monitor and manage your application ... web - Web: Support for full-stack web development, including Tomcat and spring-webmvc websocket - Websocket: Support for WebSocket development ws - WS: Support for Spring Web Services Available project types: ------------------------ gradle-build - Gradle Config [format:build, build:gradle] gradle-project - Gradle Project [format:project, build:gradle] maven-build - Maven POM [format:build, build:maven] maven-project - Maven Project [format:project, build:maven] (default) ...
init命令支持不少选项,查看help输出能够得到更多详情。例如,下面的命令建立一个使用Java8和war打包的gradle项目:
$ spring init --build=gradle --java-version=1.8 --dependencies=websocket --packaging=war sample-app.zip Using service at https://start.spring.io Content saved to 'sample-app.zip'
Spring Boot包括完整的BASH和zsh shells的命令行脚本。若是你不使用它们中的任何一个(可能你是一个Window用户),那你能够使用shell命令启用一个集成shell。
$ spring shell
Spring Boot (v1.3.0.BUILD-SNAPSHOT) Hit TAB to complete. Type \'help' and hit RETURN for help, and \'exit' to quit.
从内嵌shell中能够直接运行其余命令:
$ version
Spring CLI v1.3.0.BUILD-SNAPSHOT
内嵌shell支持ANSI颜色输出和tab补全。若是须要运行一个原生命令,你能够使用$前缀。点击ctrl-c将退出内嵌shell。
使用install命令能够为CLI添加扩展。该命令接收一个或多个格式为group:artifact:version的artifact坐标集。例如:
$ spring install com.example:spring-boot-cli-extension:1.0.0.RELEASE
除了安装你提供坐标的artifacts标识外,全部依赖也会被安装。使用uninstall能够卸载一个依赖。和install命令同样,它接收一个或多个格式为group:artifact:version的artifact坐标集。例如:
$ spring uninstall com.example:spring-boot-cli-extension:1.0.0.RELEASE
它会经过你提供的坐标卸载相应的artifacts标识和它们的依赖。
为了卸载全部附加依赖,你能够使用--all选项。例如:
$ spring uninstall --all
Spring框架4.0版本对beans{} DSL(借鉴自Grails)提供原生支持,你能够使用相同的格式在你的Groovy应用程序脚本中嵌入bean定义。有时候这是一个包括外部特性的很好的方式,好比中间件声明。例如:
@Configuration class Application implements CommandLineRunner { @Autowired SharedService service @Override void run(String... args) { println service.message } } import my.company.SharedService beans { service(SharedService) { message = "Hello World" } }
你能够使用beans{}混合位于相同文件的类声明,只要它们都处于顶级,或若是你喜欢的话,能够将beans DSL放到一个单独的文件中。
Spring Boot为Maven和Gradle提供构建工具插件。该插件提供各类各样的特性,包括打包可执行jars。本节提供关于插件的更多详情及用于扩展一个不支持的构建系统所需的帮助信息。若是你是刚刚开始,那可能须要先阅读Part III, “Using Spring Boot”
章节的“Chapter 13, Build systems”
。
Spring Boot Maven插件为Maven提供Spring Boot支持,它容许你打包可执行jar或war存档,而后就地运行应用。为了使用它,你须要使用Maven 3.2 (或更高版本)。
注:参考Spring Boot Maven插件站点能够获取所有的插件文档。
想要使用Spring Boot Maven插件只需简单地在你的pom.xml的插件部分包含相应的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> <!-- ... --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>1.3.0.BUILD-SNAPSHOT</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> </project>
该配置会在Maven的生命周期的包装阶段从新打包一个罐子或战争下面的示例显示在目标目录下既有从新打包后的罐子,也有原始的罐子:
$ mvn package
$ ls target/*.jar
target/myproject-1.0.0.jar target/myproject-1.0.0.jar.original
若是不包含像上面那样的<执行/>,你能够本身运行该插件(但只有在包目标也被使用的状况)例如:
$ mvn package spring-boot:repackage $ ls target/*.jar target/myproject-1.0.0.jar target/myproject-1.0.0.jar.original
若是使用一个里程碑或快照版本,你还须要添加正确的pluginRepository元素:
<pluginRepositories> <pluginRepository> <id>spring-snapshots</id> <url>http://repo.spring.io/snapshot</url> </pluginRepository> <pluginRepository> <id>spring-milestones</id> <url>http://repo.spring.io/milestone</url> </pluginRepository> </pluginRepositories>
一旦弹簧引导Maven的插件被包含到你的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"> <!-- ... --> <packaging>jar</packaging> <!-- ... --> </project>
生成的存档在包阶段会被Spring Boot加强。你想启动的主类便可以经过指定一个配置选项,也能够经过为manifest添加一个Main-Class属性这种常规的方式实现。若是你没有指定一个main类,该插件会搜索带有public static void main(String [] args)方法的类。
为了构建和运行一个项目的神器,你能够输入如下命令:
$ mvn package
$ java -jar target/mymodule-0.0.1-SNAPSHOT.jar
为了构建一个便是可执行的,又能部署到一个外部容器的战争文件,你须要标记内嵌容器依赖为 “提供”,例如:
<?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"> <!-- ... --> <packaging>war</packaging> <!-- ... --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <!-- ... --> </dependencies> </project>
注:参考具体“Section 74.1, “Create a deployable war file”
章节。
在插件信息页面有高级的配置选项和示例。
Spring Boot Gradle插件为Gradle提供Spring Boot支持,运行Spring Boot应用,对于“神圣的”依赖能够在你的build.gradle文件中省略版本信息。
想要使用Spring Boot Gradle插件,你只需简单的包含一个buildscript依赖,并应用spring-boot插件:
buildscript {
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.0.BUILD-SNAPSHOT") } } apply plugin: 'spring-boot'
若是想使用一个里程碑或快照版本,你能够添加相应的库引用:
buildscript {
repositories {
maven.url "http://repo.spring.io/snapshot" maven.url "http://repo.spring.io/milestone" } // ... }
对于充分使用该功能,只须要想一般那样声明依赖,可是将版本号设置为空:
dependencies {
compile("org.springframework.boot:spring-boot-starter-web") compile("org.thymeleaf:thymeleaf-spring4") compile("nz.net.ultraq.thymeleaf:thymeleaf-layout-dialect") }
注:你声明的spring-boot Gradle插件的版本决定了“blessed”依赖的实际版本(确保能够重复构建)。你最好老是将spring-boot gradle插件版本设置为你想用的Spring Boot实际版本。提供的版本详细信息能够在附录中找到。
春天启动插件对于没有指定版本的依赖只会提供一个版本若是不想使用插件提供的版本,你能够像日常那样在声明依赖的时候指定版本例如:
dependencies {
compile("org.thymeleaf:thymeleaf-spring4:2.1.1.RELEASE") }
若是你须要不一样于Spring Boot的“blessed”依赖,有可能的话能够自定义ResolutionStrategy使用的版本。替代的版本元数据使用版本管理配置。例如:
dependencies {
versionManagement("com.mycorp:mycorp-versions:1.0.0.RELEASE@properties") compile("org.springframework.data:spring-data-hadoop") }
。版本信息须要做为一个的.properties文件发布到一个仓库中对于上面的示例,mycorp-versions.properties文件可能包含如下内容:
org.springframework.data\:spring-data-hadoop=2.0.0.RELEASE
属性文件优先于Spring Boot默认设置,若是有必要的话能够覆盖版本号。
Gradle处理“排除规则”的方式和Maven稍微有些不一样,在使用起始POMs时这可能会引发没法预料的结果。特别地,当一个依赖能够经过不一样的路径访问时,对该依赖声明的排除将不会生效。例如,若是一个starter POM声明如下内容:
<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>4.0.5.RELEASE</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.0.5.RELEASE</version> </dependency> </dependencies>
commons-logging jar不会被Gradle排除,由于经过没有排除元素的spring-context能够传递性的拉取到它(spring-context→spring-core→commons-logging)。
为了确保正确的排除被实际应用,Spring Boot Gradle插件将自动添加排除规则。全部排除被定义在spring-boot-dependencies POM,而且针对“starter”POMs的隐式规则也会被添加。
若是不想自动应用排除规则,你能够使用如下配置:
springBoot {
applyExcludeRules=false }
一旦弹簧启动插件被应用到你的项目,它将使用bootRepackage任务自动尝试重写存档以使它们可以执行。为了构建一个罐子或战争,你须要按一般的方式配置项目。
你想启动的主类既能够经过一个配置选项指定,也能够经过向manifest添加一个Main-Class属性。若是你没有指定主类,该插件会搜索带有公共静态void main(String [] args)方法的类。
为了构建和运行一个项目的神器,你能够输入如下内容:
$ gradle build
$ java -jar build/libs/mymodule-0.0.1-SNAPSHOT.jar
为了构建一个即能执行也能够部署到外部容器的战争包,你须要将内嵌容器依赖标记为 “providedRuntime”,好比:
...
apply plugin: 'war' war { baseName = 'myapp' version = '0.5.0' } repositories { jcenter() maven { url "http://repo.spring.io/libs-snapshot" } } configurations { providedRuntime } dependencies { compile("org.springframework.boot:spring-boot-starter-web") providedRuntime("org.springframework.boot:spring-boot-starter-tomcat") ... }
注:具体参考“第74.1节”,建立可部署的war文件“”。
为了在不先构建JAR的状况下运行项目,你能够使用 “bootRun” 任务:
$ gradle bootRun
默认状况下,以这种方式运行项目可让你的静态类路径资源(好比,默认位于的src /主/资源下)在应用运行期间被从新加载。使静态资源能够从新加载意味着bootRun任务不会使用processResources任务的输出,好比,当调用bootRun时,你的应用将以资源未处理的形式来使用它们。
你能够禁止直接使用静态classpath中资源这意味着资源再也不是可从新加载的,但processResources任务的输出将会被使用想要这样作,只需将bootRun任务的addResources设为假。:
bootRun {
addResources = false }
摇篮插件自动扩展你的构建脚本DSL,它为脚本添加一个springBoot元素以此做为引导插件的全局配置。你能够像配置其余摇篮扩展那样为springBoot设置相应的属性(下面有配置选项列表)。
springBoot {
backupSource = false }
该插件添加了一个bootRepackage任务,你能够直接配置它,好比:
bootRepackage {
mainClass = 'demo.Application' }
下面是可用的配置选项:
名称 | 描述 |
---|---|
启用 | 布尔值,用于控制再打包的开关(若是你只想要启动的其余特性而不是这个,那它就派上用场了) |
mainClass | 要运行的主类。若是没有指定,则使用项属性mainClassName。若是没有定义mainClassName id,则搜索存档以寻找一个合适的类。“合适”意味着一个惟一的,具备良好格式的main()方法的类(若是找到多个则构建会失败)。你也能够经过 “运行” 任务(主要属性)指定主类的名称,和/或将 “startScripts”(mainClassName属性)做为 “springBoot” 配置的替代。 |
分类 | 添加到存档的一个文件名字段(在扩展以前),这样最初保存的存档仍旧存放在最初的位置。在存档被从新打包(repackage)的状况下,该属性默认为null。默认值适用于多数状况,但若是你想在另外一个项目中使用原jar做为依赖,最好使用一个扩展来定义该可执行jar |
withJarTask | Jar任务的名称或值,用于定位要被repackage的存档 |
customConfiguration | 自定义配置的名称,用于填充内嵌的lib目录(不指定该属性,你将获取全部编译和运行时依赖) |
有时候不打包解析自compile,runtime和provided做用域的默认依赖可能更合适些。若是建立的可执行jar被原样运行,你须要将全部的依赖内嵌进该jar中;然而,若是目的是explode一个jar文件,并手动运行main类,你可能在CLASSPATH下已经有一些可用的库了。在这种状况下,你能够使用不一样的依赖集从新打包(repackage)你的jar。
使用自定义的配置将自动禁用来自compile,runtime和provided做用域的依赖解析。自定义配置便可以定义为全局的(处于springBoot部份内),也能够定义为任务级的。
task clientJar(type: Jar) { appendix = 'client' from sourceSets.main.output exclude('**/*Something*') } task clientBoot(type: BootRepackage, dependsOn: clientJar) { withJarTask = clientJar customConfiguration = "mycustomconfiguration" }
在以上示例中,咱们建立了一个新的clientJar Jar任务从你编译后的源中打包一个自定义文件集。而后咱们建立一个新的clientBoot BootRepackage任务,并让它使用clientJar任务和mycustomconfiguration。
configurations {
mycustomconfiguration.exclude group: 'log4j' } dependencies { mycustomconfiguration configurations.runtime }
在BootRepackage中引用的配置是一个正常的Gradle配置。在上面的示例中,咱们建立了一个新的名叫mycustomconfiguration的配置,指示它来自一个runtime,并排除对log4j的依赖。若是clientBoot任务被执行,从新打包的jar将含有全部来自runtime做用域的依赖,除了log4j jars。
可用的配置选项以下:
名称 | 描述 |
---|---|
mainClass | 可执行jar运行的main类 |
providedConfiguration | provided配置的名称(默认为providedRuntime) |
backupSource | 在从新打包以前,原先的存档是否备份(默认为true) |
customConfiguration | 自定义配置的名称 |
layout | 存档类型,对应于内部依赖是如何制定的(默认基于存档类型进行推测) |
requiresUnpack | 一个依赖列表(格式为"groupId:artifactId",为了运行,它们须要从fat jars中解压出来。)全部节点被打包进胖jar,但运行的时候它们将被自动解压 |
当spring-boot被应用到你的Gradle项目,一个默认的名叫bootRepackage的任务被自动建立。bootRepackage任务依赖于Gradle assemble任务,当执行时,它会尝试找到全部限定符为空的jar artifacts(也就是说,tests和sources jars被自动跳过)。
因为bootRepackage查找'全部'建立jar artifacts的事实,Gradle任务执行的顺序就很是重要了。多数项目只建立一个单一的jar文件,因此一般这不是一个问题。然而,若是你正打算建立一个更复杂的,使用自定义jar和BootRepackage任务的项目setup,有几个方面须要考虑。
若是'仅仅'从项目建立自定义jar文件,你能够简单地禁用默认的jar和bootRepackage任务:
jar.enabled = false bootRepackage.enabled = false
另外一个选项是指示默认的bootRepackage任务只能使用一个默认的jar任务:
bootRepackage.withJarTask = jar
若是你有一个默认的项目setup,在该项目中,主(main)jar文件被建立和从新打包。而且,你仍旧想建立额外的自定义jars,你能够将自定义的repackage任务结合起来,而后使用dependsOn,这样bootJars任务就会在默认的bootRepackage任务执行之后运行:
task bootJars bootJars.dependsOn = [clientBoot1,clientBoot2,clientBoot3] build.dependsOn(bootJars)
上面全部方面常常用于避免一个已经建立的boot jar又被从新打包的状况。从新打包一个存在的boot jar不是什么大问题,但你可能会发现它包含没必要要的依赖。
若是想使用除了Maven和Gradle以外的构建工具,你可能须要开发本身的插件。可执行jars须要遵循一个特定格式,而且一些实体须要以不压缩的方式写入(详情查看附录中的可执行jar格式章节)。
Spring Boot Maven和Gradle插件都利用spring-boot-loader-tools来实际地产生jars。若是须要,你也能够自由地直接使用该库。
使用org.springframework.boot.loader.tools.Repackager能够将一个存在的存档从新打包,这样它就变成一个自包含的可执行存档。Repackager类须要提供单一的构造器参数,它引用一个存在的jar或war包。使用两个可用的repackage()方法中的一个来替换原始的文件或写入一个新的目标。在repackager运行前还能够设置各类配置。
当从新打包一个存档时,你能够使用org.springframework.boot.loader.tools.Libraries接口来包含对依赖文件的引用。在这里咱们不提供任何该Libraries接口的具体实现,由于它们一般跟具体的构建系统相关。
若是你的存档已经包含libraries,你能够使用Libraries.NONE。
若是你没有使用Repackager.setMainClass()指定一个main类,该repackager将使用ASM去读取class文件,而后尝试查找一个合适的,具备public static void main(String[] args)方法的类。若是发现多个候选者,将会抛出异常。
这里是一个传统的repackage示例:
Repackager repackager = new Repackager(sourceJarFile); repackager.setBackupSource(false); repackager.repackage(new Libraries() { @Override public void doWithLibraries(LibraryCallback callback) throws IOException { // Build system specific implementation, callback for each dependency // callback.library(new Library(nestedFile, LibraryScope.COMPILE)); } });
本章节将回答一些常见的"我该怎么作"类型的问题,这些问题在咱们使用Spring Boot时常常遇到。这毫不是一个详尽的列表,但它覆盖了不少方面。
若是遇到一个特殊的咱们没有覆盖的问题,你可能想去查看stackoverflow.com,看是否有人已经给出了答案;这也是一个很好的提新问题的地方(请使用spring-boot标签)。
咱们也乐意扩展本章节;若是想添加一个'how-to',你能够给咱们发一个pull请求。
Spring Boot自动配置老是尝试尽最大努力去作正确的事,但有时候会失败而且很难说出失败缘由。
在每一个Spring Boot ApplicationContext中都存在一个至关有用的ConditionEvaluationReport。若是开启DEBUG日志输出,你将会看到它。若是你使用spring-boot-actuator,则会有一个autoconfig的端点,它将以JSON形式渲染该报告。能够使用它调试应用程序,并能查看Spring Boot运行时都添加了哪些特性(及哪些没添加)。
经过查看源码和javadoc能够获取更多问题的答案。如下是一些经验:
每一个SpringApplication都有ApplicationListeners和ApplicationContextInitializers,用于自定义上下文(context)或环境(environment)。Spring Boot从META-INF/spring.factories下加载不少这样的内部使用的自定义。有不少方法能够注册其余的自定义:
SpringApplication会给监听器(即便是在上下文被建立以前就存在的)发送一些特定的ApplicationEvents,而后也会注册监听ApplicationContext发布的事件的监听器。查看Spring Boot特性章节中的Section 22.4, “Application events and listeners”
能够获取一个完整列表。
不是全部的Spring应用都必须是web应用(或web服务)。若是你想在main方法中执行一些代码,但须要启动一个Spring应用去设置须要的底层设施,那使用Spring Boot的SpringApplication特性能够很容易实现。SpringApplication会根据它是否须要一个web应用来改变它的ApplicationContext类。首先你须要作的是去掉servlet API依赖,若是不能这样作(好比,基于相同的代码运行两个应用),那你能够明确地调用SpringApplication.setWebEnvironment(false)或设置applicationContextClass属性(经过Java API或使用外部配置)。你想运行的,做为业务逻辑的应用代码能够实现为一个CommandLineRunner,并将上下文降级为一个@Bean定义。
SpringApplication已经被属性化(主要是setters),因此你能够在建立应用时使用它的Java API修改它的行为。或者你能够使用properties文件中的spring.main.*来外部化(在应用代码外配置)这些配置。好比,在application.properties中可能会有如下内容:
spring.main.web_environment=false spring.main.show_banner=false
而后Spring Boot在启动时将不会显示banner,而且该应用也不是一个web应用。
默认状况下,来自不一样源的属性以一个定义好的顺序添加到Spring的Environment中(查看'Sprin Boot特性'章节的Chapter 23, Externalized Configuration
获取精确的顺序)。
为应用程序源添加@PropertySource注解是一种很好的添加和修改源顺序的方法。传递给SpringApplication静态便利设施(convenience)方法的类和使用setSources()添加的类都会被检查,以查看它们是否有@PropertySources,若是有,这些属性会被尽量早的添加到Environment里,以确保ApplicationContext生命周期的全部阶段都能使用。以这种方式添加的属性优先于任何使用默认位置添加的属性,但低于系统属性,环境变量或命令行参数。
你也能够提供系统属性(或环境变量)来改变该行为:
无论你在environment设置什么,Spring Boot都将加载上面讨论过的application.properties。若是使用YAML,那具备'.yml'扩展的文件默认也会被添加到该列表。
详情参考ConfigFileApplicationListener
有些人喜欢使用(例如)--port=9000代替--server.port=9000来设置命令行配置属性。你能够经过在application.properties中使用占位符来启用该功能,好比:
server.port=${port:8080}
注:若是你继承自spring-boot-starter-parent POM,为了防止和Spring-style的占位符产生冲突,maven-resources-plugins默认的过滤令牌(filter token)已经从${*}变为@(即@maven.token@代替了${maven.token})。若是已经直接启用maven对application.properties的过滤,你可能也想使用其余的分隔符替换默认的过滤令牌。
注:在这种特殊的状况下,端口绑定可以在一个PaaS环境下工做,好比Heroku和Cloud Foundry,由于在这两个平台中PORT环境变量是自动设置的,而且Spring可以绑定Environment属性的大写同义词。
YAML是JSON的一个超集,能够很是方便的将外部配置以层次结构形式存储起来。好比:
spring:
application:
name: cruncher
datasource:
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost/test server: port: 9000
建立一个application.yml文件,将它放到classpath的根目录下,并添加snakeyaml依赖(Maven坐标为org.yaml:snakeyaml,若是你使用spring-boot-starter那就已经被包含了)。一个YAML文件会被解析为一个Java Map<String,Object>(和一个JSON对象相似),Spring Boot会平伸该map,这样它就只有1级深度,而且有period-separated的keys,跟人们在Java中常用的Properties文件很是相似。 上面的YAML示例对应于下面的application.properties文件:
spring.application.name=cruncher
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost/test server.port=9000
查看'Spring Boot特性'章节的Section 23.6, “Using YAML instead of Properties”能够获取更多关于YAML的信息。
Spring Environment有一个API能够设置生效的profile,但一般你会设置一个系统profile(spring.profiles.active)或一个OS环境变量(SPRING_PROFILES_ACTIVE)。好比,使用一个-D参数启动应用程序(记着把它放到主类或JAR文件以前):
$ java -jar -Dspring.profiles.active=production demo-0.0.1-SNAPSHOT.jar
在Spring Boot中,你也能够在application.properties里设置生效的我的资料,例如:
spring.profiles.active=production
SpringApplicationBuilder.profiles()方法替换。所以,后面的Java API可用来在不改变默认设置的状况下增长配置文件。
想要获取更多信息可查看'Spring Boot特性'章节的Chapter 24, Profiles
。
一个YAML文件其实是一系列以---线分割的文档,每一个文档都被单独解析为一个平坦的(扁平)地图。
若是一个YAML文档包含一个spring.profiles关键字,那型材的值(以逗号分割的简档列表)将被传入弹簧的Environment.acceptsProfiles()方法,而且若是这些简档的任何一个被激活,对应的文档被包含到最终的合并中(不然不会)。
示例:
server: port: 9000 --- spring: profiles: development server: port: 9001 --- spring: profiles: production server: port: 0
在这个示例中,默认的端口是9000,但若是Spring profile'development'生效则该端口是9001,若是'production'生效则它是0。
YAML文档以它们遇到的顺序合并(因此后面的值会覆盖前面的值)。
想要使用的配置文件文件完成一样的操做,你能够使用应用程序 - $ {}配置文件的.properties指定特殊的,我的资料相关的值。
Spring Boot在运行时未来自application.properties(或.yml)的外部属性绑定进一个应用中。在一个地方不可能存在详尽的全部支持属性的列表(技术上也是不可能的),由于你的classpath下的其余jar文件也可以贡献。
每一个运行中且有Actuator特性的应用都会有一个configprops端点,它可以展现全部边界和可经过@ConfigurationProperties绑定的属性。
附录中包含一个application.properties示例,它列举了Spring Boot支持的大多数经常使用属性。获取权威列表可搜索@ConfigurationProperties和@Value的源码,还有不常用的RelaxedEnvironment。
Servlet规范支持的Servlet,Filter,ServletContextListener和其余监听器能够做为@Bean定义添加到你的应用中。须要格外当心的是,它们不会引发太多的其余beans的热初始化,由于在应用生命周期的早期它们已经被安装到容器里了(好比,让它们依赖你的DataSource或JPA配置就不是一个好主意)。你能够经过延迟初始化它们到第一次使用而不是初始化时来突破该限制。
在Filters和Servlets的状况下,你也能够经过添加一个FilterRegistrationBean或ServletRegistrationBean代替或以及底层的组件来添加映射(mappings)和初始化参数。
在一个单独的应用中,主HTTP端口默认为8080,但能够使用server.port设置(好比,在application.properties中或做为一个系统属性)。因为Environment值的宽松绑定,你也能够使用SERVER_PORT(好比,做为一个OS环境变)。
为了彻底关闭HTTP端点,但仍建立一个WebApplicationContext,你能够设置server.port=-1(测试时可能有用)。
想获取更多详情可查看'Spring Boot特性'章节的Section 26.3.3, “Customizing embedded servlet containers”
,或ServerProperties
源码。
想扫描一个未使用的端口(为了防止冲突使用OS本地端口)能够使用server.port=0。
你能够经过日志输出或它的EmbeddedServletContainer的EmbeddedWebApplicationContext获取服务器正在运行的端口。获取和确认服务器已经初始化的最好方式是添加一个ApplicationListener<EmbeddedServletContainerInitializedEvent>
类型的@Bean,而后当事件发布时将容器pull出来。
使用@WebIntegrationTests的一个有用实践是设置server.port=0,而后使用@Value注入实际的('local')端口。例如:
@RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfiguration(classes = SampleDataJpaApplication.class) @WebIntegrationTest("server.port:0") public class CityRepositoryIntegrationTests { @Autowired EmbeddedWebApplicationContext server; @Value("${local.server.port}") int port; // ... }
SSL可以以声明方式进行配置,通常经过在application.properties或application.yml设置各类各样的server.ssl.*属性。例如:
server.port = 8443 server.ssl.key-store = classpath:keystore.jks server.ssl.key-store-password = secret server.ssl.key-password = another-secret
获取全部支持的配置详情可查看Ssl。
注:Tomcat要求key存储(若是你正在使用一个可信存储)可以直接在文件系统上访问,即它不能从一个jar文件内读取。Jetty和Undertow没有该限制。
使用相似于以上示例的配置意味着该应用将不在支持端口为8080的普通HTTP链接.Spring Boot不支持经过application.properties同时配置HTTP链接器和HTTPS链接器。若是你两个都想要,那就须要以编程的方式配置它们中的一个。推荐使用application.properties配置HTTPS,HTTP由于链接器是两个中最容易以编程方式进行配置的。获取示例可查看弹簧引导采样Tomcat的多链接器示例项目。
一般你能够遵循第63.7节,“Discover built-in options for external properties”
关于@ConfigurationProperties(这里主要的是ServerProperties)的建议,但也看看EmbeddedServletContainerCustomizer和各类你能够添加的Tomcat特定的*定制器。
Tomcat API至关丰富,一旦获取到TomcatEmbeddedServletContainerFactory,你就可以以多种方式修改它。或核心选择是添加你本身的TomcatEmbeddedServletContainerFactory。
能够你将一个org.apache.catalina.connector.Connector
添加到TomcatEmbeddedServletContainerFactory,这就可以容许多链接器,好比HTTP和HTTPS链接器:
@Bean public EmbeddedServletContainerFactory servletContainer() { TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory(); tomcat.addAdditionalTomcatConnectors(createSslConnector()); return tomcat; } private Connector createSslConnector() { Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler(); try { File keystore = new ClassPathResource("keystore").getFile(); File truststore = new ClassPathResource("keystore").getFile(); connector.setScheme("https"); connector.setSecure(true); connector.setPort(8443); protocol.setSSLEnabled(true); protocol.setKeystoreFile(keystore.getAbsolutePath()); protocol.setKeystorePass("changeit"); protocol.setTruststoreFile(truststore.getAbsolutePath()); protocol.setTruststorePass("changeit"); protocol.setKeyAlias("apitester"); return connector; } catch (IOException ex) { throw new IllegalStateException("can't access keystore: [" + "keystore" + "] or truststore: [" + "keystore" + "]", ex); } }
Spring Boot将自动配置Tomcat的RemoteIpValve,若是你启用它的话。这容许你透明地使用标准的x-forwarded-for和x-forwarded-proto头,不少前端代理服务器都会添加这些头信息(headers)。将这些属性中的一个或所有设置为非空的内容来开启该功能(它们是大多数代理约定的值,若是你只设置其中的一个,则另外一个也会被自动设置)。
server.tomcat.remote_ip_header=x-forwarded-for server.tomcat.protocol_header=x-forwarded-proto
若是你的代理使用不一样的头部(头),你能够经过向application.properties添加一些条目来自定义该值的配置,好比:
server.tomcat.remote_ip_header=x-your-remote-ip-header server.tomcat.protocol_header=x-your-protocol-header
该值也能够配置为一个默认的,可以匹配信任的内部代理的正则表达式。默认状况下,受信任的IP包括10 / 8,192.168 / 16,169.254 / 16和127/8。能够经过向应用的.properties添加一个条目来自定义该值的配置,好比:
server.tomcat.internal_proxies=192\\.168\\.\\d{1,3}\\.\\d{1,3}
注:只有在你使用一个属性文件做为配置的时候才须要双反斜杠若是你使用YAML,单个反斜杠就足够了,192.168 \ d {1,3} \ d {1,3}。和上面的等价。
另外,经过在一个TomcatEmbeddedServletContainerFactory
豆中配置和添加RemoteIpValve,你就能够彻底控制它的设置了。
Spring Boot starters(特别是spring-boot-starter-web)默认都是使用Tomcat做为内嵌容器的。你须要排除那些Tomcat的依赖并包含Jetty的依赖。为了让这种处理尽量简单,Spring Boot将Tomcat的和码头的依赖捆绑在一块儿,而后提供单独的启动器。
Maven的示例:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency>
摇篮示例:
configurations {
compile.exclude module: "spring-boot-starter-tomcat" } dependencies { compile("org.springframework.boot:spring-boot-starter-web:1.3.0.BUILD-SNAPSHOT") compile("org.springframework.boot:spring-boot-starter-jetty:1.3.0.BUILD-SNAPSHOT") // ... }
一般你能够遵循第63.7节“发现外部属性的内置选项”关于@ConfigurationProperties(此处主要是ServerProperties)的建议,但也要看下EmbeddedServletContainerCustomizer.Jetty API至关丰富,一旦获取到JettyEmbeddedServletContainerFactory,你就能够使用不少方式修改它。或更完全地就是添加你本身的JettyEmbeddedServletContainerFactory。
使用Undertow替代Tomcat和使用Jetty替代Tomcat很是相似。你须要排除Tomat依赖,并包含Undertow starter。
Maven的示例:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> </dependency>
摇篮示例:
configurations {
compile.exclude module: "spring-boot-starter-tomcat" } dependencies { compile 'org.springframework.boot:spring-boot-starter-web:1.3.0.BUILD-SNAPSHOT") compile 'org.springframework.boot:spring-boot-starter-undertow:1.3.0.BUILD-SNAPSHOT") // ... }
一般你能够遵循第63.7节“发现外部属性的内置选项”关于@ConfigurationProperties(此处主要是ServerProperties和ServerProperties.Undertow),但也要看下EmbeddedServletContainerCustomizer。一旦获取到UndertowEmbeddedServletContainerFactory,你就能够使用一个UndertowBuilderCustomizer修改暗潮的配置以知足你的需求。或更完全地就是添加你本身的UndertowEmbeddedServletContainerFactory。
往UndertowEmbeddedServletContainerFactory
添加一个UndertowBuilderCustomizer
,而后添加一个监听者到生成器:
@Bean public UndertowEmbeddedServletContainerFactory embeddedServletContainerFactory() { UndertowEmbeddedServletContainerFactory factory = new UndertowEmbeddedServletContainerFactory(); factory.addBuilderCustomizers(new UndertowBuilderCustomizer() { @Override public void customize(Builder builder) { builder.addHttpListener(8080, "0.0.0.0"); } }); return factory; }
Tomcat7可用于Spring Boot,但默认使用的是Tomcat8。若是不能使用Tomcat8(例如,你使用的是Java1.6),你须要改变classpath去引用Tomcat7。
若是正在使用启动器pom和parent,你只须要改变Tomcat的版本属性,好比,对于一个简单的webapp或服务:
<properties> <tomcat.version>7.0.59</tomcat.version> </properties> <dependencies> ... <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> ... </dependencies>
你能够经过设置tomcat.version属性改变的Tomcat的版本:
ext['tomcat.version'] = '7.0.59' dependencies { compile 'org.springframework.boot:spring-boot-starter-web' }
Jetty8可用于Spring Boot,但默认使用的是Jetty9。例如不能使用Jetty9(例如,由于你使用的是Java1.6),你只需改变classpath去引用Jetty8。你也须要排除Jetty的WebSocket相关的依赖。
若是正在使用starter pom和parent,你只需添加Jetty starter,去掉WebSocket依赖,并改变版本属性,好比,对于一个简单的webapp或服务:
<properties> <jetty.version>8.1.15.v20140411</jetty.version> <jetty-jsp.version>2.2.0.v201112011158</jetty-jsp.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> <exclusions> <exclusion> <groupId>org.eclipse.jetty.websocket</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
你能够设置jetty.version属性并排除相关的WebSocket的依赖,好比对于一个简单的Web应用程序或服务:
ext['jetty.version'] = '8.1.15.v20140411' dependencies { compile ('org.springframework.boot:spring-boot-starter-web') { exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' } compile ('org.springframework.boot:spring-boot-starter-jetty') { exclude group: 'org.eclipse.jetty.websocket' } }
若是想在一个使用内嵌容器的Spring Boot应用中使用@ServerEndpoint,你须要声明一个单独的ServerEndpointExporter @Bean:
@Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); }
该豆将用底层的WebSocket容器注册任何的被@ServerEndpoint注解的bean。当部署到一个单独的servlet容器时,该角色将被一个servlet容器初始化方法履行,ServerEndpointExporter bean也就没必要必需的了。
Spring Boot提供两种启用HTTP压缩的机制;一种是Tomcat特有的,另外一种是使用一个过滤器,能够配合Jetty,Tomcat和Undertow。
Tomcat的对HTTP响应压缩提供内建支持默认是禁用的,但能够经过application.properties轻松的启用:
server.tomcat.compression: on
当设置为上时,Tomcat的将压缩响应的长度至少为2048字节你能够配置一个整型值来设置该限制而不仅是上,好比:
server.tomcat.compression: 4096
默认状况下,Tomcat的只压缩某些MIME类型的响应(text / html的,文本/ XML和文本/无格式)你能够使用server.tomcat.compressableMimeTypes属性进行自定义,好比:
server.tomcat.compressableMimeTypes=application/json,application/xml
若是你正在使用Jetty或Undertow,或想要更精确的控制HTTP响应压缩,Spring Boot为Jetty的GzipFilter提供自动配置。虽然该过滤器是Jetty的一部分,但它也兼容Tomcat和Undertow。想要启用该过滤器,只需简单的为你的应用添加org.eclipse.jetty:码头-servlet的依赖。
GzipFilter能够使用spring.http.gzip。*属性进行配置。具体参考GzipFilterProperties。
在Spring Boot应用中,任何Spring @RestController默认应该渲染为JSON响应,只要classpath下存在Jackson2。例如:
@RestController public class MyController { @RequestMapping("/thing") public MyThing thing() { return new MyThing(); } }
只要MyThing可以经过Jackson2序列化(好比,一个标准的POJO或Groovy对象),localhost:8080/thing默认响应一个JSON表示。有时在一个浏览器中你可能看到XML响应由于浏览器倾向于发送XML 响应头。
若是classpath下存在Jackson XML扩展(jackson-dataformat-xml),它会被用来渲染XML响应,示例和JSON的很是类似。想要使用它,只需为你的项目添加如下的依赖:
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> </dependency>
你可能也想添加对Woodstox的依赖。它比JDK提供的默认Stax实现快不少,而且支持良好的格式化输出,提升了namespace处理能力:
<dependency> <groupId>org.codehaus.woodstox</groupId> <artifactId>woodstox-core-asl</artifactId> </dependency>
若是Jackson的XML扩展不可用,Spring Boot将使用JAXB(JDK默认提供),不过你须要为MyThing添加额外的注解@XmlRootElement:
@XmlRootElement public class MyThing { private String name; // .. getters and setters }
想要服务器渲染XML而不是JSON,你可能须要发送一个Accept: text/xml头部(或使用浏览器)。
在一个HTTP交互中,Spring MVC(客户端和服务端)使用HttpMessageConverters协商内容转换。若是classpath下存在Jackson,你就已经获取到Jackson2ObjectMapperBuilder提供的默认转换器。
建立的ObjectMapper(或用于Jackson XML转换的XmlMapper)实例默认有如下自定义属性:
Spring Boot也有一些简化自定义该行为的特性。
你能够使用当前的environment配置ObjectMapper和XmlMapper实例。Jackson提供一个扩展套件,能够用来简单的关闭或开启一些特性,你能够用它们配置Jackson处理的不一样方面。这些特性在Jackson中使用5个枚举进行描述的,并被映射到environment的属性上:
Jackson枚举 | Environment属性 | |
---|---|---|
com.fasterxml.jackson.databind.DeserializationFeature | `spring.jackson.deserialization.=true | false` |
com.fasterxml.jackson.core.JsonGenerator.Feature | `spring.jackson.generator.=true | false` |
com.fasterxml.jackson.databind.MapperFeature | `spring.jackson.mapper.=true | false` |
com.fasterxml.jackson.core.JsonParser.Feature | `spring.jackson.parser.=true | false` |
com.fasterxml.jackson.databind.SerializationFeature | `spring.jackson.serialization.=true | false` |
例如,设置spring.jackson.serialization.indent_output=true能够开启漂亮打印。注意,因为松绑定的使用,indent_output没必要匹配对应的枚举常量INDENT_OUTPUT。
若是想完全替换默认的ObjectMapper,你须要定义一个该类型的@Bean并将它标记为@Primary。
定义一个Jackson2ObjectMapperBuilder类型的@Bean将容许你自定义默认的ObjectMapper和XmlMapper(分别用于MappingJackson2HttpMessageConverter和MappingJackson2XmlHttpMessageConverter)。
另外一种自定义Jackson的方法是向你的上下文添加com.fasterxml.jackson.databind.Module类型的beans。它们会被注册入每一个ObjectMapper类型的bean,当为你的应用添加新特性时,这就提供了一种全局机制来贡献自定义模块。
最后,若是你提供任何MappingJackson2HttpMessageConverter类型的@Beans,那它们将替换MVC配置中的默认值。同时,也提供一个HttpMessageConverters类型的bean,它有一些有用的方法能够获取默认的和用户加强的message转换器。
想要获取更多细节可查看Section 65.4, “Customize the @ResponseBody rendering”和WebMvcAutoConfiguration源码。
Spring使用HttpMessageConverters渲染@ResponseBody(或来自@RestController的响应)。你能够经过在Spring Boot上下文中添加该类型的beans来贡献其余的转换器。若是你添加的bean类型默认已经包含了(像用于JSON转换的MappingJackson2HttpMessageConverter),那它将替换默认的。Spring Boot提供一个方便的HttpMessageConverters类型的bean,它有一些有用的方法能够访问默认的和用户加强的message转换器(有用,好比你想要手动将它们注入到一个自定义的RestTemplate)。
在一般的MVC用例中,任何你提供的WebMvcConfigurerAdapter beans经过覆盖configureMessageConverters方法也能贡献转换器,但不一样于一般的MVC,你能够只提供你须要的转换器(由于Spring Boot使用相同的机制来贡献它默认的转换器)。最终,若是你经过提供本身的@EnableWebMvc注解覆盖Spring Boot默认的MVC配置,那你就能够彻底控制,并使用来自WebMvcConfigurationSupport的getMessageConverters手动作任何事。
具体参考WebMvcAutoConfiguration源码。
Spring Boot采用Servlet 3 javax.servlet.http.Part API来支持文件上传。默认状况下,Spring Boot配置Spring MVC在单个请求中每一个文件最大1Mb,最多10Mb的文件数据。你能够覆盖那些值,也能够设置临时文件存储的位置(好比,存储到的/ tmp文件夹下)及传递数据刷新到磁盘的阀值(经过使用MultipartProperties类暴露的属性)。若是你须要设置文件不受限制,例如,能够设置multipart.maxFileSize属性值为-1。
当你想要接收部分(multipart)编码文件数据做为Spring MVC控制器(控制器)处理方法中被@RequestParam注解的MultipartFile类型的参数时,multipart支持就很是有用了。
具体参考MultipartAutoConfiguration源码。
Spring Boot想要服务来自应用程序root /下的全部内容。若是你想将本身的servlet映射到该目录下也是能够的,但固然你可能失去一些Boot MVC特性。为了添加你本身的servlet,并将它映射到根资源,你只需声明一个Servlet的类型的@Bean,并给它特定的豆名称的DispatcherServlet(若是只想关闭但不替换它,你能够使用该名称建立不一样类型的豆)。
彻底控制MVC配置的最简单方式是提供你本身的被@EnableWebMvc注解的@Configuration。这样全部的MVC配置都逃不出你的掌心。
ViewResolver是Spring MVC的核心组件,它负责转换@Controller中的视图名称到实际的View实现。注意ViewResolvers主要用在UI应用中,而不是REST风格的服务(查看不是用来渲染@ResponseBody的).Spring有不少你能够选择的ViewResolver实现,而且Spring本身对如何选择相应实现也没发表意见。另外一方面,Spring Boot会根据类路径上的依赖和应用上下文为你安装一或两个ViewResolver实现.DispatcherServlet使用全部在应用上下文中找到的解析器(解析器),并依次尝试每个直到它获取到结果,因此若是你正在添加本身的解析器,那就要当心顺序和你的解析器添加的位置。
WebMvcAutoConfiguration将会为你的上下文添加如下ViewResolvers:
具体参考:WebMvcAutoConfiguration,ThymeleafAutoConfiguration,FreeMarkerAutoConfiguration,GroovyTemplateAutoConfiguration,VelocityAutoConfiguration。
Spring Boot除了commons-logging API外没有其余强制性的日志依赖,你有不少可选的日志实现。想要使用Logback,你须要包含它,及一些对classpath下commons-logging的绑定。最简单的方式是经过依赖spring-boot-starter-logging的starter pom。对于一个web应用程序,你只需添加spring-boot-starter-web依赖,由于它依赖于logging starter。例如,使用Maven:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
Spring Boot有一个LoggingSystem抽象,用于尝试经过classpath上下文配置日志系统。若是Logback可用,则首选它。若是你惟一须要作的就是设置不一样日志的级别,那能够经过在application.properties中使用logging.level前缀实现,好比:
logging.level.org.springframework.web: DEBUG logging.level.org.hibernate: ERROR
你也能够使用logging.file
设置日志文件的位置(除控制台以外,默认会输出到控制台)。
想要对日志系统进行更细粒度的配置,你须要使用正在说的LoggingSystem支持的原生配置格式。默认状况下,Spring Boot从系统的默认位置加载原生配置(好比对于Logback为classpath:logback.xml),但你能够使用logging.config
属性设置配置文件的位置。
若是你将一个logback.xml放到classpath根目录下,那它将会被从这加载。Spring Boot提供一个默认的基本配置,若是你只是设置日志级别,那你能够包含它,好比:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <include resource="org/springframework/boot/logging/logback/base.xml"/> <logger name="org.springframework.web" level="DEBUG"/> </configuration>
若是查看spring-boot jar包中的默认logback.xml,你将会看到LoggingSystem为你建立的不少有用的系统属性,好比:
Spring Boot也提供使用自定义的Logback转换器在控制台上输出一些漂亮的彩色ANSI日志信息(不是日志文件)。具体参考默认的base.xml配置。
若是Groovy的类路径在下,你也能够使用logback.groovy配置的logback。
Spring Boot也支持Log4j或Log4j 2做为日志配置,但只有在它们中的某个在classpath下存在的状况。若是你正在使用starter poms进行依赖装配,这意味着你须要排除Logback,而后包含你选择的Log4j版本。若是你不使用starter poms,那除了你选择的Log4j版本外还要提供commons-logging(至少)。
最简单的方式可能就是经过starter poms,尽管它须要排除一些依赖,好比,在Maven中:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j</artifactId> </dependency>
想要使用Log4j 2,只须要依赖spring-boot-starter-log4j2而不是spring-boot-starter-log4j。
注:使用Log4j各版本的starters都会收集好依赖以知足common logging的要求(好比,Tomcat中使用java.util.logging,但使用Log4j或Log4j 2做为输出)。具体查看Actuator Log4j或Log4j 2的示例,了解如何将它用于实战。
除了它的默认XML配置格式,Log4j 2也支持YAML和JSON配置文件。想要使用其余配置文件格式来配置Log4j 2,你须要添加合适的依赖到classpath。为了使用YAML,你须要添加com.fasterxml。 jackson.dataformat:jackson-dataformat-yaml依赖,Log4j 2将查找名称为log4j2.yaml或log4j2.yml的配置文件。为了使用JSON,你须要添加com.fasterxml.jackson.core:jackson-databind依赖,Log4j 2将查找名称为log4j2.json或log4j2.jsn的配置文件
想要覆盖默认的设置只须要定义一个你本身的DataSource类型的@ Bean.Spring Boot提供一个工具构建类DataSourceBuilder,可用来建立一个标准的DataSource(若是它处于classpath下),或者仅建立你本身的DataSource ,而后将它和在第23.7.1节,“第三方配置”解释的一系列环境属性绑定。
好比:
@Bean @ConfigurationProperties(prefix="datasource.mine") public DataSource dataSource() { return new FancyDataSource(); } datasource.mine.jdbcUrl=jdbc:h2:mem:mydb datasource.mine.user=sa datasource.mine.poolSize=30
具体参考'Spring Boot特性'章节中的·第28.1节“配置数据源”·和DataSourceAutoConfiguration类源码。
建立多个数据源和建立第一个工做都是同样的。若是使用针对JDBC或JPA的默认自动配置,你可能想要将其中一个设置为@Primary(而后它就能被任何@Autowired注入获取) 。
@Bean @Primary @ConfigurationProperties(prefix="datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix="datasource.secondary") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); }
Spring Data能够为你的@Repository接口建立各类风格的实现.Spring Boot会为你处理全部事情,只要那些@Repositories接口跟你的@EnableAutoConfiguration类处于相同的包(或子包)。
对于不少应用来讲,你须要作的就是将正确的Spring Data依赖添加到classpath下(对于JPA有一个spring-boot-starter-data-jpa,对于Mongodb有一个spring-boot-starter-data-mongodb) ,建立一些知识库接口来处理@Entity对象。具体参考JPA样本或Mongodb样本。
Spring Boot会基于它找到的@EnableAutoConfiguration来尝试猜想你的@Repository定义的位置。想要获取更多控制,能够使用@EnableJpaRepositories注解(来自Spring Data JPA)。
Spring Boot会基于它找到的@EnableAutoConfiguration来尝试猜想你的@Entity定义的位置。想要获取更多控制,你能够使用@EntityScan注解,好比:
@Configuration @EnableAutoConfiguration @EntityScan(basePackageClasses=City.class) public class Application { //... }
Spring Data JPA已经提供了一些独立的配置选项(好比,针对SQL日志),而且Spring Boot会暴露它们,针对hibernate的外部配置属性也更多些。最多见的选项以下:
spring.jpa.hibernate.ddl-auto: create-drop spring.jpa.hibernate.naming_strategy: org.hibernate.cfg.ImprovedNamingStrategy spring.jpa.database: H2 spring.jpa.show-sql: true
(因为宽松的数据绑定策略,连字符或下划线做为属性键做用应该是等效的)DDL-自动配置是个特殊状况,它有不一样的默认设置,这取决于你是否使用一个内嵌数据库(建立-drop)。当本地的EntityManagerFactory被建立时,全部spring.jpa.properties。*属性都被做为正常的JPA属性(去掉前缀)传递进去了。
具体参考HibernateJpaAutoConfiguration和JpaBaseConfiguration。
为了彻底控制EntityManagerFactory的配置,你须要添加一个名为entityManagerFactory的@ Bean.Spring Boot自动配置会根据是否存在该类型的bean来关闭它的实体管理器(实体经理)。
即便默认的EntityManagerFactory工做的很好,你也须要定义一个新的EntityManagerFactory,由于一旦出现第二个该类型的bean,默认的将会被关闭。为了轻松的实现该操做,你能够使用Spring Boot提供的EntityManagerBuilder,或者若是你喜欢的话能够直接使用来自Spring ORM的LocalContainerEntityManagerFactoryBean。
示例:
// add two data sources configured as above @Bean public LocalContainerEntityManagerFactoryBean customerEntityManagerFactory( EntityManagerFactoryBuilder builder) { return builder .dataSource(customerDataSource()) .packages(Customer.class) .persistenceUnit("customers") .build(); } @Bean public LocalContainerEntityManagerFactoryBean orderEntityManagerFactory( EntityManagerFactoryBuilder builder) { return builder .dataSource(orderDataSource()) .packages(Order.class) .persistenceUnit("orders") .build(); }
上面的配置靠本身基本能够运行。想要完成做品你也须要为两个EntityManagers配置TransactionManagers。其中的一个会被Spring Boot默认的JpaTransactionManager获取,若是你将它标记为@Primary。另外一个须要显式注入到一个新实例。或你能够使用一个JTA事物管理器生成它两个。
Spring不要求使用XML配置JPA提供者(provider),而且Spring Boot假定你想要充分利用该特性。若是你倾向于使用persistence.xml,那你须要定义你本身的id为'entityManagerFactory'的LocalEntityManagerFactoryBean类型的@Bean,并在那设置持久化单元的名称。
默认设置可查看JpaBaseConfiguration
Spring Data JPA和Spring Data Mongo都能自动为你建立Repository实现。若是它们同时出如今classpath下,你可能须要添加额外的配置来告诉Spring Boot你想要哪一个(或两个)为你建立仓库。最明确地方式是使用标准的Spring Data @Enable* Repositories,而后告诉它你的Repository接口的位置(此处*便可以是Jpa,也能够是Mongo,或者二者都是)。
这里也有spring.data.*.repositories.enabled标志,可用来在外部配置中开启或关闭仓库的自动配置。这在你想关闭Mongo仓库,但仍旧使用自动配置的MongoTemplate时很是有用。
相同的障碍和特性也存在于其余自动配置的Spring Data仓库类型(Elasticsearch, Solr)。只须要改变对应注解的名称和标志。
Spring Data REST可以将Repository的实现暴露为REST端点,只要该应用启用Spring MVC。
Spring Boot暴露一系列来自spring.data.rest命名空间的有用属性来定制化RepositoryRestConfiguration。若是须要提供其余定制,你能够建立一个继承自SpringBootRepositoryRestMvcConfiguration的@Configuration类。该类功能和RepositoryRestMvcConfiguration相同,但容许你继续使用spring.data.rest。*属性。
一个数据库能够使用不一样的方式进行初始化,这取决于你的技术栈。或者你能够手动完成该任务,只要数据库是单独的过程。
。JPA有个生成DDL的特性,这些能够设置为在数据库启动时运行这能够经过两个外部属性进行控制:
你能够显式设置spring.jpa.hibernate.ddl-auto,标准的Hibernate属性值有无,验证,更新,建立,建立-drop.Spring Boot根据你的数据库是否为内嵌数据库来选择相应的默认值,若是是内嵌型的则默认值为建立降,不然为无。经过查看链接类型能够检查是否为内嵌型数据库,HSQLDB,H2和德比是内嵌的,其余都不是。当从内存数据库迁移到一个真正的数据库时,你须要小心,在新的平台中不能对数据库表和数据是否存在进行臆断。你也须要显式设置DDL-汽车,或使用其余机制初始化数据库。
此外,启动时处于类路径根目录下的import.sql文件会被执行。这在演示或测试时颇有用,但在生产环境中你可能不指望这样。这是休眠的特性,和春天没有一点关系。
Spring JDBC有一个DataSource初始化特性.Spring Boot默认启用了该特性,并从标准的位置schema.sql和data.sql(位于classpath根目录)加载SQL。此外,Spring Boot将加载模式 - $ {platform}。 sql和data - $ {platform} .sql文件(若是存在),在这里platform is spring.datasource.platform的值,好比,你能够将它设置为数据库的供应商名称(hsqldb,h2,oracle,mysql, postgresql等).Spring Boot默认启用Spring JDBC初始化快速失败特性,因此若是脚本致使异常产生,那应用程序将启动失败。脚本的位置能够经过设置spring.datasource.schema和spring.datasource.data来改变,若是设置spring.datasource.initialize =假则哪一个位置都不会被处理。
你能够设置spring.datasource.continueOnError =真禁用快速失败特性一旦应用程序成熟并被部署了不少次,那该设置就颇有用,由于脚本能够充当 “可怜人的迁移。” - 例如,插入失败时意味着数据已经存在,也就不必阻止应用继续运行。
若是你想要在一个JPA应用中使用schema.sql文件,那若是休眠试图建立相同的表,DDL-AUTO =创造降将致使错误产生。为了不那些错误,能够将DDL-自动设置为“”(推荐)或“无”。无论是否使用DDL-AUTO =创造降,你总能够使用data.sql初始化新数据。
若是你正在使用Spring Batch,那么它会为大多数的流行数据库平台预装SQL初始化脚本.Spring Boot会检测你的数据库类型,并默认执行那些脚本,在这种状况下将关闭快速失败特性(错误被记录但不会阻止应用启动)。这是由于那些脚本是可信任的,一般不会包含错误,因此错误会被忽略掉,而且对错误的忽略可让脚本具备幂等性。你能够使用弹簧.batch.initializer.enabled =假显式关闭初始化功能。
Spring Boot跟踪高级别的数据迁移工具Flyway(基于SQL)和Liquibase(XML)工做的很好。一般咱们倾向于Flyway,由于它一眼看去好像很容易,另外它一般不须要平台独立:通常一个或至多须要两个平台。
想要在启动时自动运行迁飞数据库迁移,须要将org.flywaydb:飞行用核心添加到你的类路径下。
迁移是一些V<VERSION>__<NAME>.sql格式的脚本(<VERSION>是一个下划线分割的版本号,好比'1'或'2_1')。默认状况下,它们存放在一个classpath:db/migration的文件夹中,但你能够使用flyway.locations(一个列表)来改变它。详情可参考flyway-core中的Flyway类,查看一些可用的配置,好比schemas。Spring Boot在FlywayProperties中提供了一个小的属性集,可用于禁止迁移,或关闭位置检测。
默认状况下,Flyway将自动注入(@Primary)DataSource到你的上下文,并用它进行数据迁移。若是你想使用一个不一样的DataSource,你能够建立一个,并将它标记为@FlywayDataSource的@Bean-若是你这样作了,且想要两个数据源,记得建立另外一个并将它标记为@Primary。或者你能够经过在外部配置文件中设置flyway.[url,user,password]来使用Flyway的原生DataSource。
这是一个Flyway示例,你能够做为参考。
想要在启动时自动运行Liquibase数据库迁移,你须要将org.liquibase:liquibase-core添加到classpath下。
主改变日志(master change log)默认从db/changelog/db.changelog-master.yaml读取,但你能够使用liquibase.change-log进行设置。详情查看LiquibaseProperties以获取可用设置,好比上下文,默认的schema等。
这里有个Liquibase示例可做为参考。
你能够在上下文的某个地方添加@EnableBatchProcessing来启用Spring Batch的自动配置功能。
默认状况下,在启动时它会执行应用的全部做业(Jobs),具体查看JobLauncherCommandLineRunner。你能够经过指定spring.batch.job.names(多个做业名以逗号分割)来缩小到一个特定的做业或多个做业。
若是应用上下文包含一个JobRegistry,那么处于spring.batch.job.names中的做业将会从registry中查找,而不是从上下文中自动装配。这是复杂系统中常见的一个模式,在这些系统中多个做业被定义在子上下文和注册中心。
具体参考BatchAutoConfiguration和@EnableBatchProcessing。
在一个单独的应用中,执行器的HTTP端口默认和主HTTP端口相同。想要让应用监听不一样的端口,你能够设置外部属性management.port。为了监听一个彻底不一样的网络地址(好比,你有一个用于管理的内部网络和一个用于用户应用程序的外部网络),你能够将management.address设置为一个可用的IP地址,而后将服务器绑定到该地址。
查看ManagementServerProperties源码和'Production-ready特性'章节中的Section 41.3, “Customizing the management server port”
来获取更多详情。
Spring Boot安装了一个'whitelabel'错误页面,若是你遇到一个服务器错误(机器客户端消费的是JSON,其余媒体类型则会看到一个具备正确错误码的合乎情理的响应),那就能在客户端浏览器中看到该页面。你能够设置error.whitelabel.enabled=false来关闭该功能,但一般你想要添加本身的错误页面来取代whitelabel。确切地说,如何实现取决于你使用的模板技术。例如,你正在使用Thymeleaf,你将添加一个error.html模板。若是你正在使用FreeMarker,那你将添加一个error.ftl模板。一般,你须要的只是一个名称为error的View,和/或一个处理/error路径的@Controller。除非你替换了一些默认配置,不然你将在你的ApplicationContext中找到一个BeanNameViewResolver,因此一个id为error的@Bean多是完成该操做的一个简单方式。详情参考ErrorMvcAutoConfiguration。
查看Error Handling章节,了解下如何将处理器(handlers)注册到servlet容器中。
无论你在应用的什么地方定义了一个使用@EnableWebSecurity注解的@Configuration,它将会关闭Spring Boot中的默认webapp安全设置。想要调整默认值,你能够尝试设置security.*属性(具体查看SecurityProperties和常见应用属性的SECURITY章节)。
若是你提供了一个AuthenticationManager类型的@Bean,那么默认的就不会被建立了,因此你能够得到Spring Security可用的所有特性(好比,不一样的认证选项)。
Spring Security也提供了一个方便的AuthenticationManagerBuilder,可用于构建具备常见选项的AuthenticationManager。在一个webapp中,推荐将它注入到WebSecurityConfigurerAdapter的一个void方法中,好比:
@Configuration public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("barry").password("password").roles("USER"); // ... etc. } // ... other stuff for application security }
若是把它放到一个内部类或一个单独的类中,你将获得最好的结果(也就是不跟不少其余@Beans混合在一块儿将容许你改变实例化的顺序)。secure web sample是一个有用的参考模板。
若是你遇到了实例化问题(好比,使用JDBC或JPA进行用户详细信息的存储),那将AuthenticationManagerBuilder回调提取到一个GlobalAuthenticationConfigurerAdapter(放到init()方法内以防其余地方也须要authentication manager)多是个不错的选择,好比:
@Configuration public class AuthenticationManagerConfiguration extends GlobalAuthenticationConfigurerAdapter { @Override public void init(AuthenticationManagerBuilder auth) { auth.inMemoryAuthentication() // ... etc. } }
对于任何应用来讲,确保全部的主端点(URL)都只在HTTPS下可用是个重要的苦差事。若是你使用Tomcat做为servlet容器,那Spring Boot若是发现一些环境设置的话,它将自动添加Tomcat本身的RemoteIpValve,你也能够依赖于HttpServletRequest来报告是否请求是安全的(即便代理服务器的downstream处理真实的SSL终端)。这个标准行为取决于某些请求头是否出现(x-forwarded-for和x-forwarded-proto),这些请求头的名称都是约定好的,因此对于大多数前端和代理都是有效的。
你能够向application.properties添加如下设置里开启该功能,好比:
server.tomcat.remote_ip_header=x-forwarded-for server.tomcat.protocol_header=x-forwarded-proto
(这些属性出现一个就会开启该功能,或者你能够经过添加一个TomcatEmbeddedServletContainerFactory bean本身添加RemoteIpValve)
Spring Security也能够配置成针对因此或某些请求须要一个安全渠道(channel)。想要在一个Spring Boot应用中开启它,你只需将application.properties中的security.require_ssl设置为true便可。
Spring Boot有不少用于热加载的选项。使用IDE开发是一个不错的方式,特别是须要调试的时候(全部的现代IDEs都容许从新加载静态资源,一般也支持对变动的Java类进行热交换) .Maven和摇篮插件也支持命令行下的静态文件热加载。若是你使用其余高级工具编写的CSS / JS,并使用外部的CSS / JS编译器,那你就能够充分利用该功能。
若是你正在使用Thymeleaf,那就将spring.thymeleaf.cache设置为假。查看ThymeleafAutoConfiguration能够获取其余Thymeleaf自定义选项。
若是你正在使用FreeMarker,那就将spring.freemarker.cache设置为false。查看FreeMarkerAutoConfiguration能够获取其余FreeMarker自定义选项。
若是你正在使用Groovy的模板,那就将spring.groovy.template.cache设置为假。查看GroovyTemplateAutoConfiguration能够获取其余Groovy的自定义选项。
若是你正在使用的速度,那就将spring.velocity.cache设置为假。查看VelocityAutoConfiguration能够获取其余速度自定义选项。
现代IDE(Eclipse,IDEA等)都支持字节码的热交换,因此若是你作了一个没有影响类或方法签名的改变,它会利索地从新加载并无任何影响。
Spring Loaded在这方面走的更远,它可以从新加载方法签名改变的类定义。若是对它进行一些自定义配置能够强制ApplicationContext刷新本身(但没有通用的机制来确保这对一个运行中的应用老是安全的,因此它可能只是一个开发时间的技巧)。
为了在Maven命令行下使用Spring Loaded,你只需将它做为一个依赖添加到Spring Boot插件声明中便可,好比:
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> <version>1.2.0.RELEASE</version> </dependency> </dependencies> </plugin>
正常状况下,这在Eclipse和IntelliJ中工做的至关漂亮,只要它们有相应的,和Maven默认一致的构建配置(Eclipse m2e对此支持的更好,开箱即用)。
若是想将Spring Loaded和Gradle,IntelliJ结合起来,那你须要付出代价。默认状况下,IntelliJ将类编译到一个跟Gradle不一样的位置,这会致使Spring Loaded监控失败。
为了正确配置IntelliJ,你能够使用想法Gradle插件:
buildscript {
repositories { jcenter() }
dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:1.3.0.BUILD-SNAPSHOT" classpath 'org.springframework:springloaded:1.2.0.RELEASE' } } apply plugin: 'idea' idea { module { inheritOutputDirs = false outputDir = file("$buildDir/classes/main/") } } // ...
注:的IntelliJ必须配置跟命令行摇篮任务相同的Java的版本,而且弹簧加载必须做为一个buildscript依赖被包含进去。
此外,你也能够启用Intellij内部的自动生成项目,这样无论何时只要文件被保存都会自动编译你的代码。
若是你使用的Maven进行一个直接或间接继承弹簧引导依赖性(好比弹簧引导起动机 - 亲本)的构建,并想覆盖一个特定的第三方依赖,那你能够添加合适的<属性>元素。浏览spring-boot-dependencies POM能够获取一个全面的属性列表。例如,想要选择一个不一样的slf4j版本,你能够添加如下内容:
<properties> <slf4j.version>1.7.5<slf4j.version> </properties>
注:这只在你的Maven的项目继承(直接或间接)自弹簧引导依赖性才有用若是你使用<范围>进口</范围>,将弹簧引导依赖性添加到本身的dependencyManagement片断,那你必须本身从新定义而不是神器覆盖属性。
注:每一个Spring Boot发布都是基于一些特定的第三方依赖集进行设计和测试的,覆盖版本可能致使兼容性问题。
spring-boot-maven-plugin可以用来建立可执行的'胖'JAR。若是你正在使用spring-boot-starter-parent POM,你能够简单地声明该插件,而后你的jar将被从新打包:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
若是没有使用父POM,你仍旧能够使用该插件。不过,你须要另外添加一个<executions>片断:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>1.3.0.BUILD-SNAPSHOT</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
查看插件文档电子杂志详细的用例。
若是你想将本身的项目以库jar的形式被其余项目依赖,而且须要它是一个可执行版本(例如demo),你须要使用略微不一样的方式来配置该构建。
对于Maven来讲,正常的JAR插件和Spring Boot插件都有一个'classifier',你能够添加它来建立另外的JAR。示例以下(使用Spring Boot Starter Parent管理插件版本,其余配置采用默认设置):
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <classifier>exec</classifier> </configuration> </plugin> </plugins> </build>
上述配置会产生两个jars,默认的一个和使用带有分类器'exec'的引导插件构建的可执行的一个。
对于摇篮用户来讲,步骤相似示例以下:
bootRepackage {
classifier = 'exec' }
在一个可执行罐子中,为了运行,多数内嵌的库不须要拆包(解压缩),然而有一些库可能会遇到问题。例如,JRuby的包含它本身的内嵌罐子,它假定JRuby的完整。罐子自己老是可以直接做为文件访问的。
为了处理任何有问题的库,你能够标记那些特定的内嵌罐,让它们在可执行的JAR第一次运行时自动解压到一个临时文件夹中。例如,为了将JRuby的标记为使用的Maven插件拆包,你须要添加以下的配置:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <requiresUnpack> <dependency> <groupId>org.jruby</groupId> <artifactId>jruby-complete</artifactId> </dependency> </requiresUnpack> </configuration> </plugin> </plugins> </build>
使用摇篮彻底上述操做:
springBoot {
requiresUnpack = ['org.jruby:jruby-complete'] }
想要为使用Maven启动的Spring Boot应用添加一个远程调试器,你能够使用mave插件的jvmArguments属性。详情参考示例。
想要为使用Gradle启动的Spring Boot应用添加一个远程调试器,你能够使用build.gradle的applicationDefaultJvmArgs属性或--debug-jvm命令行选项。
build.gradle:
applicationDefaultJvmArgs = [
"-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005" ]
命令行:
$ gradle run --debug-jvm
详情查看摇篮应用插件。
想要使用的Ant进行构建,你须要抓取依赖,编译,而后像一般那样建立一个罐子或战争存档为了让它能够执行:
示例:
<target name =“build”depends =“compile”>
<copy todir =“target / classes / lib”>
<fileset dir =“lib / runtime”/>
</ copy>
<jar destfile =“target / spring -boot-sample-actuator - $ {spring-boot.version} .jar“compress =”false“>
<fileset dir =”target / classes“/>
<fileset dir =”src / main / resources“/>
<zipfileset src =“lib / loader / spring-boot-loader-jar - $ {spring-boot.version} .jar”/>
<manifest>
<attribute name =“Main-Class”value =“org.springframework.boot.loader .JarLauncher“/>
<attribute name =”Start-Class“value =”$ {start-class}“/>
</ manifest>
</ jar>
</ target>
该Actuator示例中有一个build.xml文件,能够使用如下命令来运行:
$ ant -lib /ivy-2.2.jar
在上述操做以后,你能够使用如下命令运行该应用:
$ java -jar target/*.jar
若是想在Java6环境中使用Spring Boot,你须要改变一些配置。具体的变化取决于你应用的功能。
若是你在使用Boot的内嵌Servlet容器,你须要使用一个兼容Java6的容器.Tomcat 7和Jetty 8都是Java 6兼容的。具体参考第63.15节“使用Tomcat 7”和第63.16节“使用Jetty 8 “。
Java事务API自身并不要求Java 7,而是官方的API jar包含的已构建类要求Java 7.若是你正在使用JTA,那么你须要使用可以在Java 6工做的构建版本替换官方的JTA 1.2 API jar 。为了完成该操做,你须要排除任何对javax.transaction的:javax.transaction的-API的传递依赖,并使用org.jboss.spec.javax.transaction:JBoss的事务,api_1.2_spec:1.0.0.Final依赖替换它们。
产生一个可部署war包的第一步是提供一个SpringBootServletInitializer子类,并覆盖它的配置方法。这充分利用了Spring框架对Servlet 3.0的支持,并容许你在应用经过servlet容器启动时配置它。 ,你只需把应用的主类改成继承SpringBootServletInitializer便可:
@SpringBootApplication public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { return application.sources(Application.class); } public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); } }
下一步是更新你的构建配置,这样你的项目将产生一个战争包而不是JAR包。若是你使用的是Maven,并使用弹簧引导启动父(为了配置的Maven的战争插件),全部你须要作的就是更改的pom.xml的包装为战争:
<packaging>war</packaging>
若是你使用摇篮,你须要修改的build.gradle来将战争插件应用到项目上:
apply plugin: 'war'
该过程最后的一步是确保内嵌的servlet的容器不能干扰战包将部署的servlet的容器。为了达到这个目的,你须要将内嵌容器的依赖标记为提供。
若是使用Maven的:
<dependencies>
<!-- … --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency> <!-- … --> </dependencies> 若是使用Gradle: dependencies { // … providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' // … }
若是你使用Spring Boot构建工具,将内嵌容器依赖标记为提供将生产一个可执行war包,在lib-provided目录有该war包的提供依赖。这意味着,除了部署到servlet容器,你还能够经过使用命令行java -jar命令来运行应用。
注:查看Spring Boot基于以上配置的一个Maven示例应用。
老的Servlet容器不支持在Servlet 3.0中使用的ServletContextInitializer启动处理。你仍旧能够在这些容器使用Spring和Spring Boot,但你须要为应用添加一个web.xml,并将它配置为经过一个DispatcherServlet加载一个ApplicationContext 。
对于一个非web项目,转换为Spring Boot应用很容易(抛弃建立ApplicationContext的代码,取而代之的是调用SpringApplication或SpringApplicationBuilder).Spring MVC web应用一般先建立一个可部署的war应用,而后将它迁移为一个可执行的战争或罐子。建议阅读将罐子转换成战争的入门指南..
经过继承SpringBootServletInitializer建立一个可执行war(好比,在一个名为Application的类中),而后添加Spring Boot的@EnableAutoConfiguration注解。示例:
@Configuration @EnableAutoConfiguration @ComponentScan public class Application extends SpringBootServletInitializer { @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { // Customize the application or call application.sources(...) to add sources // Since our example is itself a @Configuration class we actually don't // need to override this method. return application; } }
记住无论你往源放什么东西,它仅是一个Spring ApplicationContext,正常状况下,任何生效的在这里也会起做用。有一些豆你能够先移除,而后让Spring Boot提供它的默认实现,不过有可能须要先完成一些事情。
静态资源能够移到classpath根目录下的/ public(或/ static,/ resources,/ META-INF / resources)。一样的方式也适合于messages.properties(Spring Boot在classpath根目录下自动发现这些配置) 。
美妙的(Vanilla用法)Spring DispatcherServlet和Spring Security不须要改变。若是你的应用有其余特性,好比使用其余servlets或过滤器,那你可能须要添加一些配置到你的应用程序上下文中,按如下操做替换web .XML的那些元素:
一旦战争能够使用,咱们就经过添加一个主要方法到应用来让它能够执行,好比:
public static void main(String[] args) { SpringApplication.run(Application.class, args); }
应用能够划分为多个类别:
全部这些均可以进行适当的转化,但每一个可能须要稍微不一样的技巧。
Servlet 3.0+的应用转化的至关简单,若是它们已经使用Spring Servlet 3.0+初始化器辅助类。一般全部来自一个存在的WebApplicationInitializer的代码能够移到一个SpringBootServletInitializer中。若是一个存在的应用有多个ApplicationContext(好比,若是它使用AbstractDispatcherServletInitializer),那你能够将全部上下文源放进一个单一的SpringApplication。你遇到的主要难题多是若是那样不能工做,那你就要维护上下文层次。参考示例构建层次结构的条目。一个存在的包含网页相关特性的父上下文一般须要分解,这样全部的ServletContextAware组件都处于子上下文中。
对于还不是Spring应用的应用来讲,上面的指南有助于你把应用转换为一个Spring Boot应用,但你也能够选择其余方式。
想要将Spring Boot应用部署到Weblogic,你须要确保你的servlet初始化器直接实现WebApplicationInitializer(即便你继承的基类已经实现了它)。
一个传统的Weblogic的初始化器可能以下所示:
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.web.SpringBootServletInitializer; import org.springframework.web.WebApplicationInitializer; @SpringBootApplication public class MyApplication extends SpringBootServletInitializer implements WebApplicationInitializer { }
若是使用的logback,你须要告诉的Weblogic你倾向使用的打包版本而不是服务器预装的版本你能够经过添加一个具备以下内容的WEB-INF / weblogic.xml中实现该操做:
<?xml version="1.0" encoding="UTF-8"?> <wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.4/weblogic-web-app.xsd"> <wls:container-descriptor> <wls:prefer-application-packages> <wls:package-name>org.slf4j</wls:package-name> </wls:prefer-application-packages> </wls:container-descriptor> </wls:weblogic-web-app>
转载自:https://www.gitbook.com/book/qbgbook/spring-boot-reference-guide-zh/details