版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
SpringBoot實戰(zhàn)全面分析SpringBoot核心功能和特性注:因內(nèi)容過長上傳受限制,本文檔只顯示小部分內(nèi)容,完整版文檔請下載此文檔后留言謝謝。目錄\h第1章入門\h1.1Spring風云再起\h1.1.1重新認識Spring\h1.1.2SpringBoot精要\h1.1.3SpringBoot不是什么\h1.2SpringBoot入門\h1.2.1安裝SpringBootCLI\h1.2.2使用SpringInitializr初始化SpringBoot項目\h1.3小結(jié)\h第2章開發(fā)第一個應(yīng)用程序\h2.1運用SpringBoot\h2.1.1查看初始化的SpringBoot新項目\h2.1.2SpringBoot項目構(gòu)建過程解析\h2.2使用起步依賴\h2.2.1指定基于功能的依賴\h2.2.2覆蓋起步依賴引入的傳遞依賴\h2.3使用自動配置\h2.3.1專注于應(yīng)用程序功能\h2.3.2運行應(yīng)用程序\h2.3.3剛剛發(fā)生了什么\h2.4小結(jié)\h第3章自定義配置\h3.1覆蓋SpringBoot自動配置\h3.1.1保護應(yīng)用程序\h3.1.2創(chuàng)建自定義的安全配置\h3.1.3掀開自動配置的神秘面紗\h3.2通過屬性文件外置配置\h3.2.1自動配置微調(diào)\h3.2.2應(yīng)用程序Bean的配置外置\h3.2.3使用Profile進行配置\h3.3定制應(yīng)用程序錯誤頁面\h3.4小結(jié)\h第4章測試\h4.1集成測試自動配置\h4.2測試Web應(yīng)用程序\h4.2.1模擬SpringMVC\h4.2.2測試Web安全\h4.3測試運行中的應(yīng)用程序\h4.3.1用隨機端口啟動服務(wù)器\h4.3.2使用Selenium測試HTML頁面\h4.4小結(jié)\h第5章Groovy與SpringBootCLI\h5.1開發(fā)SpringBootCLI應(yīng)用程序\h5.1.1設(shè)置CLI項目\h5.1.2通過Groovy消除代碼噪聲\h5.1.3發(fā)生了什么\h5.2獲取依賴\h5.2.1覆蓋默認依賴版本\h5.2.2添加依賴倉庫\h5.3用CLI運行測試\h5.4創(chuàng)建可部署的產(chǎn)物\h5.5小結(jié)\h第6章在SpringBoot中使用Grails\h6.1使用GORM進行數(shù)據(jù)持久化\h6.2使用GroovyServerPages定義視圖\h6.3結(jié)合SpringBoot與Grails3\h6.3.1創(chuàng)建新的Grails項目\h6.3.2定義領(lǐng)域模型\h6.3.3開發(fā)Grails控制器\h6.3.4創(chuàng)建視圖\h6.4小結(jié)\h第7章深入Actuator\h7.1揭秘Actuator的端點\h7.1.1查看配置明細\h7.1.2運行時度量\h7.1.3關(guān)閉應(yīng)用程序\h7.1.4獲取應(yīng)用信息\h7.2連接Actuator的遠程shell\h7.2.1查看autoconfig報告\h7.2.2列出應(yīng)用程序的Bean\h7.2.3查看應(yīng)用程序的度量信息\h7.2.4調(diào)用Actuator端點\h7.3通過JMX監(jiān)控應(yīng)用程序\h7.4定制Actuator\h7.4.1修改端點ID\h7.4.2啟用和禁用端點\h7.4.3添加自定義度量信息\h7.4.4創(chuàng)建自定義跟蹤倉庫\h7.4.5插入自定義健康指示器\h7.5保護Actuator端點\h7.6小結(jié)\h第8章部署SpringBoot應(yīng)用程序\h8.1衡量多種部署方式\h8.2部署到應(yīng)用服務(wù)器\h8.2.1構(gòu)建WAR文件\h8.2.2創(chuàng)建生產(chǎn)Profile\h8.2.3開啟數(shù)據(jù)庫遷移\h8.3推上云端\h8.3.1部署到CloudFoundry\h8.3.2部署到Heroku\h8.4小結(jié)\h附錄ASpringBoot開發(fā)者工具\hA.1自動重啟\hA.2LiveReload\hA.3遠程開發(fā)\hA.4默認的開發(fā)時屬性\hA.5全局配置開發(fā)者工具\h附錄BSpringBoot起步依賴\h附錄C配置屬性\h附錄DSpringBoot依賴第1章入門本章內(nèi)容SpringBoot簡化Spring應(yīng)用程序開發(fā)SpringBoot的基本特性SpringBoot工作區(qū)的設(shè)置SpringFramework已有十余年的歷史了,已成為Java應(yīng)用程序開發(fā)框架的事實標準。在如此悠久的歷史背景下,有人可能會認為Spring放慢了腳步,躺在了自己的榮譽簿上,再也做不出什么新鮮的東西,或者是讓人激動的東西。甚至有人說,Spring是遺留項目,是時候去看看其他創(chuàng)新的東西了。這些人說得不對。Spring的生態(tài)圈里正在出現(xiàn)很多讓人激動的新鮮事物,涉及的領(lǐng)域涵蓋云計算、大數(shù)據(jù)、無模式的數(shù)據(jù)持久化、響應(yīng)式編程以及客戶端應(yīng)用程序開發(fā)。在過去的一年多時間里,最讓人興奮、回頭率最高、最能改變游戲規(guī)則的東西,大概就是SpringBoot了。SpringBoot提供了一種新的編程范式,能在最小的阻力下開發(fā)Spring應(yīng)用程序。有了它,你可以更加敏捷地開發(fā)Spring應(yīng)用程序,專注于應(yīng)用程序的功能,不用在Spring的配置上多花功夫,甚至完全不用配置。實際上,SpringBoot的一項重要工作就是讓Spring不再成為你成功路上的絆腳石。本書將探索SpringBoot開發(fā)的諸多方面,但在開始前,我們先大概了解一下SpringBoot的功能。1.1Spring風云再起Spring誕生時是Java企業(yè)版(JavaEnterpriseEdition,JEE,也稱J2EE)的輕量級代替品。無需開發(fā)重量級的EnterpriseJavaBean(EJB),Spring為企業(yè)級Java開發(fā)提供了一種相對簡單的方法,通過依賴注入和面向切面編程,用簡單的Java對象(PlainOldJavaObject,POJO)實現(xiàn)了EJB的功能。雖然Spring的組件代碼是輕量級的,但它的配置卻是重量級的。一開始,Spring用XML配置,而且是很多XML配置。Spring2.5引入了基于注解的組件掃描,這消除了大量針對應(yīng)用程序自身組件的顯式XML配置。Spring3.0引入了基于Java的配置,這是一種類型安全的可重構(gòu)配置方式,可以代替XML。盡管如此,我們依舊沒能逃脫配置的魔爪。開啟某些Spring特性時,比如事務(wù)管理和SpringMVC,還是需要用XML或Java進行顯式配置。啟用第三方庫時也需要顯式配置,比如基于Thymeleaf的Web視圖。配置Servlet和過濾器(比如Spring的DispatcherServlet)同樣需要在web.xml或Servlet初始化代碼里進行顯式配置。組件掃描減少了配置量,Java配置讓它看上去簡潔不少,但Spring還是需要不少配置。所有這些配置都代表了開發(fā)時的損耗。因為在思考Spring特性配置和解決業(yè)務(wù)問題之間需要進行思維切換,所以寫配置擠占了寫應(yīng)用程序邏輯的時間。和所有框架一樣,Spring實用,但與此同時它要求的回報也不少。除此之外,項目的依賴管理也是件吃力不討好的事情。決定項目里要用哪些庫就已經(jīng)夠讓人頭痛的了,你還要知道這些庫的哪個版本和其他庫不會有沖突,這難題實在太棘手。并且,依賴管理也是一種損耗,添加依賴不是寫應(yīng)用程序代碼。一旦選錯了依賴的版本,隨之而來的不兼容問題毫無疑問會是生產(chǎn)力殺手。SpringBoot讓這一切成為了過去。1.1.1重新認識Spring假設(shè)你受命用Spring開發(fā)一個簡單的HelloWorldWeb應(yīng)用程序。你該做什么?我能想到一些基本的需要。一個項目結(jié)構(gòu),其中有一個包含必要依賴的Maven或者Gradle構(gòu)建文件,最起碼要有SpringMVC和ServletAPI這些依賴。一個web.xml文件(或者一個WebApplicationInitializer實現(xiàn)),其中聲明了Spring的DispatcherServlet。一個啟用了SpringMVC的Spring配置。一個控制器類,以“HelloWorld”響應(yīng)HTTP請求。一個用于部署應(yīng)用程序的Web應(yīng)用服務(wù)器,比如Tomcat。最讓人難以接受的是,這份清單里只有一個東西是和HelloWorld功能相關(guān)的,即控制器,剩下的都是Spring開發(fā)的Web應(yīng)用程序必需的通用樣板。既然所有SpringWeb應(yīng)用程序都要用到它們,那為什么還要你來提供這些東西呢?假設(shè)這里只需要控制器。代碼清單1-1所示基于Groovy的控制器類就是一個簡單而完整的Spring應(yīng)用程序。代碼清單1-1一個完整的基于Groovy的Spring應(yīng)用程序@RestController
classHelloController{
@RequestMapping("/")
defhello(){
return"HelloWorld"
}
}
這里沒有配置,沒有web.xml,沒有構(gòu)建說明,甚至沒有應(yīng)用服務(wù)器,但這就是整個應(yīng)用程序了。SpringBoot會搞定執(zhí)行應(yīng)用程序所需的各種后勤工作,你只要搞定應(yīng)用程序的代碼就好。假設(shè)你已經(jīng)裝好了SpringBoot的命令行界面(CommandLineInterface,CLI),可以像下面這樣在命令行里運行HelloController:$springrunHelloController.groovy
想必你已經(jīng)注意到了,這里甚至沒有編譯代碼,SpringBootCLI可以運行未經(jīng)編譯的代碼。之所以選擇用Groovy來寫這個控制器示例,是因為Groovy語言的簡潔與SpringBoot的簡潔有異曲同工之妙。但SpringBoot并不強制要求使用Groovy。實際上,本書中的很多代碼都是用Java寫的,但在恰當?shù)臅r候,偶爾也會出現(xiàn)一些Groovy代碼。不要客氣,直接跳到1.2.1節(jié)吧,看看如何安裝SpringBootCLI,這樣你就能試著編寫這個小小的Web應(yīng)用程序了。現(xiàn)在,你將看到SpringBoot的關(guān)鍵部分,看到它是如何改變Spring應(yīng)用程序的開發(fā)方式的。1.1.2SpringBoot精要SpringBoot將很多魔法帶入了Spring應(yīng)用程序的開發(fā)之中,其中最重要的是以下四個核心。自動配置:針對很多Spring應(yīng)用程序常見的應(yīng)用功能,SpringBoot能自動提供相關(guān)配置。起步依賴:告訴SpringBoot需要什么功能,它就能引入需要的庫。命令行界面:這是SpringBoot的可選特性,借此你只需寫代碼就能完成完整的應(yīng)用程序,無需傳統(tǒng)項目構(gòu)建。Actuator:讓你能夠深入運行中的SpringBoot應(yīng)用程序,一探究竟。每一個特性都在通過自己的方式簡化Spring應(yīng)用程序的開發(fā)。本書會探尋如何將它們發(fā)揮到極致,但就目前而言,先簡單看看它們都提供了哪些功能吧。1.自動配置在任何Spring應(yīng)用程序的源代碼里,你都會找到Java配置或XML配置(抑或兩者皆有),它們?yōu)閼?yīng)用程序開啟了特定的特性和功能。舉個例子,如果你寫過用JDBC訪問關(guān)系型數(shù)據(jù)庫的應(yīng)用程序,那你一定在Spring應(yīng)用程序上下文里配置過JdbcTemplate這個Bean。我打賭那段配置看起來是這樣的:@Bean
publicJdbcTemplatejdbcTemplate(DataSourcedataSource){
returnnewJdbcTemplate(dataSource);
}
這段非常簡單的Bean聲明創(chuàng)建了一個JdbcTemplate的實例,注入了一個DataSource依賴。當然,這意味著你還需要配置一個DataSource的Bean,這樣才能滿足依賴。假設(shè)你將配置一個嵌入式H2數(shù)據(jù)庫作為DataSourceBean,完成這個配置場景的代碼大概是這樣的:@Bean
publicDataSourcedataSource(){
returnnewEmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScripts('schema.sql','data.sql')
.build();
}
這個Bean配置方法創(chuàng)建了一個嵌入式數(shù)據(jù)庫,并指定在該數(shù)據(jù)庫上執(zhí)行兩段SQL腳本。build()方法返回了一個指向該數(shù)據(jù)庫的引用。這兩個Bean配置方法都不復(fù)雜,也不是很長,但它們只是典型Spring應(yīng)用程序配置的一小部分。除此之外,還有無數(shù)Spring應(yīng)用程序有著完全相同的方法。所有需要用到嵌入式數(shù)據(jù)庫和JdbcTemplate的應(yīng)用程序都會用到那些方法。簡而言之,這就是一個樣板配置。既然它如此常見,那為什么還要你去寫呢?SpringBoot會為這些常見配置場景進行自動配置。如果SpringBoot在應(yīng)用程序的Classpath里發(fā)現(xiàn)H2數(shù)據(jù)庫的庫,那么它就自動配置一個嵌入式H2數(shù)據(jù)庫。如果在Classpath里發(fā)現(xiàn)JdbcTemplate,那么它還會為你配置一個JdbcTemplate的Bean。你無需操心那些Bean的配置,SpringBoot會做好準備,隨時都能將其注入到你的Bean里。SpringBoot的自動配置遠不止嵌入式數(shù)據(jù)庫和JdbcTemplate,它有大把的辦法幫你減輕配置負擔,這些自動配置涉及Java持久化API(JavaPersistenceAPI,JPA)、Thymeleaf模板、安全和SpringMVC。第2章會深入討論自動配置這個話題。2.起步依賴向項目中添加依賴是件富有挑戰(zhàn)的事。你需要什么庫?它的Group和Artifact是什么?你需要哪個版本?哪個版本不會和項目中的其他依賴發(fā)生沖突?SpringBoot通過起步依賴為項目的依賴管理提供幫助。起步依賴其實就是特殊的Maven依賴和Gradle依賴,利用了傳遞依賴解析,把常用庫聚合在一起,組成了幾個為特定功能而定制的依賴。舉個例子,假設(shè)你正在用SpringMVC構(gòu)造一個RESTAPI,并將JSON(JavaScriptObjectNotation)作為資源表述。此外,你還想運用遵循JSR-303規(guī)范的聲明式校驗,并使用嵌入式的Tomcat服務(wù)器來提供服務(wù)。要實現(xiàn)以上目標,你在Maven或Gradle里至少需要以下8個依賴:org.springframework:spring-coreorg.springframework:spring-weborg.springframework:spring-webmvccom.fasterxml.jackson.core:jackson-databindorg.hibernate:hibernate-validatororg.apache.tomcat.embed:tomcat-embed-coreorg.apache.tomcat.embed:tomcat-embed-elorg.apache.tomcat.embed:tomcat-embed-logging-juli不過,如果打算利用SpringBoot的起步依賴,你只需添加SpringBoot的Web起步依賴(org.springframework.boot:spring-boot-starter-web)1,僅此一個。它會根據(jù)依賴傳遞把其他所需依賴引入項目里,你都不用考慮它們。1SpringBoot起步依賴基本都以spring-boot-starter打頭,隨后是直接代表其功能的名字,比如web、test,下文出現(xiàn)起步依賴的名字時,可能就直接用其前綴后的單詞來表示了?!g者注比起減少依賴數(shù)量,起步依賴還引入了一些微妙的變化。向項目中添加了Web起步依賴,實際上指定了應(yīng)用程序所需的一類功能。因為應(yīng)用是個Web應(yīng)用程序,所以加入了Web起步依賴。與之類似,如果應(yīng)用程序要用到JPA持久化,那么就可以加入jpa起步依賴。如果需要安全功能,那就加入security起步依賴。簡而言之,你不再需要考慮支持某種功能要用什么庫了,引入相關(guān)起步依賴就行。此外,SpringBoot的起步依賴還把你從“需要這些庫的哪些版本”這個問題里解放了出來。起步依賴引入的庫的版本都是經(jīng)過測試的,因此你可以完全放心,它們之間不會出現(xiàn)不兼容的情況。和自動配置一樣,第2章就會深入討論起步依賴。3.命令行界面除了自動配置和起步依賴,SpringBoot還提供了一種很有意思的新方法,可以快速開發(fā)Spring應(yīng)用程序。正如之前在1.1節(jié)里看到的那樣,SpringBootCLI讓只寫代碼即可實現(xiàn)應(yīng)用程序成為可能。SpringBootCLI利用了起步依賴和自動配置,讓你專注于代碼本身。不僅如此,你是否注意到代碼清單1-1里沒有import?CLI如何知道RequestMapping和RestController來自哪個包呢?說到這個問題,那些類最終又是怎么跑到Classpath里的呢?說得簡單一點,CLI能檢測到你使用了哪些類,它知道要向Classpath中添加哪些起步依賴才能讓它運轉(zhuǎn)起來。一旦那些依賴出現(xiàn)在Classpath中,一系列自動配置就會接踵而來,確保啟用DispatcherServlet和SpringMVC,這樣控制器就能響應(yīng)HTTP請求了。SpringBootCLI是SpringBoot的非必要組成部分。雖然它為Spring帶來了驚人的力量,大大簡化了開發(fā),但也引入了一套不太常規(guī)的開發(fā)模型。要是這種開發(fā)模型與你的口味相去甚遠,那也沒關(guān)系,拋開CLI,你還是可以利用SpringBoot提供的其他東西。不過如果喜歡CLI,你一定想看看第5章,其中深入探討了SpringBootCLI。4.ActuatorSpringBoot的最后一塊“拼圖”是Actuator,其他幾個部分旨在簡化Spring開發(fā),而Actuator則要提供在運行時檢視應(yīng)用程序內(nèi)部情況的能力。安裝了Actuator就能窺探應(yīng)用程序的內(nèi)部情況了,包括如下細節(jié):Spring應(yīng)用程序上下文里配置的BeanSpringBoot的自動配置做的決策應(yīng)用程序取到的環(huán)境變量、系統(tǒng)屬性、配置屬性和命令行參數(shù)應(yīng)用程序里線程的當前狀態(tài)應(yīng)用程序最近處理過的HTTP請求的追蹤情況各種和內(nèi)存用量、垃圾回收、Web請求以及數(shù)據(jù)源用量相關(guān)的指標Actuator通過Web端點和shell界面向外界提供信息。如果要借助shell界面,你可以打開SSH(SecureShell),登入運行中的應(yīng)用程序,發(fā)送指令查看它的情況。第7章會詳細探索Actuator的功能。1.1.3SpringBoot不是什么因為SpringBoot實在是太驚艷了,所以過去一年多的時間里有不少和它相關(guān)的言論。原先聽到或看到的東西可能給你造成了一些誤解,繼續(xù)學習本書前應(yīng)該先澄清這些誤會。首先,SpringBoot不是應(yīng)用服務(wù)器。這個誤解是這樣產(chǎn)生的:SpringBoot可以把Web應(yīng)用程序變?yōu)榭勺詧?zhí)行的JAR文件,不用部署到傳統(tǒng)Java應(yīng)用服務(wù)器里就能在命令行里運行。SpringBoot在應(yīng)用程序里嵌入了一個Servlet容器(Tomcat、Jetty或Undertow),以此實現(xiàn)這一功能。但這是內(nèi)嵌的Servlet容器提供的功能,不是SpringBoot實現(xiàn)的。與之類似,SpringBoot也沒有實現(xiàn)諸如JPA或JMS(JavaMessageService,Java消息服務(wù))之類的企業(yè)級Java規(guī)范。它的確支持不少企業(yè)級Java規(guī)范,但是要在Spring里自動配置支持那些特性的Bean。例如,SpringBoot沒有實現(xiàn)JPA,不過它自動配置了某個JPA實現(xiàn)(比如Hibernate)的Bean,以此支持JPA。最后,SpringBoot沒有引入任何形式的代碼生成,而是利用了Spring4的條件化配置特性,以及Maven和Gradle提供的傳遞依賴解析,以此實現(xiàn)Spring應(yīng)用程序上下文里的自動配置。簡而言之,從本質(zhì)上來說,SpringBoot就是Spring,它做了那些沒有它你自己也會去做的SpringBean配置。謝天謝地,幸好有Spring,你不用再寫這些樣板配置了,可以專注于應(yīng)用程序的邏輯,這些才是應(yīng)用程序獨一無二的東西?,F(xiàn)在,你應(yīng)該對SpringBoot有了大概的認識,是時候構(gòu)建你的第一個SpringBoot應(yīng)用程序了。先從重要的事情開始,該怎么入手呢?1.2SpringBoot入門從根本上來說,SpringBoot的項目只是普通的Spring項目,只是它們正好用到了SpringBoot的起步依賴和自動配置而已。因此,那些你早已熟悉的從頭創(chuàng)建Spring項目的技術(shù)或工具,都能用于SpringBoot項目。然而,還是有一些簡便的途徑可以用來開啟一個新的SpringBoot項目。最快的方法就是安裝SpringBootCLI,安裝后就可以開始寫代碼,如代碼清單1-1,接著通過CLI來運行就好。1.2.1安裝SpringBootCLI如前文所述,SpringBootCLI提供了一種有趣的、不同尋常的Spring應(yīng)用程序開發(fā)方式。第5章里會詳細解釋CLI提供的功能。這里先來看看如何安裝SpringBootCLI,這樣才能運行代碼清單1-1。SpringBootCLI有好幾種安裝方式。用下載的分發(fā)包進行安裝。用GroovyEnvironmentManager進行安裝。通過OSXHomebrew進行安裝。使用MacPorts進行安裝。我們分別看一下這幾種方式。除此之外,還要了解如何安裝SpringBootCLI的命令行補全支持,如果你在BASH或zshshell里使用CLI,這會非常有用(抱歉了,各位Windows用戶)。先來看看如何用分發(fā)包手工安裝SpringBootCLI吧。1.手工安裝SpringBootCLI安裝SpringBootCLI最直接的方法大約是下載、解壓,隨后將它的bin目錄添加到系統(tǒng)路徑里。你可以從以下兩個地址下載分發(fā)包:\hhttp://repo.spring.io/release/org/springframework/boot/spring-boot-cli/1.3.0.RELEASE/spring-boot-cli-1.3.0.RELEASE-bin.zip\hhttp://repo.spring.io/release/org/springframework/boot/spring-boot-cli/1.3.0.RELEASE/spring-boot-cli-1.3.0.RELEASE-bin.tar.gz下載完成之后,把它解壓到文件系統(tǒng)的任意目錄里。在解壓后的目錄里,你會找到一個bin目錄,其中包含了一個spring.bat腳本(用于Windows環(huán)境)和一個spring腳本(用于Unix環(huán)境)。把這個bin目錄添加到系統(tǒng)路徑里,然后就能使用SpringBootCLI了。為SpringBoot建立符號鏈接如果是在安裝了Unix的機器上使用SpringBootCLI,最好建立一個指向解壓目錄的符號鏈接,然后把這個符號鏈接添加到系統(tǒng)路徑,而不是實際的目錄。這樣后續(xù)升級SpringBoot新版本,或是轉(zhuǎn)換版本,都會很方便,只要重建一下符號鏈接,指向新版本就好了。你可以先淺嘗輒止,看看你所安裝的CLI版本號:$spring--version
如果一切正常,你會看到安裝好的SpringBootCLI的版本號。雖然這是手工安裝,但一切都很容易,而且不要求你安裝任何附加的東西。如果你是Windows用戶,也別無選擇,這是唯一的安裝方式。但如果你使用的是Unix機器,而且想要稍微自動化一點的方式,那么可以試試SoftwareDevelopmentKitManager。2.使用SoftwareDevelopmentKitManager進行安裝軟件開發(fā)工具管理包(SoftwareDevelopmentKitManager,SDKMAN,曾用簡稱GVM)也能用來安裝和管理多版本SpringBootCLI。使用前,你需要先從\hhttp://sdkman.io獲取并安裝SDKMAN。最簡單的安裝方式是使用命令行:$curl-sget.sdkman.io|bash
跟隨輸出的指示就能完成SDKMAN的安裝。在我的機器上,我在命令行里執(zhí)行了如下命令:$source"/Users/habuma/.sdkman/bin/sdkman-init.sh"
注意,用戶不同,這條命令也會有所不同。我的用戶目錄是/Users/habuma,因此這也是shell腳本的根路徑。你需要根據(jù)實際情況稍作調(diào)整。一旦安裝好了SDKMAN,就可以用下面的方式來安裝SpringBootCLI了:$sdkinstallspringboot
$spring--version
假設(shè)一切正常,你將看到SpringBoot的當前版本號。如果想升級新版本的SpringBootCLI,只需安裝并使用即可。使用SDKMAN的list命令可以找到可用的版本:$sdklistspringboot
list命令列出了所有可用版本,包括已經(jīng)安裝的和正在使用的。從中選擇一個進行安裝,然后就可以正常使用。舉例來說,要安裝SpringBootCLI1.3.0.RELEASE,直接使用install命令,指定版本號:$sdkinstallspringboot1.3.0.RELEASE
這樣就會安裝一個新版本,隨后你會被詢問是否將其設(shè)置為默認版本。要是你不想把它作為默認版本,或者想要切換到另一個版本,可以用use命令:$sdkusespringboot1.3.0.RELEASE
如果你希望把那個版本作為所有shell的默認版本,可以使用default命令:$sdkdefaultspringboot1.3.0.RELEASE
使用SDKMAN來管理SpringBootCLI有一個好處,你可以便捷地在SpringBoot的不同版本之間切換。這樣你可以在正式發(fā)布前試用快照版本(snapshot)、里程碑版本(milestone)和尚未正式發(fā)布的候選版本(releasecandidate),試用后再切回穩(wěn)定版本進行其他工作。3.使用Homebrew進行安裝如果要在OSX的機器上進行開發(fā),你還可以用Homebrew來安裝SpringBootCLI。Homebrew是OSX的包管理器,用于安裝多種不同應(yīng)用程序和工具。要安裝Homebrew,最簡單的方法就是運行安裝用的Ruby腳本:ruby-e"$(curl-fsSL/Homebrew/install/master/install)"
你可以在\hhttp://brew.sh看到更多關(guān)于Homebrew的內(nèi)容(還有安裝方法)。要用Homebrew來安裝SpringBootCLI,你需要引入Pivotal的tap2:2tap是向Homebrew添加額外倉庫的一種途徑。Pivotal是Spring及SpringBoot背后的公司,通過它的tap可以安裝SpringBoot。$brewtappivotal/tap
在有了Pivotal的tap后,就可以像下面這樣安裝SpringBootCLI了:$brewinstallspringboot
Homebrew會把SpringBootCLI安裝到/usr/local/bin,之后可以直接使用??梢酝ㄟ^檢查版本號來驗證安裝是否成功:$spring--version
這條命令應(yīng)該會返回剛才安裝的SpringBoot版本號。你也可以運行代碼清單1-1看看。4.使用MacPorts進行安裝OSX用戶還有另一種安裝SpringBootCLI的方法,即使用MacPorts,這是MacOSX上另一個流行的安裝工具。要使用MacPorts來安裝SpringBootCLI,必須先安裝MacPorts,而MacPorts還要求安裝Xcode。此外,使用不同版本的OSX時,MacPorts的安裝步驟也會有所不同。因此我建議你根據(jù)\h/install.php的安裝指南來安裝MacPorts。一旦安裝好了MacPorts,就可以用以下命令來安裝SpringBootCLI了:$sudoportinstallspring-boot-cli
MacPorts會把SpringBootCLI安裝到/opt/local/share/java/spring-boot-cli,并在/opt/local/bin里放一個指向其可執(zhí)行文件的符號鏈接。在安裝MacPorts后,/opt/local/bin這個目錄應(yīng)該就在系統(tǒng)路徑里了。你可以檢查版本號來驗證安裝是否成功:$spring--version
這條命令應(yīng)該會返回剛才安裝的SpringBoot的版本號。你也可以運行代碼清單1-1,看看效果如何。5.開啟命令行補全SpringBootCLI為基于CLI的應(yīng)用程序的運行、打包和測試提供了一套好用的命令。而且,每個命令都有好多選項。要記住這些東西實屬不易,命令行補全能幫助記憶怎么使用SpringBootCLI。如果用Homebrew安裝SpringBootCLI,那么命令行補全已經(jīng)安裝完畢。但如果是手工安裝或者用SDKMAN安裝的,那就需要執(zhí)行腳本或者手工安裝。(如果是通過MacPorts安裝的SpringBootCLI,那么你不必考慮命令行補全。)你可以在SpringBootCLI安裝目錄的shell-completion子目錄里找到補全腳本。有兩個不同的腳本,一個是針對BASH的,另一個是針對zsh的。要使用BASH的補全腳本,可以在命令行里鍵入以下命令(假設(shè)安裝時用的是SDKMAN):$.~/.sdkman/springboot/current/shell-completion/bash/spring
這樣,在當前的shell里就可以使用SpringBootCLI的補全功能了,但每次開啟一個新的shell都要重新執(zhí)行一次上面的命令才行。你也可以把這個腳本復(fù)制到你的個人或系統(tǒng)腳本目錄里,這個目錄的位置在不同的Unix里也會有所不同,可以參考系統(tǒng)文檔(或Google)了解細節(jié)。開啟了命令行補全之后,在命令行里鍵入spring命令,然后按Tab鍵就能看到下一步該輸什么的提示。選中一個命令后,鍵入--(兩個連字符)后再按Tab,就會顯示出該命令的選項列表。如果你在Windows上進行開發(fā),或者沒有用BASH或zsh,那就無緣使用這些命令行補全腳本了。盡管如此,如果你用的是SpringBootCLI的shell,那一樣也有命令補全:$springshell
和BASH、zsh的命令補全腳本(在BASH/zshshell里執(zhí)行的)不同,SpringBootCLIshell會新開一個特別針對SpringBoot的shell,在里面可以執(zhí)行各種CLI命令,Tab鍵也能有命令補全。SpringBootCLI為SpringBoot提供了快速上手和構(gòu)建簡單原型應(yīng)用程序的途徑。稍后將在第8章中講到,在正確的生產(chǎn)運行時環(huán)境下,它也能用于開發(fā)生產(chǎn)應(yīng)用程序。盡管如此,與大部分Java項目的開發(fā)相比,SpringBootCLI的流程還是不太符合常規(guī)。通常情況下,Java項目用Gradle或Maven這樣的工具構(gòu)建出WAR文件,再把這些文件部署到應(yīng)用服務(wù)器里。即便CLI模型讓你感到不太舒服,你仍然可以在傳統(tǒng)方式下充分利用大部分SpringBoot特性。3SpringInitializr可以成為你萬里長征的第一步。3只是要放棄那些用到Groovy語言靈活性的特性,比如自動依賴和import解析。1.2.2使用SpringInitializr初始化SpringBoot項目萬事開頭難,你需要設(shè)置一個目錄結(jié)構(gòu)存放各種項目內(nèi)容,創(chuàng)建構(gòu)建文件,并在其中加入各種依賴。SpringBootCLI消除了不少設(shè)置工作,但如果你更傾向于傳統(tǒng)Java項目結(jié)構(gòu),那你應(yīng)該看看SpringInitializr。SpringInitializr從本質(zhì)上來說就是一個Web應(yīng)用程序,它能為你生成SpringBoot項目結(jié)構(gòu)。雖然不能生成應(yīng)用程序代碼,但它能為你提供一個基本的項目結(jié)構(gòu),以及一個用于構(gòu)建代碼的Maven或Gradle構(gòu)建說明文件。你只需要寫應(yīng)用程序的代碼就好了。SpringInitializr有幾種用法。通過Web界面使用。通過SpringToolSuite使用。通過IntelliJIDEA使用。使用SpringBootCLI使用。下面分別看看這幾種用法,先從Web界面開始。1.使用SpringInitializr的Web界面要使用SpringInitializr,最直接的辦法就是用瀏覽器打開\hhttp://start.spring.io,你應(yīng)該能看到類似圖1-1的一個表單。表單的頭兩個問題是,你想用Maven還是Gradle來構(gòu)建項目,以及使用SpringBoot的哪個版本。程序默認生成Maven項目,并使用SpringBoot的最新版本(非里程碑和快照版本),但你也可以自由選擇其他選項。表單左側(cè)要你指定項目的一些基本信息。最起碼你要提供項目的Group和Artifact,但如果你點擊了“Switchtothefullversion”鏈接,還可以指定額外的信息,比如版本號和基礎(chǔ)包名。這些信息是用來生成Maven的pom.xml文件(或者Gradle的build.gradle文件)的。圖1-1SpringInitializr是生成空Spring項目的Web應(yīng)用程序,可以視為開發(fā)過程的第一步表單右側(cè)要你指定項目依賴,最簡單的方法就是在文本框里鍵入依賴的名稱。隨著你的輸入會出現(xiàn)匹配依賴的列表,選中一個(或多個)依賴,選中的依賴就會加入項目。如果找不到你要的依賴,點擊“Switchtothefullversion”就能看到可用依賴的完整列表。要是你瞄過一眼附錄B,就會發(fā)現(xiàn)這里的依賴和SpringBoot起步依賴是對應(yīng)的。實際上,在這里選中依賴,就相當于告訴Initializr把對應(yīng)的起步依賴加到項目的構(gòu)建文件里。(第2章會進一步討論SpringBoot起步依賴。)填完表單,選好依賴,點擊“GenerateProject”按鈕,SpringInitializr就會為你生成一個項目。瀏覽器將會以ZIP文件的形式(文件名取決于Artifact字段的內(nèi)容)把這個項目下載下來。根據(jù)你的選擇,ZIP文件的內(nèi)容也會略有不同。不管怎樣,ZIP文件都會包含一個極其基礎(chǔ)的項目,讓你能著手使用SpringBoot開發(fā)應(yīng)用程序。舉例來說,假設(shè)你在SpringInitializr里指定了如下信息。Artifact:myapp包名:myapp類型:Gradle項目依賴:Web和JPA點擊“GenerateProject”,就能獲得一個名為myapp.zip的ZIP文件。解壓后的項目結(jié)構(gòu)同圖1-2類似。圖1-2Initializr創(chuàng)建的項目,提供了構(gòu)建SpringBoot應(yīng)用程序所需的基本內(nèi)容如你所見,項目里基本沒有代碼,除了幾個空目錄外,還包含了如下幾樣?xùn)|西。build.gradle:Gradle構(gòu)建說明文件。如果選擇Maven項目,這就會換成pom.xml。Application.java:一個帶有main()方法的類,用于引導(dǎo)啟動應(yīng)用程序。ApplicationTests.java:一個空的JUnit測試類,它加載了一個使用SpringBoot自動配置功能的Spring應(yīng)用程序上下文。perties:一個空的properties文件,你可以根據(jù)需要添加配置屬性。在SpringBoot應(yīng)用程序中,就連空目錄都有自己的意義。static目錄放置的是Web應(yīng)用程序的靜態(tài)內(nèi)容(JavaScript、樣式表、圖片,等等)。還有,稍后你將看到,用于呈現(xiàn)模型數(shù)據(jù)的模板會放在templates目錄里。你很可能會把Initializr生成的項目導(dǎo)入IDE。如果你用的IDE是SpringToolSuite,則可以直接在IDE里創(chuàng)建項目。下面來看看SpringToolSuite是怎么創(chuàng)建SpringBoot項目的。2.在SpringToolSuite里創(chuàng)建SpringBoot項目長久以來,SpringToolSuite4一直都是開發(fā)Spring應(yīng)用程序的不二之選。從3.4.0版本開始,它就集成了SpringInitializr,這讓它成為開始上手SpringBoot的好方法。4SpringToolSuite是EclipseIDE的一個發(fā)行版,增加了諸多能輔助Spring開發(fā)的特性。你可以從\h\hhttp://spring.io/tools/sts\h下載SpringToolSuite。要在SpringToolSuite里創(chuàng)建新的SpringBoot應(yīng)用程序,在File菜單里選中New>SpringStarterProject菜單項,隨后SpringToolSuite會顯示一個與圖1-3相仿的對話框。圖1-3SpringToolSuite集成了SpringInitializr,可以在IDE里創(chuàng)建并直接導(dǎo)入SpringBoot項目如你所見,這個對話框要求填寫的信息和SpringInitializr的Web界面里是一樣的。事實上,你在這里提供的數(shù)據(jù)會被發(fā)送給SpringInitializr,用于創(chuàng)建項目ZIP文件,這和使用Web表單是一樣的。如果你想在文件系統(tǒng)上指定項目創(chuàng)建的位置,或者把它加入IDE里的特定工作集,就點擊Next按鈕。你會看到第二個對話框,如圖1-4所示。圖1-4SpringStarterProject對話框的第2頁可以讓你指定在哪里創(chuàng)建項目Location指定了文件系統(tǒng)上項目的存放位置。如果你使用Eclipse的工作集來組織項目,那么也可以勾上AddProjecttoWorkingSets這個復(fù)選框,選擇一個工作集,這樣就能把項目加入指定的工作集了。SiteInfo部分簡單描述了將要用來訪問Initializr的URL,大多數(shù)情況下你都可以忽略這部分內(nèi)容。然而,如果要部署自己的Initializr服務(wù)器(從\h/spring-io/initializr復(fù)制代碼即可),你可以在這里設(shè)置Initializr基礎(chǔ)URL。點擊Finish按鈕后,項目的生成和導(dǎo)入過程就開始了。你必須認識到一點,SpringToolSuite的SpringStarterProject對話框,其實是把項目生成的工作委托給\hhttp://start.spring.io上的SpringInitializr來做的,因此必須聯(lián)網(wǎng)才能使用這一功能。一旦把項目導(dǎo)入工作空間,應(yīng)用程序就可以開發(fā)了。在開發(fā)的過程中,你會發(fā)現(xiàn)SpringToolSuite針對SpringBoot還有一些錦上添花的功能。比如,可以在Run菜單里選中RunAs>SpringBootApplication,在嵌入式服務(wù)器里運行你的應(yīng)用程序。注意,SpringToolSuite是通過RESTAPI與Initializr交互的,因此只有連上Initializr它才能正常工作。如果你的開發(fā)機離線,或者Initializr被防火墻阻斷了,那么SpringToolSuite的SpringStarterProject向?qū)菬o法使用的。3.在IntelliJIDEA里創(chuàng)建SpringBoot項目IntelliJIDEA是非常流行的IDE,IntelliJIDEA14.1已經(jīng)支持SpringBoot了!55你可以從\h\h/idea/\h獲取IntelliJIDEA。它是一款商業(yè)IDE,這意味著你需要付費使用。但是你可以下載試用版,它對開源項目免費。要在IntelliJIDEA里創(chuàng)建新的SpringBoot應(yīng)用程序,在File菜單里選擇New>Project。你會看到幾屏內(nèi)容(圖1-5是第一屏),問的問題和Initializr的Web應(yīng)用程序以及SpringToolSuite類似。圖1-5IntelliJIDEA里SpringBoot初始化向?qū)У牡谝黄猎谑紫蕊@示的這一屏中,在左側(cè)項目選擇里選中SpringInitializr,隨后會提示你選擇一個ProjectSDK(基本上就是這個項目要用的JavaSDK),同時選擇InitializrWeb服務(wù)的位置。除非你在使用自己的Initializr,否則應(yīng)該不做任何修改直接點Next按鈕,之后就到了圖1-6。圖1-6在IntelliJIDEA的SpringBoot初始化向?qū)Ю镏付椖啃畔pringBoot初始化向?qū)У牡诙烈竽闾峁╉椖康囊恍┗拘畔?,比如項目名稱、MavenGroup和Artifact、Java版本,以及你是想用Maven還是Gradle來構(gòu)建項目。描述好項目信息之后,點擊Next按鈕就能看到第三屏了,如圖1-7所示。圖1-7在IntelliJIDEA的SpringBoot初始化向?qū)Ю镞x擇項目依賴第二屏向你詢問項目的基本信息,第三屏就開始問你要往項目里添加什么依賴了。和之前一樣,屏幕里的復(fù)選框和SpringBoot起步依賴是對應(yīng)的。選完之后點擊Next就到了向?qū)У淖詈笠黄?,如圖1-8所示。圖1-8IntelliJIDEA的SpringBoot初始化向?qū)У淖詈笠黄磷詈笠黄羻柲沩椖拷惺裁疵?,還有要在哪里創(chuàng)建項目。一切準備就緒之后,點擊Finish按鈕,就能在IDE里得到一個空的SpringBoot項目了。4.在SpringBootCLI里使用Initializr如前文所述,如果你想僅僅寫代碼就完成Spring應(yīng)用程序的開發(fā),那么SpringBootCLI是個不錯的選擇。然而,SpringBootCLI的功能還不限于此,它有一些命令可以幫你使用Initializr,通過它上手開發(fā)更傳統(tǒng)的Java項目。SpringBootCLI包含了一個init命令,可以作為Initializr的客戶端界面。init命令最簡單的用法就是創(chuàng)建SpringBoot項目的基線:$springinit
在和Initializr的Web應(yīng)用程序通信后,init命令會下載一個demo.zip文件。解壓后你會看到一個典型的項目結(jié)構(gòu),包含一個Maven的pom.xml構(gòu)建描述文件。Maven的構(gòu)建說明只包含最基本的內(nèi)容,即只有SpringBoot基線和測試起步依賴。你可能會想要更多的東西。假設(shè)你想要構(gòu)建一個Web應(yīng)用程序,其中使用JPA實現(xiàn)數(shù)據(jù)持久化,使用SpringSecurity進行安全加固,可以用--dependencies或-d來指定那些初始依賴:$springinit-dweb,jpa,security
這條命令會下載一個demo.zip文件,包含與之前一樣的項目結(jié)構(gòu),但在pom.xml里增加了SpringBoot的Web、jpa和security起步依賴。請注意,在-d和依賴之間不能加空格,否則就變成了下載一個ZIP文件,文件名是web,jpa,security。現(xiàn)在,假設(shè)你想用Gradle來構(gòu)建項目。沒問題,用--build參數(shù)將Gradle指定為構(gòu)建類型:$springinit-dweb,jpa,security--buildgradle
默認情況下,無論是Maven還是Gradle的構(gòu)建說明都會產(chǎn)生一個可執(zhí)行JAR文件。但如果你想要一個WAR文件,那么可以通過--packaging或者-p參數(shù)進行說明:$springinit-dweb,jpa,security--buildgradle-pwar
到目前為止,init命令只用來下載ZIP文件。如果你想讓CLI幫你解壓那個ZIP文件,可以指定一個用于解壓的目錄:$springinit-dweb,jpa,security--buildgradle-pwarmyapp
此處的最后一個參數(shù)說明你希望把項目解壓到myapp目錄里去。此外,如果你希望CLI把生成的項目解壓到當前目錄,可以使用--extract或者-x參數(shù):$springinit-dweb,jpa,security--buildgradle-pjar-x
init命令還有不少其他參數(shù),包括基于Groovy構(gòu)建項目的參數(shù)、指定用Java版本編譯的參數(shù),還有選擇構(gòu)建依賴的SpringBoot版本的參數(shù)。可以通過help命令了解所有參數(shù)的情況:$springhelpinit
你也可以查看那些參數(shù)都有哪些可選項,為init命令帶上--list或-l參數(shù)就可以了:$springinit-l
你一定注意到了,盡管springinit-l列出了一些Initializr支持的參數(shù),但并非所有參數(shù)都能直接為SpringBootCLI的init命令所支持。舉例來說,用CLI初始化項目時,你不能指定根包的名字,它默認為demo。springhelpinit會告訴你CLI的init命令都支持哪些參數(shù)。無論你是用Initializr的Web界面,在SpringToolSuite里創(chuàng)建項目,還是用SpringBootCLI來初始化項目,SpringBootInitializr創(chuàng)建出來的項目都有相似的項目布局,和你之前開發(fā)過的Java項目沒什么不同。1.3小結(jié)SpringBoot為Spring應(yīng)用程序的開發(fā)提供了一種激動人心的新方式,框架本身帶來的阻力很小。自動配置消除了傳統(tǒng)Spring應(yīng)用程序里的很多樣板配置;SpringBoot起步依賴讓你能通過庫所提供的功能而非名稱與版本號來指定構(gòu)建依賴;SpringBootCLI將SpringBoot的無阻礙開發(fā)模型提升到了一個嶄新的高度,在命令行里就能簡單快速地用Groovy進行開發(fā);Actuator讓你能深入運行中的應(yīng)用程序,了解SpringBoot做了什么,是怎么做的。本章大致概括了SpringBoot的功能。你大概已經(jīng)躍躍欲試,想用SpringBoot來寫個真實的應(yīng)用程序了吧。這正是我們在下一章里要做的事情。有了SpringBoot提供的諸多功能,最困難的不過是把書翻到第2章。
第2章開發(fā)第一個應(yīng)用程序本章內(nèi)容使用SpringBoot起步依賴自動進行Spring配置你上次在超市或大型零售商店自己推開門是什么時候?大多數(shù)大型商店都安裝了帶感應(yīng)功能的自動門,雖然所有門都能讓你進入建筑物內(nèi),但自動門不用你動手推拉。與之類似,很多公共場所的衛(wèi)生間里都裝有自動感應(yīng)水龍頭和自動感應(yīng)紙巾機。雖然沒有超市自動門這么普及,但這些設(shè)施同樣對你沒有太多要求,可以很方便地出水和紙巾。說實話,我已經(jīng)不記得上次看到制冰盒是什么時候了,更不記得自己往里面倒水制冰或者取冰的事了。我的冰箱就是這么神奇,總是有冰,讓我隨時都能喝上冰水。我敢打賭你也能想出無數(shù)例子,證明設(shè)備讓現(xiàn)代生活更加自動化,而不是增加障礙。有了這些自動化的便利設(shè)施,你會認為在開發(fā)任務(wù)里也會出現(xiàn)更多的自動化。但是很奇怪,事實并非如此。直到最近,要用Spring創(chuàng)建應(yīng)用程序,你還需要為框架做很多事情。當然,Spring提供了很多優(yōu)秀的特性,用于開發(fā)令人驚訝的應(yīng)用程序。但是,你需要自己往項目的構(gòu)建說明文件里添加各種庫依賴,還要自己寫配置文件,告訴Spring要做什么。SpringBoot將Spring開發(fā)的自動化程度提升到了一個新的高度,在本章我們會看到兩種新方法:起步依賴和自動配置。在項目中啟用Spring不僅枯燥乏味,還讓人分神,你將看到這些基礎(chǔ)的SpringBoot特性是如何將你解放出來,讓你集中精力開發(fā)應(yīng)用程序的。與此同時,你會寫一個很小的Spring應(yīng)用程序,麻雀雖小,五臟俱全,其中會用上SpringBoot。2.1運用SpringBoot你正在閱讀本書,說明你是一位讀書人。也許你是一個書蟲,博覽群書;也許你只讀自己需要的東西,拿起本書只是為了知道怎么用Spring開發(fā)應(yīng)用程序。無論何種情況,你都是一位讀書人,是讀書人便有心維護一個閱讀列表,里面是自己想讀或者需要讀的書。就算沒有白紙黑字的列表,至少在你心里會有這么一個列表。11如果你不是一個讀書人,就把書換成想看的電影、想去的餐廳,只要合適自己就好。在本書中,我們會構(gòu)建一個簡單的閱讀列表應(yīng)用程序。在這個程序里,用戶可以輸入想讀的圖書信息,查看列表,刪除已經(jīng)讀過的書。我們將使用SpringBoot來輔助快速開發(fā),各種繁文縟節(jié)越少越好。開始前,我們需要先初始化一個項目。在第1章里,我們看到了好幾種從SpringInitializr開始SpringBoot開發(fā)的方法。因為選擇哪種方法都行,所以要選個最合適的,著手用SpringBoot開發(fā)就好了。從技術(shù)角度來看,我們要用SpringMVC來處理Web請求,用Thymeleaf來定義Web視圖,用SpringDataJPA來把閱讀列表持久化到數(shù)據(jù)庫里,姑且先用嵌入式的H2數(shù)據(jù)庫。雖然也可以用Groovy,但是我們還是先用Java來開發(fā)這個應(yīng)用程序吧。此外,我們使用Gradle作為構(gòu)建工具。無論是用Web界面、SpringToolSuite還是IntelliJIDEA,只要用了Initializr,你就要確保勾選了Web、Thymeleaf和JPA這幾個復(fù)選框。還要記得勾上H2復(fù)選框,這樣才能在開發(fā)應(yīng)用程序時使用這個內(nèi)嵌式數(shù)據(jù)庫。至于項目元信息,就隨便你寫了。以閱讀列表為例,我創(chuàng)建項目時使用了圖2-1中的信息。圖2-1通過Initializr的Web界面初始化閱讀列表應(yīng)用程序如果你創(chuàng)建項目時用的是SpringToolSuite或者IntelliJIDEA,那么把圖2-1的內(nèi)容適配成IDE需要的東西就好了。另一方面,如果用SpringBootCLI來初始化應(yīng)用程序,可以在命令行里鍵入以下內(nèi)容:$springinit-dweb,data-jpa,h2,thymeleaf--buildgradlereadinglist
請記住,CLI的init命令是不能指定項目根包名和項目名的。包名默認是demo,項目名默認是Demo。在項目創(chuàng)建完畢之后,你可以打開項目,把包名demo改為readinglist,把DemoApplication.java改名為ReadingListApplication.java。項目創(chuàng)建完畢后,你應(yīng)該能看到一個類似圖2-2的項目結(jié)構(gòu)。圖2-2初始化后的readinglist項目結(jié)構(gòu)這個項目結(jié)構(gòu)基本上和第1章里Initializr生成的結(jié)構(gòu)是一樣的,只不過你現(xiàn)在真的要去開發(fā)應(yīng)用程序了,所以讓我們先放慢腳步,仔細看看初始化的項目里都有什么東西。2.1.1查看初始化的SpringBoot新項目圖2-2中值得注意的第一件事是,整個項目結(jié)構(gòu)遵循傳統(tǒng)Maven或Gradle項目的布局,即主要應(yīng)用程序代碼位于src/main/java目錄里,資源都在src/main/resources目錄里,測試代碼則在src/test/java目錄里。此刻還沒有測試資源,但如果有的話,要放在src/test/resources里。再進一步,你會看到項目里還有不少文件。build.gradle:Gradle構(gòu)建說明文件。ReadingListApplication.java:應(yīng)用程序的啟動引導(dǎo)類(bootstrapclass),也是主要的Spring配置類。perties:用于配置應(yīng)用程序和SpringBoot的屬性。ReadingListApplicationTests.java:一個基本的集成測試類。因為構(gòu)建說明文件里有很多SpringBoot的優(yōu)點尚未揭秘,所以我打算把最好的留到最后,先讓我們來看看ReadingListApplication.java。1.啟動引導(dǎo)SpringReadingListApplication在SpringBoot應(yīng)用程序里有兩個作用:配置和啟動引導(dǎo)。首先,這是主要的Spring配置類。雖然SpringBoot的自動配置免除了很多Spring配置,但你還需要進行少量配置來啟用自動配置。正如代碼清單2-1所示,這里只有一行配置代碼。代碼清單2-1ReadingListApplication.java不僅是啟動引導(dǎo)類,還是配置類packagereadinglist;
importorg.springframework.boot.SpringApplication;
importorg.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication←開啟組件掃描和自動配置
publicclassReadingListApplication{
publicstaticvoidmain(String[]args){
SpringApplication.run(ReadingListApplication.class,args);←負責啟動引導(dǎo)應(yīng)用程序
}
}
@SpringBootApplication開啟了Spring的組件掃描和SpringBoot的自動配置功能。實際上,@SpringBootApplication將三個有用的注解組合在了一起。Spring的@Configuration:標明該類使用Spring基于Java的配置。雖然本書不會寫太多配置,但我們會更傾向于使用基于Java而不是XML的配置。Spring的@ComponentScan:啟用組件掃描,這樣你寫的Web控制器類和其他組件才能被自動發(fā)現(xiàn)并注冊為Spring應(yīng)用程序上下文里的Bean。本章稍后會寫一個簡單的SpringMVC控制器,使用@Controller進行注解,這樣組件掃描才能找到它。SpringBoot的@EnableAutoConfiguration:這個不起眼的小注解也可以稱為@Abracadabra2,就是這一行配置開啟了SpringBoot自動配置的魔力,讓你不用再寫成篇的配置了。2abracadabra的意思是咒語?!g者注在SpringBoot的早期版本中,你需要在ReadingListApplication類上同時標上這三個注解,但從SpringBoot1.2.0開始,有@SpringBootApplication就行了。如我所說,ReadingListApplication還是一個啟動引導(dǎo)類。要運行SpringBoot應(yīng)用程序有幾種方式,其中包含傳統(tǒng)的WAR文件部署。但這里的main()方法讓你可以在命令行里把該應(yīng)用程序當作一個可執(zhí)行JAR文件來運行。這里向SpringApplication.run()傳遞了一個ReadingListApplication類的引用,還有命令行參數(shù),通過這些東西啟動應(yīng)用程序。實際上,就算一行代碼也沒寫,此時你仍然可以構(gòu)建應(yīng)用程序嘗嘗鮮。要構(gòu)建并運行應(yīng)用程序,最簡單的方法就是用Gradle的bootRun任務(wù):$gradlebootRun
bootRun任務(wù)來自SpringBoot的Gradle插件,我們會在2.1.2節(jié)里詳細討論。此外,你也可以用Gradle構(gòu)建項目,然后在命令行里用java來運行它:$gradlebuild
...
$java-jarbuild/libs/readinglist-0.0.1-SNAPSHOT.jar
應(yīng)用程序應(yīng)該能正常運行,啟動一個監(jiān)聽8080端口的Tomcat服務(wù)器。要是愿意,你可以用瀏覽器訪問\hhttp://localhost:8080,但由于還沒寫控制器類,你只會收到一個HTTP404(NOTFOUND)錯誤,看到錯誤頁面。在本章結(jié)束前,這個URL將會提供一個閱讀列表應(yīng)用程序。你幾乎不需要修改ReadingListApplication.java。如果你的應(yīng)用程序需要SpringBoot自動配置以外的其他Spring配置,一般來說,最好把它寫到一個單獨的@Configuration標注的類里。(組件掃描會發(fā)現(xiàn)并使用這些類的。)極度簡單的情況下,可以把自定義配置加入ReadingListApplication.java。2.測試SpringBoot應(yīng)用程序Initializr還提供了一個測試類的骨架,可以基于它為你的應(yīng)用程序編寫測試。但ReadingListApplicationTests(代碼清單2-2)不止是個用于測試的占位符,它還是一個例子,告訴你如何為SpringBoot應(yīng)用程序編寫測試。代碼清單2-2@SpringApplicationConfiguration加載Spring應(yīng)用程序上下文packagereadinglist;
importorg.junit.Test;
importorg.junit.runner.RunWith;
importorg.springframework.boot.test.SpringApplicationConfiguration;
importorg.springframework.test.context.junit4.SpringJUnit4ClassRunner;
importorg.springframework.test.context.web.WebAppConfiguration;
importreadinglist.ReadingListApplication;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(
classes=ReadingListApplication.class)←通過SpringBoot加載上下文
@WebAppConfiguration
publicclassReadingListApplicationTests{
@Test
publicvoidcontextLoads(){←測試加載的上下文
}
}
一個典型的Spring集成測試會用@ContextConfiguration注解標識如何加載Spring的應(yīng)用程序上下文。但是,為了充分發(fā)揮SpringBoot的魔力,這里應(yīng)該用@SpringApplicationConfiguration注解。正如你在代碼清單2-2里看到的那樣,ReadingListApplicationTests使用@SpringApplicationConfiguration注解從ReadingListApplication配置類里加載Spring應(yīng)用程序上下文。ReadingListApplicationTests里還有一個簡單的測試方法,即contextLoads()。實際上它就是個空方法。但這個空方法足以證明應(yīng)用程序上下文的加載沒有問題。如果ReadingListApplication里定義的配置是好的,就能通過測試。如果有問題,測試就會失敗。當然,現(xiàn)在這只是一個新的應(yīng)用程序,你還會添加自己的測試。但contextLoads()方法是個良好的開端,此刻可以驗證應(yīng)用程序提供的各種功能。第4章會更詳細地討論如何測試SpringBoot應(yīng)用程序。3.配置應(yīng)用程序?qū)傩訧nitializr為你生成的perties文件是一個空文件。實際上,這個文件完全是可選的,你大可以刪掉它,這不會對應(yīng)用程序有任何影響,但留著也沒什么問題。稍后,我們肯定有機會向perties里添加幾個條目。但現(xiàn)在,如果你想小試牛刀,可以加一行看看:server.port=8000
加上這一行,嵌入式Tomcat的監(jiān)聽端口就變成了8000,而不是默認的8080。你可以重新運行應(yīng)用程序,看看是不是這樣。這說明perties文件可以很方便地幫你細粒度地調(diào)整SpringBoot的自動配置。你還可以用它來指定應(yīng)用程序代碼所需的配置項。在第3章里我們會看到好幾個例子,演示perties的這兩種用法。要注意的是,你完全不用告訴SpringBoot為你加載perties,只要它存在就會被加載,Spring和應(yīng)用程序代碼都能獲取其中的屬性。我們差不多已經(jīng)把初始化的項目介紹完了,還剩最后一樣?xùn)|西,讓我們來看看SpringBoot應(yīng)用程序是如何構(gòu)建的。2.1.2SpringBoot項目構(gòu)建過程解析SpringBoot應(yīng)用程序的大部分內(nèi)容都與其他Spring應(yīng)用程序沒有什么區(qū)別,與其他Java應(yīng)用程序也沒什么兩樣,因此構(gòu)建一個SpringBoot應(yīng)用程序和構(gòu)建其他Java應(yīng)用程序的過程類似。你可以選擇Gradle或Maven作為構(gòu)建工具,描述構(gòu)建說明文件的方法和描述非SpringBoot應(yīng)用程序的方法相似。但是,SpringBoot在構(gòu)建過程中耍了些小把戲,在此需要做個小小的說明。SpringBoot為Gradle和Maven提供了構(gòu)建插件,以便輔助構(gòu)建SpringBoot項目。代碼清單2-3是Initializr創(chuàng)建的build.gradle文件,其中應(yīng)用了SpringBoot的Gradle插件。代碼清單2-3使用SpringBoot的Gradle插件buildscri
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- BIM工程師-全國《BIM應(yīng)用技能資格》模擬試卷4
- 人教版新課標高中英語必修2全套教案
- 高一化學教案:專題第三單元第一課時同素異形現(xiàn)象、同分異構(gòu)現(xiàn)象
- 2024屆重慶某中學高考化學三模試卷含解析
- 2024高中化學第二章烴和鹵代烴1-1烷烴和烯烴課時作業(yè)含解析新人教版選修5
- 2024高中物理章末質(zhì)量評估四含解析粵教版選修1-1
- 2024高中生物第五章生態(tài)系統(tǒng)及其穩(wěn)定性第4節(jié)生態(tài)系統(tǒng)的信息傳遞精練含解析新人教版必修3
- 2024高中語文第二課千言萬語總關(guān)“音”第2節(jié)耳聽為虛-同音字和同音詞訓(xùn)練含解析新人教版選修語言文字應(yīng)用
- 2024高考化學一輪復(fù)習第四章第3課時碳硅及其化合物教案魯科版
- 2024高考歷史一輪復(fù)習方案專題八中國社會主義建設(shè)道路的探索專題綜合測驗含解析人民版
- 法人代持免責協(xié)議書范本
- 園林景觀工程質(zhì)量控制要點及質(zhì)量通病防治措施詳解演示文稿
- 新生兒早期基本保健(EENC)指南要點解讀
- 磷蝦油專業(yè)知識課件
- 最小作戰(zhàn)單元-以盾棍叉戰(zhàn)法為例
- advantrol-pro v2.70學習版系統(tǒng)組態(tài)使用手冊
- 大堂經(jīng)理:黃金業(yè)務(wù)營銷講座
- 山東省建筑工程消防設(shè)計部分非強制性條文適用指引
- 內(nèi)蒙古自治區(qū)呼和浩特市《綜合能力測試》事業(yè)單位國考真題
- 陜西省咸陽市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名居民村民委員會明細及行政區(qū)劃代碼
- 綠城物業(yè)室內(nèi)公共區(qū)域清潔作業(yè)規(guī)程
評論
0/150
提交評論