本节将详细介绍如何使用Spring Boot。 它涵盖了诸如构建系统,自动配置以及如何运行应用程序等主题。 我们还介绍了一些Spring Boot的最佳做法。 虽然Spring Boot没有什么特别的特点(它只是另一个可以消耗的lib),但是有一些建议可以让您的开发过程更容易一些。

构建系统

构建典型的系统,在另一篇 spring boot 快速入门中有maven 和 gradle 配置方式。

典型的pom.xml里有这个parent里加了org.springframework.boot,如果pom.xml已经有其它的parent,这里也有不用继承,也能配置maven的方式。

parent 是 maven 的一个元素,可以继承pom.xml中依赖,不用重复配置pom。

spring boot 不使用 parent 来继承依赖

如果您不想使用spring-boot-starter-parent,则仍然可以通过使用scope = import依赖关系来保持依赖关系管理(但不是插件管理)的好处:

1
2
3
4
5
6
7
8
9
10
11
12
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.7.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

有parent元素用了spring boot 时 覆盖单挑依赖直接后面加就行。 但是现在,要实现相同的结果,您需要在spring-boot-dependencies条目之前在项目的dependencyManagement中添加一个条目。 例如,要升级到另一个Spring Data发行列车,您需要将以下内容添加到pom.xml中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<dependencyManagement>
<dependencies>
<!-- Override Spring Data release train provided by Spring Boot -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-releasetrain</artifactId>
<version>Fowler-SR2</version>
<scope>import</scope>
<type>pom</type>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.7.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

除了maven 和 gradle 外 , 官方还有ant 构建系统的例子,ant 构建spring boot 详情

spring boot Starters

starters是一组方便的依赖关系描述符,可以包含在应用程序中。 您可以获得所需的所有Spring和相关技术的一站式服务,而无需通过示例代码搜索和复制粘贴相关性描述符的负载。 例如,如果要开始使用Spring和JPA进行数据库访问,那么只需在项目中包含spring-boot-starter-data-jpa依赖项,就可以了。

starters包含许多依赖关系,您需要使项目快速启动并运行,并具有一致的受支持的托管传输依赖关系。

Spring Boot在org.springframework.boot组下提供了以下应用程序starters,是时候展现spring的强大之处了:

  • spring-boot-starter
  • spring-boot-starter-activemq
  • spring-boot-starter-amqp
  • spring-boot-starter-aop
  • spring-boot-starter-artemis
  • spring-boot-starter-batch
  • spring-boot-starter-cache
  • spring-boot-starter-cloud-connectors
  • spring-boot-starter-data-cassandra
  • spring-boot-starter-data-couchbase
  • spring-boot-starter-data-elasticsearch
  • spring-boot-starter-data-gemfire
  • spring-boot-starter-data-jpa
  • spring-boot-starter-data-ldap
  • spring-boot-starter-data-mongodb
  • spring-boot-starter-data-neo4j
  • spring-boot-starter-data-redis
  • spring-boot-starter-data-rest
  • spring-boot-starter-data-solr
  • spring-boot-starter-freemarker
  • spring-boot-starter-groovy-templates
  • spring-boot-starter-hateoas
  • spring-boot-starter-integration
  • spring-boot-starter-jdbc
  • spring-boot-starter-jersey
  • spring-boot-starter-jooq
  • spring-boot-starter-jta-atomikos
  • spring-boot-starter-jta-bitronix
  • spring-boot-starter-jta-narayana
  • spring-boot-starter-mail
  • spring-boot-starter-mobile
  • spring-boot-starter-mustache
  • spring-boot-starter-security
  • spring-boot-starter-social-facebook
  • spring-boot-starter-social-linkedin
  • spring-boot-starter-social-twitter
  • spring-boot-starter-test
  • spring-boot-starter-thymeleaf
  • spring-boot-starter-validation
  • spring-boot-starter-web
  • spring-boot-starter-web-services
  • spring-boot-starter-websocket
  • spring-boot-starter-actuator
  • spring-boot-starter-remote-shell
  • spring-boot-starter-jetty
  • spring-boot-starter-log4j2
  • spring-boot-starter-logging
  • spring-boot-starter-tomcat
  • spring-boot-starter-undertow

