用Spring Boot顛覆Java應(yīng)用開(kāi)發(fā)
Java開(kāi)發(fā)概述:
使用Java做Web應(yīng)用開(kāi)發(fā)已經(jīng)有近20年的歷史了,從最初的Servlet1.0一步步演化到現(xiàn)在如此多的框架,庫(kù)以及整個(gè)生態(tài)系統(tǒng)。經(jīng)過(guò)這么長(zhǎng)時(shí)間的發(fā)展,Java作為一個(gè)成熟的語(yǔ)言,也演化出了非常成熟的生態(tài)系統(tǒng),這也是許多公司采用Java作為主流的語(yǔ)言進(jìn)行服務(wù)器端開(kāi)發(fā)的原因,也是為什么Java一直保持著非常活躍的用戶群。然而這個(gè)生態(tài)系統(tǒng)紛繁復(fù)雜,一個(gè)非常簡(jiǎn)單的Java Web應(yīng)用程序都有可能應(yīng)用到以下技術(shù):
Java開(kāi)發(fā)分為兩個(gè)陣營(yíng),一個(gè)是由Oracle 為代表的Java EE陣營(yíng),這是Web開(kāi)發(fā)的官方參考標(biāo)準(zhǔn)。其中核心技術(shù)主要有Servlet, EJB, JMS, JSF, JDBC/JPA, JAXB, JAX-WS等。另一個(gè)陣營(yíng)則是由開(kāi)源社區(qū)以及Pivotal代表的Spring陣營(yíng),其中核心技術(shù)主要有 Spring Framework, Spring MVC, Spring Data, Spring Security等等。
Spring從最開(kāi)始作為依賴注入的Bean container,逐漸發(fā)展為Java應(yīng)用開(kāi)發(fā)的主流框架。Java EE因?yàn)槠溆纺[,復(fù)雜,難以使用的結(jié)構(gòu),被很多Java程序員拋棄。從Java EE6開(kāi)始才引入了CDI (Context Dependency Injection),而且Java EE 的設(shè)計(jì)思想非常學(xué)術(shù)化, Gavin King等人脫離了工業(yè)界的需求,使得Java EE開(kāi)發(fā)非常復(fù)雜。JSF甚至為Java之父James Gosling詬病。相反在Spring社區(qū),越來(lái)越多現(xiàn)代化的應(yīng)用開(kāi)發(fā)方法被融入進(jìn)來(lái),形成不同的Spring項(xiàng)目。
什么是Spring Boot?
Spring Boot便是一個(gè)社區(qū)反饋推動(dòng)的項(xiàng)目. Spring Boot可以說(shuō)是至少近5年來(lái)Spring乃至整個(gè)Java社區(qū)最有影響力的項(xiàng)目之一。Spring Boot主要包含以下特性:
- 直接嵌入Tomcat, Jetty或者Undertow作為Servlet container。從此之后再也不用將應(yīng)用程序打包成war然后上傳到application server里面了。
- 提供了starter POM, 能夠非常方便的進(jìn)行包管理, 很大程度上減少了jar hell或者dependency hell
- 自動(dòng)進(jìn)行Spring框架的配置,節(jié)省程序員大量的時(shí)間和精力,能夠讓程序員專注在業(yè)務(wù)邏輯代碼的編寫上
- 不需要任何第三方系統(tǒng), Spring Boot自帶了可以用于生產(chǎn)環(huán)境的程序狀態(tài)信息和健康狀態(tài)。同時(shí)可以讓應(yīng)用程序非常方便的讀取外部的配置信息
- 完全不需要任何代碼的自動(dòng)生成。更不需要用xml來(lái)進(jìn)行框架的配置
為什么Spring Boot是顛覆性的?
為什么說(shuō)Spring Boot是顛覆性的呢?因?yàn)樗鼜氐赘淖兞薐ava應(yīng)用開(kāi)發(fā)的模式。以往我們做Spring應(yīng)用開(kāi)發(fā),要知道配置哪些類來(lái)讓Hibernate和Spring一起工作,要知道如何配置view resolver來(lái)控制哪個(gè)模版進(jìn)行視圖層的展示。經(jīng)常寫了一大堆代碼之后發(fā)現(xiàn)只是在處理Spring框架本身的配置,根本一行業(yè)務(wù)邏輯都沒(méi)有寫。開(kāi)發(fā)完成之后,我們還要考慮部署的問(wèn)題,且不說(shuō)部署到非常笨重的應(yīng)用服務(wù)器,比如WebSphere, Weblogic或者JBoss,即使部署到Tomcat或者Jetty這種輕量級(jí)容器上面,我們要知道如何配置容器,如何修改配置文件等等。而且在多應(yīng)用部署到同一個(gè)Tomcat的時(shí)候,經(jīng)常會(huì)出現(xiàn)沖突。就算我們花了很大力氣解決了這些問(wèn)題,程序部署成功之后,我們很難去了解這個(gè)程序的運(yùn)行狀態(tài)。有可能我們要配置很多第三方工具來(lái)去知道這個(gè)應(yīng)用程序運(yùn)行狀態(tài)如何,有哪些參數(shù),環(huán)境變量是什么。盡管Spring幫我們解決了依賴注入的問(wèn)題,簡(jiǎn)化了一些MVC的流程,但是Spring框架本身集成了越來(lái)越多東西,導(dǎo)致其越來(lái)越難配置,維護(hù)成本成直線上升。很多時(shí)候Java程序員們看到Python, Ruby或者JavaScript程序員敲幾個(gè)命令安裝一些庫(kù),然后簡(jiǎn)單的敲幾行代碼,引入一些框架比如flask,然后直接一個(gè)簡(jiǎn)單的API就可以跑起來(lái)了。這時(shí)候Java程序員可能還在研究該使用Maven里面的哪個(gè)庫(kù),如何在代碼里面進(jìn)行配置呢。大家心里的表情肯定是這樣:
(求此時(shí)Java程序員心理陰影面積)
Java程序員揚(yáng)眉吐氣的時(shí)候到了!
傳統(tǒng)Spring開(kāi)發(fā)對(duì)決Spring Boot應(yīng)用開(kāi)發(fā)
接下來(lái)我會(huì)通過(guò)具體例子對(duì)比傳統(tǒng)的Spring應(yīng)用開(kāi)發(fā)和Spring Boot應(yīng)用開(kāi)發(fā)。假如我們開(kāi)發(fā)一個(gè)Hello World的REST API,傳統(tǒng)的Spring開(kāi)發(fā)應(yīng)該這么做.
1. 如果使用Maven進(jìn)行包管理,編寫pom.xml 如下
如上可以看到為了編寫簡(jiǎn)單的hello world REST API我們引入了Spring Core, Spring Web, Spring Web MVC, Java Servlet and Jackson這么多包依賴。可以想象復(fù)雜一點(diǎn)的程序這個(gè)pom會(huì)變成什么樣。。。
2. 編寫HelloWorldInitializer class如下
這個(gè)已經(jīng)是非常簡(jiǎn)單的Java Config了,在Servlet 3.0之前用XML配置Spring的小伙伴們現(xiàn)在估計(jì)已經(jīng)崩潰。
3. 編寫HelloWorldConfiguration class
注意到我們這個(gè)類里面一行業(yè)務(wù)邏輯都沒(méi)有哦。。。
4. 真正開(kāi)始編寫HelloWorldRestController
5. 下載Tomcat
6. 打包部署到Tomcat上
7.訪問(wèn)localhost:8080/HelloWorld, 你終于看到了Hello World…
寫到這里我已經(jīng)累覺(jué)不愛(ài)了。。。
接下來(lái)Java老司機(jī)會(huì)帶領(lǐng)你們感受一下Spring Boot的魅力:
1. 編寫pom.xml
注意到我們只引入了一個(gè)包依賴,并且版本什么的就隨他去吧
2. 編寫main 函數(shù)
我們?cè)谶@里標(biāo)記HelloWorldDemoApplication class為SpringBootApplication, Spring Boot 在后臺(tái)會(huì)根據(jù)這個(gè)標(biāo)記進(jìn)行很多自動(dòng)配置,比如配置MVC,配置包掃描,注入必要的類,注入自動(dòng)配置的類等等。
這里的main函數(shù)是一個(gè)java標(biāo)準(zhǔn)的main函數(shù),這個(gè)相當(dāng)于應(yīng)用程序入口,servlet container會(huì)在啟動(dòng)的時(shí)候找到這個(gè)入口,啟動(dòng)Spring container,完成初始化。
3. 編寫HelloWorldRestController
4. 直接啟動(dòng)應(yīng)用程序,不需要部署
5. 訪問(wèn) http:// localhost:8080 就可以直接看到Hello World了
之前HelloWorld程序?qū)τ谛率謥?lái)說(shuō)至少要花個(gè)10-20分鐘之類的,有了SpringBoot, 最多3分鐘之內(nèi)搞定HelloWorld不是夢(mèng)。
總結(jié)
這里我只是簡(jiǎn)單的對(duì)SpringBoot進(jìn)行了講解,SpringBoot有非常多值得深入討論的東西,它不僅讓我們做Java開(kāi)發(fā)變的簡(jiǎn)單有效,更重要的是SpringBoot徹底顛覆了我們對(duì)Java開(kāi)發(fā)的認(rèn)識(shí),讓我們第一次有了”原來(lái)Java開(kāi)發(fā)可以這么做” 的感覺(jué)。有了SpringBoot之后,Java程序員可以更專注于業(yè)務(wù)邏輯,進(jìn)行更敏捷的開(kāi)發(fā)。