写点什么

使用 Spring Boot 快速构建应用

  • 2014-01-20
  • 本文字数:3794 字

    阅读完需:约 12 分钟

随着 Spring 4 新版本的发布 Spring Boot 这个新的子项目得到了广泛的关注,因为不管是 Spring 4 官方发布的新闻稿还是针对首席架构师Adrian Colyer 的专访,都对这个子项目所带来的生产率提升赞誉有加。

Spring Boot 充分利用了 JavaConfig 的配置模式以及“约定优于配置”的理念,能够极大的简化基于 Spring MVC 的 Web 应用和 REST 服务开发。

Spring 4 倡导微服务的架构,针对这一理念,近来在微博上也有一些有价值的讨论,如这里这里。微服务架构倡导将功能拆分到离散的服务中,独立地进行部署,Spring Boot 能够很方便地将应用打包成独立可运行的 JAR 包,因此在开发模式上很契合这一理念。目前,Spring Boot 依然是 0.5.0 的里程碑版本,因此相关的文档尚不完善,本文将会以一个简单的样例来介绍基于这个项目的开发过程。

要 Spring Boot 进行功能开发,需要使用 Gradle 或者 Maven 作为构建工具。在本例中,我们会使用 Eclipse 和 Maven 插件进行开发。要使用 Spring Boot,首先创建一个 Maven 工程,并修改 Maven 主要的配置文件 pom.xml,如下所示:

复制代码
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>0.5.0.M7</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring3</artifactId>
</dependency>
</dependencies>
<properties>
<start-class>com.levin.Application</start-class>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestone</id>
<url>http://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-milestone</id>
<url>http://repo.spring.io/libs-milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>

在上面的配置中,需要将工程的 parent 设置为 spring-boot-starter-parent,并添加对 spring-boot-starter-web 的依赖,这样我们就无需设置各个依赖项及其版本信息了。并且在构建中要声明使用 spring-boot-maven-plugin 这个插件,它会对 Maven 打包形成的 JAR 进行二次修改,最终产生符合我们要求的内容结构。

在我们的应用中将要发布一个 REST 服务,显示一个基本的用户信息,首先定义一个简单的模型类:

复制代码
package com.levin;
public class Person {
private String name;
private String email;
public Person(String name, String email) {
this.name = name;
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}

接下来,我们需要声明一个 Spring MVC 的 Controller,响应对实体的请求:

复制代码
@Controller
public class ShowPersonController {
@RequestMapping("/showPerson")
public @ResponseBody Person showPerson() {
return new Person("levinzhang","levinzhang1981@gmail.com");
}
}

这个类与我们在使用 Spring MVC 定义 Controller 时并无任何差别。接下来,我们需要声明一个主类启动这个应用程序:

复制代码
@ComponentScan
@EnableAutoConfiguration
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

这个类的 main 方法中使用了 SpringApplication 帮助类,并以 Application 这个类作为配置来启动 Spring 的应用上下文。在这个类中使用了 ComponentScan 以及 EnableAutoConfiguration 注解,其中 ComponentScan 注解会告知 Spring 扫描指定的包来初始化 Spring Bean,这能够确保我们声明的 Bean 能够被发现。EnableAutoConfiguration 将会启动自动配置模式,在我们的配置中会将对 Tomcat 的依赖级联进来,因此在应用启动时将会自动启动一个嵌入式的 Tomcat,因为在样例中使用了 Spring MVC,所以也会自动注册所需的 DispatcherServlet,这都不需要类似 web.xml 这样的配置。

在 Eclipse 中要运行这个应用的话,可以直接以 Java Application 的形式来运行这个 main 函数,此时会启动应用,我们在浏览器中可以看到如下的运行效果,这就是我们想要的 REST 服务:

在开发调试完成之后,可以将应用打成 JAR 包的形式,在 Eclipse 中可以直接使用 Maven 插件的 package 命令,最终会形成一个可运行的 JAR 包。我们使用 java –jar 命令就可以运行这个 JAR 包了。所呈现出的效果与在调试期是一样的。现在看一下这个 JAR 包解压后的目录结构:

这个 JAR 包与传统 JAR 包的不同之处在于里面有一个名为 lib 的目录,在这个目录中包含了这个简单应用所依赖的其他 JAR 包,其中也包含内置的嵌入式 Tomcat,正是使用它,才能发布服务和访问 Web 资源。除了我们编写的源码所编译形成的 CLASS 以外,在 org 目录下还有许多 Spring 所提供的 CLASS,正是依赖这些 CLASS,才能够加载位于 lib 目录下 JAR 中的类。这样的加载机制与在 OSGi bundle 中声明 Bundle-Classpath 很类似,不过在 OSGi 中会由容器来负责加载指定路径下的类。这大致阐述了这样一个 JAR 包能够发布服务的原因。

如果我们想要使用 HTML、JSP 等 Web 资源的话,在 Controller 中直接返回对应的视图就可以了。

如果我们想要将这个 JAR 包转换成可以在 Servlet 容器中部署的 WAR 的话,就不能依赖于 Application 的 main 函数了,而是要以类似于 web.xml 文件配置的方式来启动 Spring 应用上下文,此时我们需要声明这样一个类:

复制代码
public class HelloWebXml extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class);
}
}

这个类的作用与在 web.xml 中配置负责初始化 Spring 应用上下文的监听器作用类似,只不过在这里不需要编写额外的 XML 文件了。

