---
# System prepended metadata

title: SpringBoot學習筆記
tags: [ESUN, 後端]

---

# Spring Boot學習筆記

## 一、 Spring Boot簡介
### 簡介
- **SpringBoot是目前Java後端最主流的開發框架**
- SpringBoot是Spring框架的延伸，SpringBoot消除了複雜的XML配置
> **框架Framework:** 
程式基礎的架構、地基、骨架，通常內建許多工具包，無論前後端都有「框架」得以讓開發者透過框架去實作，加速工程師開發效率。
> **框架 vs. Library:** 
框架: 超大型工具包，建立基礎建設
Library/ package/ module: 工具包，針對單一功能解決特定問題
![image](https://hackmd.io/_uploads/SkVMjegD6.png)

### 特點
- 簡化Spring開發，Spring框架xml配置繁瑣
- 採用「約定優於配置(convention over configuration)」-> Spring Boot通通設定好預設值，預先套用寫好的設定檔
- 內嵌多種Web server: Tomcat, Jetty, Undertow等伺服器
- 整合許多功能性模塊: 如Spring Security(身分驗證和授權)、Spring Data(數據訪問)

## 二、Spring Boot常用注釋(Annotation)
**Annotation注釋/註解: 強化了程式註解與Javadoc 文件註解的功能，使其更有強制力**
#### ==核心注釋==
- `@SpringBootApplication` : 加在class上，表示本class是SpringBoot程式的啟動入口
- `@EnableAutoConfiguration`: SpringBoot會嘗試自動配置開發者可能需要的bean
> Bean: 由 Spring 容器來管理的 object，賦予一個新的名字，就叫做 Bean
- `@Autowired`: 注入bean的方法(前提: 自己也是Bean、是透過變數的類型注入Bean)
- `@Qualifier`: 指定注入的Bean的名字(必須搭配`@Autowired`一起使用)
#### ==Controller常用注釋==
- `@Controller`: 表示此為SpringMVC Controller 物件
- `@RestController`: 作用相當於`@ResponseBody` 加上`@Controller`，用於回傳JSON、XML 等資料。使用`@RestController`+method返回值為JAVA物件時，即**回傳JSON格式**
- `@RequestMapping `: 標示請求的位址
- `@RequestBody`: 接住放在 request body 中的參數
- `@RequestHeader`: 接住放在 request header 中的參數
#### ==Service常用注釋==
:::info
待補充
:::
#### ==Dao常用注釋==
- `@ConfigurationProperties`: 注入`application.properties`裡面的設定值
> Springboot設定檔分為**properties**和**yml**檔，兩者語法不同


## 三、 Spring MVC
### 分成Model View Controller三個模塊
![image](https://hackmd.io/_uploads/ryg9iNHda.png)
### In SpringBoot, 分成Controller, Service, Dao三個模塊
![image](https://hackmd.io/_uploads/By0As4Bup.png)






## 四、 Spring框架特性
### 框架特性: IoC
**Inversion of Control控制反轉**
- 沒有IoC概念時:
    - 有個印表機Printer Interface，Class HpPrinter, Class CannonPrinter去實作Printer Interface
    - Teacher class宣告一個printer類型的變數，並且new一個HpPrinter
    ![image](https://hackmd.io/_uploads/B1tJCfePp.png)
    - **如果HpPrinter壞了??**
    - Teacher就只能再new一個CanonPrinter()，但**身為Teacher只是想在Printer印東西，並不在乎是HpPrinter還是CanonPrinter**
- **Spring提出IoC概念: 將Printer這個物件交給Spring保管，有人需要使用就跟Spring拿取，且Spring會負責管理物件的生命週期**
    - Teacher寫法改成: 只定義一個Printer變數
    - Spring會啟一個Spring Container，new一個印表機出來放在容器裡保存，當Teacher想要使用印表機時，可以從Spring Container獲得
- ==**Spring IoC定義:將object的控制權，交給了外部的Spring容器來管理**==
- IoC好處:
    - 降低程式耦合，降低class之間的關聯性
    - Spring負責物件的完整生命週期，包括create、初始化、銷毀...
### 框架特性: DI依賴注入
**Dependency Injection 依賴注入**
- Spring容器將HpPrinter**借給**Teacher使用->DI依賴注入，代表Spring容器把HpPrinter注入到Teacher class
- IoC + DI 是同捆包的概念，幾乎會同時使用。
    - IoC: 控制權交出去
    - DI: object注入回來才能使用
#### ==Spring Boot中，被放在Spring容器管理的object叫Bean==
![image](https://hackmd.io/_uploads/Syre2z3wp.png)

### 框架特性: AOP
- 沒有AOP概念時:
    - 如果有print()和printColor()兩個method，都需要計算這兩個method執行的時間的話，兩個method都會需要寫計算時間的程式碼
         ![image](https://hackmd.io/_uploads/B1P29QHdp.png)
- ==**AOP概念: 每個方法都要使用的共同邏輯，獨立成一個切面，貫穿所有的method。**==
    ![image](https://hackmd.io/_uploads/H1nNoQHOT.png)
    
#### 使用方法
- 先在pom.xml載入AOP
- 製造切面
    - 注釋: 
        - `@Aspect`: 成為切面
        - `@Before`: 在**切入點**之前，要執行的動作
        - `@After`: 在**切入點**之後，要執行的動作
        - `@Around`: 在切入點之前和之後之間，要執行的動作
    - 切入點寫法
    ![image](https://hackmd.io/_uploads/H1LM1Er_6.png)
    **切入點**: HpPrinter的所有方法
    1. 切入點為 com.example.demo.HpPrinter 底下的 print() 方法
    `execution(* com.example.demo.HpPrinter.print())`
    2. 切入點為 com.example.demo.HpPrinter 底下的所有方法
    `execution(* com.example.demo.HpPrinter.*(..))`
    3. 切入點為 com.example.demo 這個 package 中的所有 class 的所有方法（不包含子 package）
    `execution(* com.example.demo.*(..))`
    4. 切入點為 com.example.demo 這個 package 及其底下所有子 package 中的所有 class 的所有方法
    `execution(* com.example.demo..*(..))`
    5. 切入點為那些帶有 @MyAnnotation 的方法
    `@annotation(com.example.demo.MyAnnotation)`
- 常用在
    - 權限驗證-> 另外發展成SpringSecurity
    - 統一的exception處理
    - log紀錄



## 五、 Spring JDBC
### ORM / JDBC / JPA / SpringDataJPA?
### JAVA操作資料庫的方法:
1. 執行SQL語法: SpringJDBC和MyBatis都屬於這類
2. 使用ORM概念操作資料庫: Spring Data JPA, Hibernate
## 設計模式 Design Pattern
:::info
待補充
:::

## 六、RESTful API
- 符合REST風格的API
1. 使用HTTP request method表示動作: POST GET DELETE PUT
2. 使用url路徑來描述資源之間的階層關係
3. 使用 Json 或是 Xml 回傳

## 參考資料
[Spring Boot 零基礎入門 - iThome系列文](https://ithelp.ithome.com.tw/articles/10322852)

