天天看點

一篇文章學會spring boot(包括jms和hessian的內建)

之前在學習spring cloud微服務的時候,由于spring cloud的基礎是spring boot,是以曾簡單地了解過spring boot,但也隻是簡單的了解過而已。

而現在,需要把struts2項目改為spring boot,一開始時以為是整個項目重構,不僅限于struts2部分,是以就相對更系統、更細緻的學了一下spring boot。

整個過程由易到難,大概分成了這麼些子產品:

一、建立簡單的spring boot web項目

很多時候學一個新的東西,都需要從最簡單的地方開始,然後讓自己看到成功後的效果,這樣才能更有信心繼續下去,至于這第一步,我在寫spring cloud相關學習記錄的時候,第一篇就是spring boot,是以便不需要再寫一遍,那一篇部落格是:

springcloud微服務一:spring boot基礎項目搭建及問題處理

二、配置檔案加載類

雖然說spring boot原則上是建議去掉xml配置檔案,但是對于一個已經成型并上線運作着的項目而言,不論是代碼還是配置都是非常龐大而且複雜的。

這些配置檔案不隻是spring的、struts2的,還有spring和mq內建的,還有spring和hessian內建的等等。

僅涉及到spring和struts2的配置檔案比較好改,而spring和mq以及hessian內建的就稍微有些麻煩。

是以在一開始我心中便有了一個設想,就是mq內建和hessian內建的部分先還是以配置檔案的方式不變,等簡單易改的部分搞定後再說,于是便需要知道在沒有了web.xml檔案的spring boot項目中,我需要如何引入加載這些暫時不能去掉的xml檔案。

經了解之後發現其實還是很簡單的,隻需要自己再寫一個空的java類,然後使用兩個注解就好:

@configuration是向spring聲明這是個配置類,@importresource則是指明需要引入的配置檔案路徑。

三、使用注解給屬性指派

在過去的項目中,有一些資料存放在properties檔案中,然後在spring的xml檔案中引用,進而給特定的對象的屬性指派。

而如果整個項目改成spring boot,就需要盡可能去掉能去掉的xml配置檔案,就沒有了這種注入指派,是以還需要知道怎樣在spring boot中達到xml檔案配置一樣的指派效果。

經了解後發現也是比較簡單地,隻需要在對應的屬性上使用@value注解:

當然了,這種寫法的前提是在properties檔案中有相應的屬性配置,例如:

并且spring boot項目啟動後能夠加載到這個properties檔案,spring boot預設會加載resources目錄下的application.properties檔案,如果我們這些配置不在這個檔案中,還需要進行其他的配置,例如在application.properties檔案中使用spring.profiles.active進行指定。

四、使用注解給對象指派:

雖然說在java中有一切皆對象的說法,屬性和屬性所屬對象都統稱對象,但是這裡為了區分,我隻能在上邊更精确的說到屬性。

而上邊那種指派方式有個很明顯的缺陷,就是每個屬性都需要使用@value注解,如果這個類恰好很大,有幾十個屬性,那麼這種指派将是一個很讓人煩躁的工作。

而spring boot中也正好提供了一個更加友善的方式,隻需要一個注解,就可以引用配置檔案中的内容給整個對象指派。

例如配置檔案中有如下内容:

上邊這種寫法是yaml檔案的寫法,也就是在spring boot中預設識别properties類型的配置檔案和yaml的配置檔案。

上邊的寫法實際上等同于properties檔案中如下的寫法:

而我們要把這樣一些配置直接指派給特定對象的方式,就是使用@configurationproperties注解:

類上邊的那個注解等同于下邊被注釋掉的三個注解,當然了,不論哪種方式,實作的前提都是這個user類能夠被spring 掃描到,也就是說能夠被spring所管理。

五、filter過濾器

在原本的spring web項目中,web.xml檔案是必不可少的,啟動tomcat後就會來加載這個檔案。

通常我們都會在這個檔案中配置一些servlet以及過濾器,例如字元集過濾器,而spring boot不再使用web.xml,就需要我們能夠用其他方式解決原本web.xml中的過濾器的問題。

這裡寫一個過濾器也很簡單,要實作javax.servlet.filter接口,并借助幾個注解,隻不過這個功能應該是java自己的,而不是spring boot新提供的:

