用Spring Boot颠覆Java应用开发

Java 开发概述:

使用 Java 做 Web 应用开发已经有近 20 年的历史了,从最初的 Servlet1.0 一步步演化到现在如此多的框架,库以及整个生态系统。经过这么长时间的发展,Java 作为一个成熟的语言,也演化出了非常成熟的生态系统,这也是许多公司采用 Java 作为主流的语言进行服务器端开发的原因,也是为什么 Java 一直保持着非常活跃的用户群。然而这个生态系统纷繁复杂,一个非常简单的 Java Web 应用程序都有可能应用到以下技术:

Java 开发分为两个阵营,一个是由 Oracle 为代表的 Java EE 阵营,这是 Web 开发的官方参考标准。其中核心技术主要有 Servlet, EJB, JMS, JSF, JDBC/JPA, JAXB, JAX-WS 等。另一个阵营则是由开源社区以及 Pivotal 代表的 Spring 阵营,其中核心技术主要有 Spring Framework, Spring MVC, Spring Data, Spring Security 等等。

Spring 从最开始作为依赖注入的 Bean container,逐渐发展为 Java 应用开发的主流框架。Java EE 因为其臃肿,复杂,难以使用的结构,被很多 Java 程序员抛弃。从 Java EE6 开始才引入了 CDI (Context Dependency Injection),而且 Java EE 的设计思想非常学术化, Gavin King 等人脱离了工业界的需求,使得 Java EE 开发非常复杂。JSF 甚至为 Java 之父 James Gosling 诟病。相反在 Spring 社区,越来越多现代化的应用开发方法被融入进来,形成不同的 Spring 项目。

什么是 Spring Boot?

Spring Boot 便是一个社区反馈推动的项目. Spring Boot 可以说是至少近 5 年来 Spring 乃至整个 Java 社区最有影响力的项目之一。Spring Boot 主要包含以下特性:

  • 直接嵌入 Tomcat, Jetty 或者 Undertow 作为 Servlet container。从此之后再也不用将应用程序打包成 war 然后上传到 application server 里面了。

  • 提供了 starter POM, 能够非常方便的进行包管理, 很大程度上减少了 jar hell 或者 dependency hell

  • 自动进行 Spring 框架的配置,节省程序员大量的时间和精力,能够让程序员专注在业务逻辑代码的编写上

  • 不需要任何第三方系统, Spring Boot 自带了可以用于生产环境的程序状态信息和健康状态。同时可以让应用程序非常方便的读取外部的配置信息

  • 完全不需要任何代码的自动生成。更不需要用 xml 来进行框架的配置

为什么 Spring Boot 是颠覆性的?

为什么说 Spring Boot 是颠覆性的呢?因为它彻底改变了 Java 应用开发的模式。以往我们做 Spring 应用开发,要知道配置哪些类来让 Hibernate 和 Spring 一起工作,要知道如何配置 view resolver 来控制哪个模版进行视图层的展示。经常写了一大堆代码之后发现只是在处理 Spring 框架本身的配置,根本一行业务逻辑都没有写。开发完成之后,我们还要考虑部署的问题,且不说部署到非常笨重的应用服务器,比如 WebSphere, Weblogic 或者 JBoss,即使部署到 Tomcat 或者 Jetty 这种轻量级容器上面,我们要知道如何配置容器,如何修改配置文件等等。而且在多应用部署到同一个 Tomcat 的时候,经常会出现冲突。就算我们花了很大力气解决了这些问题,程序部署成功之后,我们很难去了解这个程序的运行状态。有可能我们要配置很多第三方工具来去知道这个应用程序运行状态如何,有哪些参数,环境变量是什么。尽管 Spring 帮我们解决了依赖注入的问题,简化了一些 MVC 的流程,但是 Spring 框架本身集成了越来越多东西,导致其越来越难配置,维护成本成直线上升。很多时候 Java 程序员们看到 Python, Ruby 或者 JavaScript 程序员敲几个命令安装一些库,然后简单的敲几行代码,引入一些框架比如 flask,然后直接一个简单的 API 就可以跑起来了。这时候 Java 程序员可能还在研究该使用 Maven 里面的哪个库,如何在代码里面进行配置呢。大家心里的表情肯定是这样:

(求此时 Java 程序员心理阴影面积)

Java 程序员扬眉吐气的时候到了!

传统 Spring 开发对决 Spring Boot 应用开发

接下来我会通过具体例子对比传统的 Spring 应用开发和 Spring Boot 应用开发。假如我们开发一个 Hello World 的 REST API,传统的 Spring 开发应该这么做.

1. 如果使用 Maven 进行包管理,编写 pom.xml 如下

如上可以看到为了编写简单的 hello world REST API 我们引入了 Spring Core, Spring Web, Spring Web MVC, Java Servlet and Jackson 这么多包依赖。可以想象复杂一点的程序这个 pom 会变成什么样。。。

2. 编写 HelloWorldInitializer class 如下

这个已经是非常简单的 Java Config 了,在 Servlet 3.0 之前用 XML 配置 Spring 的小伙伴们现在估计已经崩溃。

3. 编写 HelloWorldConfiguration class

注意到我们这个类里面一行业务逻辑都没有哦。。。

4. 真正开始编写 HelloWorldRestController

5. 下载 Tomcat

6. 打包部署到 Tomcat 上

7. 访问 localhost:8080/HelloWorld, 你终于看到了 Hello World…

写到这里我已经累觉不爱了。。。

接下来 Java 老司机会带领你们感受一下 Spring Boot 的魅力:

1. 编写 pom.xml

注意到我们只引入了一个包依赖,并且版本什么的就随他去吧

2. 编写 main 函数

我们在这里标记 HelloWorldDemoApplication class 为 SpringBootApplication, Spring Boot 在后台会根据这个标记进行很多自动配置,比如配置 MVC,配置包扫描,注入必要的类,注入自动配置的类等等。

这里的 main 函数是一个 java 标准的 main 函数,这个相当于应用程序入口,servlet container 会在启动的时候找到这个入口,启动 Spring container,完成初始化。

3. 编写 HelloWorldRestController

4. 直接启动应用程序,不需要部署

5. 访问就可以直接看到 Hello World 了

之前 HelloWorld 程序对于新手来说至少要花个 10-20 分钟之类的,有了 SpringBoot, 最多 3 分钟之内搞定 HelloWorld 不是梦。

总结

这里我只是简单的对 SpringBoot 进行了讲解,SpringBoot 有非常多值得深入讨论的东西,它不仅让我们做 Java 开发变的简单有效,更重要的是 SpringBoot 彻底颠覆了我们对 Java 开发的认识,让我们第一次有了”原来 Java 开发可以这么做” 的感觉。有了 SpringBoot 之后,Java 程序员可以更专注于业务逻辑,进行更敏捷的开发。