如果要将最终的打包形式改为 WAR 的话,还需要对 pom.xml 文件进行修改,除了需要将 packaging 的值修改为 war 以外,还需要对依赖进行适当的配置(这一部分在 Spring Boot 的样例和文档中均未提及,提醒大家注意):

复制代码
<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>

在这里需要移除对嵌入式 Tomcat 的依赖,这样打出的 WAR 包中,在 lib 目录下才不会包含 Tomcat 相关的 JAR 包,否则将会出现启动错误。另外,在移除对 Tomcat 的依赖后,为了保证编译正确,还需要添加对 servlet-api 的依赖,因此添加如下的配置:

复制代码
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>7.0.42</version>
<scope>provided</scope>
</dependency>

在这里将 scope 属性设置为 provided,这样在最终形成的 WAR 中不会包含这个 JAR 包,因为 Tomcat 或 Jetty 等服务器在运行时将会提供相关的 API 类。此时,执行 mvn package 命令就会得到一个 WAR 文件,我们可以直接将其放到 Tomcat 下运行(需要 7.0.42 版本以上)。

以上介绍了基于 Spring Boot 开发应用的过程,目前它的文档尚不完善,但是在 GitHub 上有不少的样例,包括与 Spring Data 集成访问数据库(关系型以及非关系型)、安全、WebSocket 等,读者感兴趣可以下载运行,需要注意的是有些样例中使用的是 0.5.0.M6 版本,这个版本有问题,运行时会出错,建议手动修改为 0.5.0.M7 或快照版本。

基于以上的介绍,希望读者能够对 Spring Boot 这个新项目有所了解。它简化了 JAR 包管理和相关基础设施环境的配置,能够帮助我们快速开发 Web 应用或构建 REST 服务,希望它能够尽快完善成熟,更多地用于实践,提升开发效率。

参考资料

http://projects.spring.io/spring-boot/

http://projects.spring.io/spring-boot/docs/README.html

http://spring.io/guides/gs/spring-boot/

http://spring.io/guides/gs/actuator-service/

http://spring.io/guides/gs/convert-jar-to-war/

2014-01-20 23:2340054

评论

发布
暂无评论
发现更多内容

和鲸携手上海交大医学院张维拓老师,混合式教学聚焦R语言医学数据分析,从图表开始复现顶刊论文

ModelWhale

人工智能 数据分析 R语言 代码复现 医学

普及旗舰音质,一加 Buds 3正式发布 售价499元

编程猫

官宣|硬核阵容曝光!PolarDB开发者大会全议程公布

阿里云瑶池数据库

数据库 阿里云 云原生 开发者大会

数字化助力,聚道云软件连接器实现软件公司人事信息自动同步

聚道云软件连接器

案例分享

Jira停售Server版在即,飞书项目或成为最佳选择

科技热闻

揭秘阿里巴巴:如何通过API实时捕获中国市场商品数据

Noah

数据库内核那些事|细说PolarDB优化器查询变换:IN-List变换

阿里云瑶池数据库

数据库 List 阿里云 云原生 adb

数云引领,神州数码荣获CSA2023安全创新奖

科技热闻

通过聚道云软件连接器实现销帮帮软件与i人事软件的智能对接

聚道云软件连接器

案例分享

软件测试开发/全日制丨测试用例-黑盒测试方法论 学习笔记

测试人

软件测试

玩转低代码可视化平台,软件开发如此简单!

互联网工科生

软件开发 低代码 可视化开发 JNPF

和鲸解放军总医院连续生理数据分析引擎入选爱分析数据智能最佳实践案例

ModelWhale

人工智能 大数据 数字化转型 企业管理 数智化

软件测试开发/全日制丨自动化测试定位策略 学习笔记

测试人

软件测试 测试开发

云桌面有什么技术特点?应用场景是什么?

青椒云云电脑

桌面云 云桌面 云桌面解决方案

NFT 项目入驻 NFTScan Site 流程说明

NFT Research

NFT NFT\ NFTScan nft工具

lazada商品详情数据接口(lazada.item_get)丨lazada API接口

tbapi

lazada商品详情数据接口 lazada商品数据接口 lazada商品API接口 lazada API接口

2024 AIGC 应用层十大趋势;iPhone 遭史上最复杂攻击!丨 RTE 开发者日报 Vol.119

声网

喜讯丨上海和今信息科技有限公司入选2023年上海市专精特新中小企业名单

ModelWhale

人工智能 科技 专精特新企业

优化独立站网页布局,提升30%用户留存

九凌网络

SEO内容页面性能优化全攻略

九凌网络

DAPP代币燃烧质押项目系统开发丨详情开发

l8l259l3365

如何通过技术手段使LED显示屏更加节能?

Dylan

概念 节能 LED显示屏 市场

前端技术-调试工具(上)

不在线第一只蜗牛

前端 框架 前端技术

构建企业级AI中台,实现业务场景价值闭环

ModelWhale

AI 数字化转型 中台架构 AI中台

自动化接口测试工具 AREX 0.6.2 版本发布

AREX 中文社区

开源 自动化测试 接口测试

全新升级!腾讯云大数据ES Serverless服务开启日志分析新体验

腾讯云大数据

ES

使用Spring Boot快速构建应用_Java_张卫滨_InfoQ精选文章