Spring Boot--快速构建Spring应用
更新日期:
近年来,Spring框架发展的非常迅速,作为目前非常流行的一个Java应用开发框架,Spring所包含的子项目是非常之多的,这些项目包含各方各面,虽然Spring框架对于开发者来说已经很大程度上简化了他们的工作,但是在各个Spring子项目之间进行集成,以及和其他框架之间集成,并要快速搭建一个可以运行的应用还是比较困难的。Spring Boot项目的目的就在于可以快速的创建可以选择的Spring应用。帮助开发者更简单的使用Spring框架,开发者不在需要将时间浪费在搭建环境上,也不必为繁琐的XML配置文件所困扰了。Spring Boot可以自动配置Spring的各个组件。Spring Boot的诞生大大地提升了使用Spring框架的开发效率。
Spring Boot简介
Spring Boot项目名称非常的形象,boot的意思是启动。顾名思义,Spring Boot 的作用在于创建和启动新的基于 Spring 框架的项目。它的目的是帮助开发人员很容易的创建出独立运行和产品级别的基于 Spring 框架的应用。虽然Spring Boot是Spring的一个子项目,但是,Spring Boot的目标不在于为已解决的问题域提供新的解决方案,而是为平台带来另一种开发体验,Spring Boot 会选择最适合的 Spring 子项目和第三方开源库进行整合。大部分 Spring Boot 应用只需要非常少的配置就可以快速运行起来。对于已经熟悉Spring生态系统的开发人员来说,Boot是一个很理想的选择;对于采用Spring技术的新人来说,Boot提供一种更简洁的方式来使用这些技术。
使用Spring Boot
Spring Boot在刚发布的时候, Boot描述了如何使用该框架在140个字符内实现可运行的web应用,它目前成为了最流行的一个应用样例。它的描述如下程序清单1所示,一个非常简单的Groovy文件可以生成功能强大的以Spring为后端的web应用。
程序清单1
@RestController
class App {
@RequestMapping("/")
String home() {
"hello"
}
}
这个应用可以简单地从一个shell中运行它,通过spring run App.groovy命令在Spring Boot CLI中运行。当你首次运行时可能会花费一点时间,这是因为需要下载依赖包。但是之后的运行就会快很多。Boot会分析文件并根据各种“编译器自动配置(compiler auto-configuration)”标示符来确定其意图是生成Web应用。然后,它会在一个内嵌的Tomcat中启动Spring应用上下文,这个tomcat也是配置好的,并不需要开发者额外配置,并且使用的是默认8080端口。打这时候当你打开浏览器并导航到localhost:8080,你就可以在浏览器上看到如下输出“hello”。从这个例子中,我们就可以感受到Spring Boot的强大优势。Spring Boot提供了默认应用上下文以及嵌入式容器,这能够让开发人员更加关注于开发应用以及业务逻辑,从而不用再关心繁琐的样板式配置。
接下来我们就开始开发第一个基于maven构建的Spring Boot应用。现如今用maven构建项目应该算是比较流行的方式,绝大多数的IDEs也都支持maven。
首先你必须已经安装了可用的Java版本和maven。具体如何安装maven可以参看网上的教程。
接下来就是创建pom.xml文件。程序清单2给出了该应用的POM文件。
然后你要添加依赖,Spring Boot提供了很多Starter POMs,这能够让你轻松的将许多jars添加到你的calsspath下。添加依赖的程序清单3如下:
配置完pom文件之后,我们就可以开始编写代码了,代码非常的简单,程序清单4给出了示例的Java代码。
上述代码虽然简单,但它却实现了一个简单的web应用,你只需要运行一下该程序,在浏览器上便可以访问了。
Spring Boot没有XML文件配置,它是通过注解的方式来方便的实现所需功能,现在让我们来解析一下上面的程序。
- @RestController。这被称为一个构造型(stereotype)注解。对于Spring,该类扮演了一个特殊角色。在本示例中,我们的类是一个web @Controller,所以当处理进来的web请求时,Spring会询问它。
- @RequestMapping注解提供路由信息。它告诉Spring任何来自”/“路径的HTTP请求都应该被映射到home方法。@RestController注解告诉Spring以字符串的形式渲染结果,并直接返回给调用者。
- @EnableAutoConfiguration。这个注解告诉Spring Boot根据添加的jar依赖猜测你想如何配置Spring。由于spring-boot-starter-web添加了Tomcat和Spring MVC,所以auto-configuration将假定你正在开发一个web应用并相应地对Spring进行设置。Starter POMs和Auto-Configuration:设计auto-configuration的目的是更好的使用”Starter POMs”, 但这两个概念没有直接的联系。你可以自由地挑选starter POMs以外的jar依赖, 并且Spring Boot将仍旧尽最大努力去自动配置你的应用。
- main方法。这只是一个标准的方法,它遵循Java对于一个应用程序入口点的约定。我们的main方法通过调用run,将业务委托给了Spring Boot的SpringApplication类。SpringApplication将引导我们的应用,启动Spring,相应地启动被自动配置的Tomcat web服务器。我们需要将Example.class作为参数传递给run方法来告诉SpringApplication谁是主要的Spring组件。为了暴露任何的命令行参数, args数组也会被传递过去。
基本上的应用都会涉及到数据库的操作,都需要读取和写入数据库的能力。而传统Spring应用与数据库的集成繁琐而单一,Spring Boot的出现,使数据库集成变成了一项非常简单的任务,因为它具有自动配置Spring Data以访问数据库的能力。只需在你的工程中将spring-boot-starter-data-jpa包含进来,Boot的自动配置引擎就能探测到你的工程需要数据访问功能,并且会在Spring应用上下文中创建必要的Bean,这样你就可以使用Repository和服务了。
接下来就简单介绍一下Spring Boot和mybatis框架的集成。可以通过两种方式集成Spring Boot和mybatis。
第一种是通过mybatis官方提供的mybatis-spring-boot-starter,这种方式比较简单,只需要在pom.xml文件中加入如下依赖就可以了。
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
然后在appliction.yml中增加变量:
mybatis:
config: classpath:/mybatis-config.xml
typeAliasesPackage: com.boya.demo.entity
mapperLocations: classpath:mapper/*.xml
当然你还可以增加一些其他变量来说明mybatis的配置。
第二种集成方式就比较平常的方法,需要添加mybatis依赖和mybatis-spring依赖。
首先需要创建一个MybatisConfig配置类。
@Configuration
@EnableConfigurationProperties(MybatisProperties.class)
public class MybatisConfig {
@Autowired
private MybatisProperties properties;
@Autowired
private ResourceLoader resourceLoader = new DefaultResourceLoader();
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean factory = new SqlSessionFactoryBean();
factory.setDataSource(dataSource);
if (StringUtils.hasText(this.properties.getConfig())) {
factory.setConfigLocation(this.resourceLoader.getResource(this.properties.getConfig()));
}
factory.setTypeAliasesPackage(this.properties.getTypeAliasesPackage());
factory.setTypeHandlersPackage(this.properties.getTypeHandlersPackage());
factory.setMapperLocations(this.properties.getMapperLocations());
return factory.getObject();
}
}
为了支持注解事务,增加了@EnableTransactionManagement注解。
数据源的配置信息都写在application.yml文件中。
Spring Boot特性
SpringApplication
SpringApplication类提供了一种从main()方法启动Spring应用的便捷方式。在很多情况下, 你只需委托给SpringApplication.run这个静态方法:
public static void main(String[] args){
SpringApplication.run(MySpringConfiguration.class, args);
}
如果默认的SpringApplication不符合你的需求,你可以创建一个自定义的本地实例。如下程序清单是一个关闭banner的实例:
public static void main(String[] args){
SpringApplication app = new SpringApplication(MySpringConfiguration.class);
app.setShowBanner(false);
app.run(args);
}
传递给SpringApplication的构造器参数是spring beans的配置源。在大多数情况下,这些将是@Configuration类的引用,但它们也可能是XML配置或要扫描包的引用。
如果你需要创建一个分层的ApplicationContext( 多个具有父子关系的上下文),你可以使用SpringApplicationBuilder。SpringApplicationBuilder允许你以链式方式调用多个方法, 包括可以创建层次结构的parent和child方法。
new SpringApplicationBuilder()
.showBanner(false)
.sources(Parent.class)
.child(Application.class)
.run(args);
创建ApplicationContext层次时有些限制,比如,Web组件(components)必须包含在子上下文(child context)中,且相同的Environment即用于父上下文也用于子上下文中。
Spring Boot也存在的Application事件和监听器。我们可以使用多种方式来注册事件监听器,最通用的注册方法是SpringApplication.addListeners(…)方法。具体事件运行如下:
在应用运行开始时,除监听器注册和初始化以外的任何处理之前,会发送一个ApplicationStartedEvent。在Environment将被用于已知的上下文,但在上下文被创建前,会发送一个ApplicationEnvironmentPreparedEvent。在refresh开始前,但在bean定义已被加载后,会发送一个ApplicationPreparedEvent。启动过程中如果出现异常,会发送一个ApplicationFailedEvent。在Spring内部,Spring Boot使用事件处理各种各样的任务。
外化配置
Spring Boot允许外化(externalize)你的配置,这样你能够在不同的环境下使用相同的代码。你可以使用properties文件,YAML文件,环境变量和命令行参数来外化配置。使用@Value注解,可以直接将属性值注入到你的beans中,并通过Spring的Environment抽象或绑定到结构化对象来访问。
Spring Boot使用一个非常特别的PropertySource次序来允许对值进行合理的覆盖, 需要以下面的次序考虑属性:
1. 命令行参数
2. 来自于java:comp/env的JNDI属性
3. Java系统属性(System.getProperties())
4. 操作系统环境变量
5. 只有在random.*里包含的属性会产生一个RandomValuePropertySource
6. 在打包的jar外的应用程序配置文件( application.properties,包含YAML和profile变量)
7. 在打包的jar内的应用程序配置文件( application.properties,包含YAML和profile变量)
8. 在@Configuration类上的@PropertySource注解
9. 默认属性(使用SpringApplication.setDefaultProperties指定)
下面是一个具体的示例( 假设你开发一个使用name属性的@Component):
import org.springframework.stereotype.*
import org.springframework.beans.factory.annotation.*
@Component
public class MyBean {
@Value("${name}")
private String name;
// ...
}
Spring Boot还有一个重要的特性就是可以用YAML配置文件代替属性文件。YAML是JSON的一个超集,也是一种方便的定义层次配置数据的格式。当你将SnakeYAML库放到classpath下,SpringApplication类就会自动支持YAML作为properties的替换。如果你使用’starter POMs’,spring-boot-starter会自动提供SnakeYAML。
Spring框架提供两个便利的类用于加载YAML文档,YamlPropertiesFactoryBean会将YAML作为Properties来加载,YamlMapFactoryBean会将YAML作为Map来加载。如下程序清单是一个yaml文件示例:
spring:
main.show-banner: false
datasource:
url: jdbc:mysql://localhost:3306/springboot
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
sqlScriptEncoding: UTF-8
thymeleaf:
cache: false
prefix: /WEB-INF/templates/
suffix: .html
mybatis:
config: classpath:/mybatis-config.xml
typeAliasesPackage: com.boya.demo.entity
mapperLocations: classpath:mapper/*.xml
上面的这个YAML文档会被转化成下面的属性:
Spring.main.show-banner=false
Spring.datasource.url= jdbc:mysql://localhost:3306/springboot
Spring.datasource.username=root
…
YAML列表被表示成使用[index]间接引用作为属性keys的形式,例如下面的YAML:
my:
servers:
- dev.bar.com
- foo.bar.com
上述文件将会转化为:
my.servers[0]=dev.bar.com
my.servers[1]=foo.bar.com
通过“@ConfigurationProperties(prefix=”my”)”注解,配置属性中以“my”为前缀的属性值会被自动绑定到 Java 类中同名的域上,如 servers 域的值会对应属性“my.servers”的值。
开发web应用
Spring Boot非常适合开发web应用程序。你可以使用内嵌的Tomcat,Jetty或Undertow轻轻松松地创建一个HTTP服务器。大多数的web应用都使用spring-boot-starter-web模块进行快速搭建和运行
安全
如果Spring Security在classpath下, 那么web应用默认对所有的HTTP路径( 也称为终点, 端点, 表示API的具体网址)使用’basic’认证。 为了给web应用添加方法级别的保护, 你可以添加@EnableGlobalMethodSecurity并使用想要的设置。
WebSockets
Spring Boot为内嵌的Tomcat(8和7), Jetty 9和Undertow提供WebSockets自动配置。 如果你正在将一个war包部署到一个单独的容器,Spring Boot会假设该容器会对它的WebSocket支持相关的配置负责。Spring框架提供丰富的WebSocket支持, 通过spring-boot-starter-websocket模块可以很容易的使用。
总结
Spring Boot是一个基于Spring应用的快速构建项目。本文只是简单的介绍了一下Spring Boot的简单使用以及其特性。总而言之,Spring Boot项目的诞生,很大程度上简化了开发人员使用Spring 开发项目的流程。使用Spring Boot就不需要代码生成,不需要XML配置文件,是真正意义上的零配置,马上开发。其Actuator 所提供的功能非常实用,对于在生产环境下对应用的监控和管理是大有好处的。对广大使用Spring框架的开发人员来说,Spring Boot是一个非常值得使用的工具。