# Spring Framework ## Java版本與Spring版本關聯 | 層級 | 版本 | 說明 | | -------- | -------- | -------- | | Spring | 1.2~4.0 | Text | | | 5.0 |JavaSE 8,11 | | | 6.0 |JavaSE 17 (若之前是Java SE 8升級到此版本會跨越多個版本, 有可能要調整程式(慎選) | |Java EE|5.0 |出現profile版| ||6.0 |分成web prifile(只需要web service功能)及platform(完整版)| ||10.0|分成web prifile, platform, core-profile (微服務用) 需要JavaSE 17| |Java SE|5.0 |開始有annotation| ||8.0|(LTS)| ||9.0|推出module| ||11.0|(LTS) ||14.0|新增Record(簡單且不可變更的資料結構,適合用在座標, 顏色表示)| ||17.0|(LTS)| ||22.0|最新版本,預計23可能是下一個LTS| :::info :information_source: 如果Java要升級,應該選擇LTS版本。(官方保證至少會maintain 5年以上) ::: ## Spring Framework誕生 - spring 之父: R.Johnson - 對J2EE的EJB很有意見所以在TSS發表Spring Framework,開始受到Java社群重視 > [TSS (The Server Side)](https://www.theserverside.com/): 專門介紹server端技術網站 ## 應用程式四大邏輯 1. 展示 (Presentation logic) 2. 控制 (Control logic) 3. 商業 (Business logic) 4. 資料存取 (Data access logic) ## 應用程式架構演化 ## GUI時代 ### 單機 ```mermaid flowchart LR; P[Presentation Logic] C[Control Logic] B[Business Logic] D[Data Access Logic] F[file] subgraph GUI P<--->C<--->B<--->D end D<--->F ``` ### 2-Tier (C-S)主從式 ```mermaid flowchart LR; P[Presentation Logic] C[Control Logic] B[Business Logic] D[Data Access Logic] DB[(DB)] subgraph Client P<--->C<--->B<--->D end D<--->DB ``` 常見組合:VB->SQL server - Fat Client: 所有邏輯都在Client端 - Client和Server都在intranet ### 3-Tier ```mermaid flowchart LR; P[Presentation Logic] C[Control Logic] B[Business Logic] D[Data Access Logic] DB[(DB)] subgraph internet subgraph Client P<--->C end end subgraph intranet subgraph Server B<--->D end C<--->B D<--->DB end ``` - intranet->internet問題: 不可能將DB直接開放給client存取 - 安全性 - DB 連線有限 - Thin client:只有展示,控制logic - Server通常會加上其他服務: - 安全控制 - 交易控制 - 元件生命週期 :::info GUI的缺點: 1. client需要安裝部署 2. 遠端debug, 更新都很麻煩 ::: ## Web Service時代 ### web service ```mermaid flowchart LR; BR[browser] P[Presentation Logic] C[Control Logic] B[Business Logic] D[Data Access Logic] DB[(DB)] subgraph internet subgraph Client BR end end subgraph intranet subgraph Server P<--->C<--->B<--->D end D<--->DB end BR<--->P ``` 所有logic都放在Server上 - Client端是broswer,只負責渲染畫面 - 不需要煩惱client部署,遠端debug問題,server由自己掌控,debug或更版都很方便。 - Cluster運算 - load balance - failover:當server掛了可以把client資料(session)移到另一台server讓服務可以持續 :::warning **商業logic**如果太複雜會造成server負載過重更容易出錯 Sol: Java EE 用 EJB container (另一個server)去處理商業跟資料存取邏輯 ::: ### EJB ```mermaid flowchart LR; BR[browser] P[Presentation Logic] C[Control Logic] B[Business Logic] D[Data Access Logic] DB[(DB)] subgraph internet subgraph Client BR end end subgraph intranet subgraph Web Container P<--->C end subgraph EJB Container B<--->D end C<--->B D<--->DB end BR<--->P ``` #### EJB Container 1. Session Bean:處理商業邏輯 2. Message Driven Bean (JMS):非同步訊息傳遞 3. Entity Bean:存取DB #### Java EE 版本 full platform:Web Conatiner+EJB Container #### 優點 1. 降低server負擔 2. 將商業邏輯跟DB存取獨立出來,可以透過API給異質平台共用 #### 缺點 1. EJB Bean設計過於複雜,沒有人願意用 2. 效能差 #### 解決方案 1. R.Johnson推出**Spring Framework**取代EJB - EJB 有的功能Spring都有支援,而且容易上手 3. Java EE後來請R.Johnson幫忙改良EJB: - EJB Liter變得簡單好用,但只能local端存取 - EJB Bean改跑在Embedded EJB Conatainer(原本是為了方便在web container 對 EJB的bean debug,後來就拿來管理EJBLite bean 跟CDI) ### Spring Framework 發展背景 自2002年起,許多Java企業領域的開放原始碼產品在實務上有出色表現: 1. 展示層(Presentation): Struts Framework 2. 永續層(Presistant): Hibernate, iBATIS SQLMap 3. 商務層(Business): EJB因太難用被嫌棄,此時Spring Framework 出現受到關注 SSH(Struts+Spring+Hibernate)曾經是主流架構 ### Spring Framework 設計理念 - 透過介面進行系統設計 - **以傳統Java物件(POJO)為主** - 目的是降低物件間依賴性(耦合度),提高移植性 - 比較:使用EJB,物件必須實作Session Bean並且只能在EJB container上測試 - 非侵入式 - 可模組化的輕量級服務 - 一致的格式檔格式 ## Spring Framework 架構 ![](https://image.slidesharecdn.com/spring2-x-100606225316-phpapp02/85/spring-2x-4-320.jpg?cb=1669295593)