---
# System prepended metadata

title: Spring Framework
tags: [外訓, SP]

---

# 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)