六、listener監聽器

說到了過濾器,接下來自然要說的就是監聽器,在java web項目中,過濾器和監聽器都用的很多,也都常常在web.xml檔案中有相應的配置。

在spring boot中寫一個監聽器就更加簡單,比如就僅僅是下邊的幾行代碼就夠了:

同樣的,上邊的類所實作的接口以及相應的注解也都不是spring boot的,而是javax.servlet的。

上邊例子中我們寫的是一個contextlistener,同樣的也可以寫一個requestlistener以及其他的listener,例如:

七、error錯誤頁面

在web.xml中除了配置了filter和listener外,比較常見的就還有配置error錯誤頁面,我們項目中也同樣這麼做了,是以在抛棄web.xml的時候,也必然要考慮error頁面的問題,那麼在spring boot中也同樣是非常的簡單,比如寫這樣一個類:

需要注意的是,我這種寫法是jdk1.6可用的,還有一種寫法需要jdk1.7以上版本才行,這裡就不舉例了。

并且我這裡是寫了一個新的類,我們也可以直接把具體的方法寫到啟動類那裡,效果是一樣的,隻要都能被spring 掃描到。

八、定時任務

原本項目中使用了quartz定時任務,使用了大量的xml配置檔案,這裡就使用schedule替代。

不過,這一條雖然列在了這裡,但是實際上我覺得可以不用列出來,因為這裡使用schedule代替quartz,實際上也是spring原本就有的,并不是有了spring boot之後才出現,具體的我也曾寫過相應的部落格,例如:

spring schedule定時任務(一):注解的方式

隻不過,在spring boot中更加的簡單,不需要我們再做任何的動作,隻需要這個簡單的類和注解就ok了:

九、傳回頁面

傳回頁面,在spring boot中叫引用模闆,需要特定的依賴,例如:

當然了,這隻是其中一種。

引入了相應的依賴後,我們在spring boot項目的resources目錄下的templates目錄下建立具體的html頁面,然後具體的controller中隻需要傳回相應的html的檔案名,即能成功傳回頁面。

例如templates下有index.html檔案,在controller中就可以寫成這樣:

不過這裡我覺得應該也可以使用modelandview,但并沒有嘗試,不知是否可行,而且即便可行,在性能上如何也還未曾測試。

十、spring boot 內建activemq,即jms

前文中我有說到我們原本的項目中使用了spring 整合activemq,那麼改為spring boot後不可能就把activemq扔掉,還需要找到可行的內建方案,可喜的是,spring boot中有jms專門內建activemq。

要實作這種內建,我們首先還需要導入jms相應的依賴,建立項目的時候選擇jms,會在pom.xml檔案中生成如下内容:

使用activemq發送消息需要有消息隊列,是以接下來就需要我們生成一個消息隊列的配置類,用來指定queue:

有了隊列以後,然後就是發送消息:

就這樣簡單兩步,我們的activemq消息伺服器就算是寫好了,如果再其他地方調用這個service中對應的方法,就可以實作消息的發送。

有了發送端,還需要有接受端,或者說消費端。也是需要先配置隊列,因為我這裡都寫在一個項目中,是以就公用同一個配置就好,具體的消費端代碼如下:

不論是發送端還是消費端,代碼都很簡單,為了更直覺的看到結果,我編寫了一個controller來調用相應的服務實作發送和接受,代碼如下:

這個代碼非常的正常,也就不做多的解釋了。

十一、spring boot中使用hessian

mq分為發送端和消費端,而hessian作為一種webservice,也是一樣具有服務端和消費端,不過與mq不同的是,hessian需要在web.xml進行一定的配置。

與之前hessian的實作方式一樣的是,服務端需要有相應的接口類和實作類,例如:

而不同的是,之前使用web.xml時在web.xml中進行了配置,而在這裡則是使用了一個類來暴露接口:

就這樣,在不使用web.xml的情況下我們也一樣實作了spring boot和hessian服務端的內建,或者更準确的說,是spring和hessian服務端的內建。

而至于用戶端的內建,目前我還沒有整出可行的方案,是以便隻能繼續先使用之前xml檔案配置的方式,引入這個xml檔案然後進行後續的操作,具體的不用xml的方式還需要進一步探索,如果有朋友用過,歡迎指點和交流!