获取这些starters的pom.xml 依赖配置地址获取pom.xml依赖项

编写良好的代码

编写良好的代码,避免一些低级的坑。

使用”default“包

当类不包括包声明时,它被认为是在“默认包”中。 官方不推荐使用“默认包”,应该避免使用。 对于使用@ComponentScan,@EntityScan或@SpringBootApplication注释的Spring Boot应用程序,可能会导致特殊的问题,因为每个jar的每个类都将被读取。

应用程序主类

我们通常建议您将主应用程序类定位到其他类之上的根包中。 @EnableAutoConfiguration注释通常放置在您的主类上,并且它隐式定义了某些项目的基本“搜索包”。 例如,如果您正在编写JPA应用程序,则@EnableAutoConfiguration注释类的包将用于搜索@Entity项。 使用根包也可以使用@ComponentScan注释,而不需要指定basePackage属性。 如果主类位于根包中,也可以使用@SpringBootApplication注释。

良好的布局:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
com
+- example
+- myproject
+- Application.java
|
+- domain
| +- Customer.java
| +- CustomerRepository.java
|
+- service
| +- CustomerService.java
|
+- web
+- CustomerController.java

Application.java文件将声明main方法以及基本的@Configuration。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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类。 通常,定义main方法的类也是一个很好的候选者,作为主要的@Configuration。

导入其他配置类

您不需要将所有的@Configuration放在一个类中。 @Import注释可用于导入其他配置类。 或者,您可以使用@ComponentScan自动拾取所有Spring组件,包括@Configuration类。

导入xml 配置

如果您绝对必须使用基于XML的配置,我们建议您仍然从@Configuration类开始。 然后可以使用额外的@ImportResource注释来加载XML配置文件。

auto-configuration

Spring Boot自动配置尝试根据您添加的jar依赖关系自动配置您的Spring应用程序。 例如,如果HSQLDB在您的类路径上,并且您没有手动配置任何数据库连接bean,那么我们将自动配置内存数据库。

您需要通过将@EnableAutoConfiguration或@SpringBootApplication注释添加到您的一个@Configuration类中来选择自动配置。

替换auto-configuration

自动配置是无创的,您可以随时开始定义自己的配置来替换自动配置的特定部分。 例如,如果添加自己的DataSource bean,则默认的嵌入式数据库支持将会退回。 如果您需要了解当前正在应用的自动配置,以及为什么要使用–debug开关启动应用程序。 这将启用调试日志以选择核心日志记录器,并将自动配置报告记录到控制台。

取消特殊auto-configuration

如果有特殊配置不想使用,可以用@EnableAutoConfiguration来取消。

1
2
3
4
5
6
7
8
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 和 依赖注入

您可以自由使用任何标准的Spring Framework技术来定义您的bean及其注入的依赖关系。 为了简单起见,我们经常发现使用@ComponentScan找到你的bean,结合@Autowired构造函数注入效果很好。 如果您按照上述建议(将应用程序类定位在根包中)构建代码,则可以添加@ComponentScan而不使用任何参数。 所有应用程序组件(@Component,@Service,@Repository,@Controller等)将自动注册为Spring Bean。

这是一个使用构造函数注入获取所需的RiskAssessor bean的@Service Bean的例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

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;
}

// ...
}

使用@SpringBootApplication注解

使用@SpringBootApplication 注解跟使用@Configuration, @EnableAutoConfiguration 和 @ComponentScan 三个效果是一样的。

1
2
3
4
5
6
7
8
9
10
11
12
13
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);
}
}

完结。