javascript
Spring新手教程
基于《Spring實戰》第五版進行學習
讓我們來一起學習Java Spring吧!
Spring基礎
介紹
Spring 的核心是一個容器,通常稱為 Spring 應用程序上下文,用于創建和管理應用程序組件。**這些組件(或 bean)**在 Spring 應用程序上下文中連接在一起以構成一個完整的應用程序。
將 bean 連接在一起的行為是基于一種稱為 依賴注入(DI)的模式。依賴項注入的應用程序不是由組件自身創建和維護它們依賴的其他 bean 的生命周期,而是依賴于單獨的實體(容器)來創建和維護所有組件,并將這些組件注入需要它們的 bean。通常通過構造函數參數或屬性訪問器方法完成此操作。
如product service依賴(即內部需要一個)inventory service,在Spring中其框架如下:
傳統方式是使用XML進行配置:
<bean id="inventoryService" class="com.example.InventoryService" /> <bean id="productService" class="com.example.ProductService" ><constructor-arg ref="inventoryService" /> </bean>但是上面的方式不太放便,現在常用的是利用Java注解的方式:
@Configuration:向spring表明其是一個配置類 public class ServiceConfiguration {@Bean:指示其返回的是一個Bean組件public InventoryService inventoryService() {return new InventoryService();}@Bean:同上,同時還依賴了上一個beanpublic ProductService productService() {return new ProductService(inventoryService());} }使用注解的方式是基于自動配置和自動掃描。
現在可以利用https://start.spring.io/實現快速的Spring項目框架搭建。
有關Spring的注解詳情,可參看:Spring注解與測試。
Spring MVC
Spring MVC是Spring附帶的web框架,核心是控制器的概念,其是一個處理請求并使用某種信息進行響應的類。
MVC即是:model-view-controller。
其中,controller主要負責處理相應的網絡請求,并使用JSP或Themleaf等模板來設計視圖(可視化對應的模型)。模型代表一個存取數據的對象或 JAVA POJO。它也可以帶有邏輯,在數據變化時更新控制器
如何利用Spring MVC進行Web應用的開發,可見開發Web應用。
Spring與數據庫
Spring框架下提供來JDBC和JPA來簡化和規范與數據庫的交互,大大簡化了編寫持久化層操作的時間——Spring處理數據庫。
Spring Security
應用程序安全性一直是一個重要的主題,而且似乎一天比一天重要。幸運的是,Spring 在 Spring security 中有一個健壯的安全框架。
Spring Security 解決了廣泛的應用程序安全性需求,包括身份驗證、授權和 API 安全性。
https://potoyang.gitbook.io/spring-in-action-v5/di-4-zhang-spring-an-quan
Spring配置屬性
前面已經說到,spring有兩種配置:
- Bean wiring:聲明該組件在spring中作為組件,以及應該如何相互注入;
- Property injection:如何在spring上下文設置bean;
值得一提的是,Spring的環境是所有可配置屬性的匯總,包括:
- JVM系統屬性
- 操作系統環境變量
- 命令行參數
- 應用程序屬性配置文件
它將上述四種屬性匯總到一個環境中,以至于其內的Bean都可以互相調用或注入。
Spring配置屬性包括服務器、web頁面、數據庫等等,建議需要配置相關屬性的時候再去查詢,但是需要提前看看能夠配置什么東西,以便在工作時更好地去查找。
Spring集成
Spring框架自己已經功能強大,但還可以通過與其他應用程序集成而變得更強!
REST服務
什么是REST服務?
REST不是”rest”這個單詞,而是幾個單詞的縮寫 REpresentation State Transfer,直接翻譯:表現層狀態轉移。比較通俗的說法是:URL定位資源,用HTTP動詞(GET,POST,DELETE,PUSH等)描述操作。
什么是RESTful?
基于REST構建的API就是Restful風格。
為什么使用Restful?
傳統的開發方式是用JSP來作為表現層,這有一個缺點:需要將前端的靜態HTML頁面轉換為JSP頁面,降低了開發效率,并且讓后端人員還需要關注前端的頁面。為了應對這個問題,采用前后端分離。并且Restful可以統一給PC、微信(H5)、IOS或Android提供服務,服務器至提供數據,不提供前端樣式(前端樣式就由前端來關注!)
restful詳情請見:restful。
restful實例詳見:實例。
如何使用Rest API?
Spring 應用程序可以通過以下方式使用 REST API:
-
RestTemplate —— 一個由 Spring 核心框架提供的簡單、同步 REST 客戶端。
-
Traverson —— 可感知超鏈接的同步 REST 客戶端,由 Spring HATEOAS 提供,靈感來自同名的 JavaScript 庫。
-
WebClient —— 一個在 Spring 5 中引入的響應式、異步 REST 客戶端。
發送異步消息
Spring可以使用JMS來發送洗哦阿西,也可以使用RabbitMQ以及AMQP、Kafka等消息中間件來實現消息的發送。
- JMS 是一個 Java 標準,它定義了一個用于使用消息代理的公共 API。
Spring 通過稱為 JmsTemplate 的基于模板的抽象來支持 JMS。使用 JmsTemplate,很容易從生產者端跨隊列和主題發送消息,并在消費者端接收這些消息。Spring 還支持消息驅動 POJO 的概念:簡單的 Java 對象以異步方式對隊列或主題上到達的消息做出響應。
- 想要使用RabbitMQ(AMQP協議的具體實現)或Kafka消息中間件,需要先在Spring中進行配置,暫略;
集成Spring
使用 Spring 配置,可以將多個組件組裝到數據流經的管道中。從而實現不同組件之間的消息通過傳輸管道來互相傳遞。
那么如何配置集成流(即定義數據流向)呢?
- 使用XML,一個示例如下:
上述代碼的重點在倒數幾行:定義了兩個channel,并設定了兩者之間的數據傳輸方式,最后的fileWriterChannel通道利用int-file命名空間配置了一個外部通道適配器,將消息寫入文件中。
- 使用XML方式在大型項目中不方便開發和后期更改,依舊是Java注解更好,將上述的XML實現用java注解的方式代碼如下:
- 還可以使用DSL配置,與使用Java注解方式不同,它不是通過多個bean,而后設置兩者之間的數據傳輸方式,而是直接定義一個數據流向的bean,直接看代碼:
**注:**IntergrationFlow是Spring中的集成類。
使用Spring Integration的DSL可以實現怎樣的功能?
集成流由以下一個或多個組件組成:
- channel:信息從一個組件到另一個組件;
- Filters:只允許一些滿足條件的數據通過集成流;
- Transformers:對消息進行一些數據處理,一般是數據類型的轉換;
- Routers:通常是基于消息頭將信息發送到幾個渠道之一;
- Splitters:將消息分為多條,傳送到不同的渠道;
- Aggregators:將多條消息聚合為一條,分類器的冤家;
- Service activators:將消息傳送給java方法,而后傳輸返回值到輸出;
- Channel adapters:將通道連接到某些外部系統或傳輸;
- Gateways:通過相應的接口將數據傳遞到集成流;
**注:**所謂Spring集成就是實現多個組件之間的數據交互;
響應式Spring
Reactor就是一個常用的事件反應模型。
什么是Reactor?
當我們開發應用程序時,有兩種風格的代碼我們可以寫——命令式和響應式:
-
命令式(同步式) 的代碼是一套串行任務,每次運行一個,完成前一個任務后再完成后一個。數據是批量進行處理的,在前面的任務沒有完成批量數據處理前,不能將工作移交到下一個任務。
-
響應式 定義一組任務去處理數據,但這些任務可并行運行。每個任務處理這些數據的一個子集,當它處理另外一個子集的時候,把處理完成的數據交給下一個任務。
應用于一個真實世界的類比就是,**將命令式編程看做一個裝水的氣球,響應式編程看做花園里面的水管。**兩者都是在炎熱的夏天讓你的朋友驚喜并沉浸其中的方式。但是它們的執行風格是不同的:
-
命令式 一個水氣球一次能攜帶的它的有效載荷,在撞擊的那一刻浸濕了它預定的目標。然而,水球的容量是有限的,如果你想用水泡更多的人(或把同一個人淋得更濕),你唯一的選擇就是增加水球的數量。
-
一根花園水龍帶將其有效載荷作為一股水流從水龍頭流向噴嘴。花園水龍頭接的水帶的容量可能是有限的,但在打水仗的過程中水是源源不斷的。只要水從水龍頭進入軟管,就會一直通過軟管然后從噴嘴噴出。同一個花園軟管是很容易擴展的,你和朋友們可以玩得更盡興。
命令式編程就類似打水仗中的水球,本質上沒有什么問題,但是拿著類似響應式編程的水管的人在可擴展性和性能方面是有優勢的。
Reactor就是上面所說的響應式編程。
響應式流
Reactive Stream(響應式流)旨在為無阻塞異步流處理提供標準。它通過四個接口來概括:Publisher、Subscriber、Processor、Subscription。
- Publisher為每一個Subscription的Subscriber提供數據,Subscriber通過Publisher的接口來訂閱:
- Subscriber一旦進行了訂閱subsribe,就可以接受Publisher的消息。
- Subscription式一個消息對象,通過實現這個接口可以獲取對象中的消息數據;
- Processor連接發布者與訂閱者,并且兩者之間的身份會因為Processor而改變(誰說發布者不能當訂閱者了?)
**注:**響應式編程的核心類型為Mono(不多于一個數據項)、Flux(可表示多個數據項)。
實戰操作
如何實現一個Spring WebFlux實例可以參考。
如何實現一個響應式數據存儲實例可以參考。
Spring Cloud
微服務
在介紹什么式微服務之前,先看看之前幾十年的開發方式:
你創建一個Web服務的單體應用程序,它構建到一個可部署的 JAR 或 WAR 文件中。開發成單體應用是很正常,幾十年來大多數應用程序都是這樣構建的。即使將應用程序分解為多模塊構建,您最終也仍然會得到一個 JAR 或 WAR 文件,然后再將其推送到生產環境中。
這無疑是構建小型、簡單應用程序的最適宜的方法。**但有趣的是,小型應用程序往往會增長。**當需要一個新的特性時,很容易在項目中添加更多的代碼。在你意識到大事不妙之前,您的應用就已經變成復雜的單體的應用了。
單體應用看似簡單,但存在以下問題:
- 單體應用復雜度高:復雜度越高,越難搞清楚每個組件在整體中的作用;
- 測試太難:系統越復雜,集成測試就越麻煩;
- 依賴可能會沖突:兩個功能的依賴可能互相沖突;
- 不易擴展:即便只是修改了一小部分的功能,也需要部署整體;
- 技術選型比較困難:因為你是在給整體框架選擇語言、平臺、庫等;
- 上線工作更復雜:一個功能除了問題,可能整個系統都上不了線。
為了解決單體應用的缺點,微服務出現了:簡單來說,微服務架構是將應用程序分解成小規模應用的辦法,這些小應用獨立開發和部署。這些小應用(微服務)相互協調,以提供更完整和強大的應用程序。
它的優點就是上面單體應用的缺點相對面。
**注:微服務現在還沒搞清楚不要緊,**因為它是一個出現沒幾年的概念,很難用之前的概念來解釋、區分它,多看看資料慢慢就理解了。
Eureka
由于Spring Cloud太多了,只拿出其中Spring Cloud Netflix的Eureka來簡單講講。
Eureka 這個詞表達的含義,是當一個人找到或發現某事時的一種喜悅的感嘆。這個含義,使其成為服務注冊中心的最合適的命名。微服務正是通過 Eureka 服務發現彼此。
傳說 Eureka 是希臘物理學家阿基米德最先表達出來的。當年他坐在浴缸里洗澡時,發現了浮力的原理,便跳了出來,光著身子跑回家,大喊著“Eureka !”
**注:**傳說畢竟是傳說。
Eureka 充當微服務應用程序中,**所有服務的中心注冊表。**Eureka 本身可以被認為是一個微型的服務,其目的是在更大的范圍內幫助其他服務發現彼此。
當一個服務實例啟動時,它將用自己名稱向Eureka注冊。如果某個服務有多個實例,他們都以相同的名字在Eureka中注冊(相同的名字?)
當另一個服務需要使用某些服務時,它不是通過硬編碼(即像函數中寫好了參數)的方式去調用服務,而是從Eureka中通過名稱去查找服務,而后另一個組件Ribbon會利用負載均衡算法來選擇一個合適的服務主機發送給另一個服務。
其他
有關Spring Cloud如何進行配置管理,請跳轉配置管理。
有關Spring Cloud如何處理失敗和時延,請跳轉失敗解決。
Spring部署
上面所講的都是Spring的相關理論和組件,是開發時考慮的東西。
那么如何將一個開發好的項目線上部署呢?比如一個Web項目?
主體流程如下:
- 創建并完成Spring項目
- 打包成jar格式(如果想部署到web容器,也可以打包成war格式)
- 部署并啟動
詳細的操作過程請看:
https://www.jianshu.com/p/3f3c0f5b13f6
致謝
https://potoyang.gitbook.io/spring-in-action-v5/
總結
以上是生活随笔為你收集整理的Spring新手教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java Spring菜鸟教程,只需一篇
- 下一篇: Java之spring新手教程(包教包会