@Danny幫忙補充
Spring,一般指代的是Spring Framework,它是一個開源的應用程式框架,提供了一個簡易的開發方式,通過這種開發方式,將避免那些可能致使程式碼變得繁雜混亂的大量的業務/工具物件
Spring MVC和Spring Boot都屬於Spring。
Spring MVC 是基於Spring的一個 MVC 框架,
Spring Boot 是基於Spring的一套快速開發整合包
Spring Boot只是擴展了Spring framework,實現自動配置,降低專案搭建的複雜度。
spring-boot-starter-web-services,針對SOAP Web Services
spring-boot-starter-web,針對Web應用與網路介面
spring-boot-starter-jdbc,針對JDBC
spring-boot-starter-data-jpa,基於hibernate的持久層框架
spring-boot-starter-cache,針對快取支援
假設有一個 interface 為 Car
Car 有兩個實現類,分別為 Tesla 及 Benz
今天當父母想要開這 Tesla 出門時,必須這樣做:
但若今天 Tesla 沒電了,想要改開 Benz 出門,就必須將每支 java 程式打開,將 new Tesla() 改成 new Benz(),非常麻煩!
因此 Spring 就提出了一個想法,將 Car 這個 Object 拿來保管,當有人要用到 Car 時,就直接跟 Spring 拿即可。從此之後 Father 及 Mother 就不需要去 new 一個 Tesla 或 Benz 了,如下:
而當 Spring application 啟動後,Spring 會啟動 Spring Container,Spring 會預先創建一個 Tesla 存放在 Spring Container 中,由 Spring 來管理這個 Tesla,當 Father 和 Mother 要開車時,Spring 就會把這個預先創建好、存放在 Spring Container 中的 Tesla 交給他們兩人,如此一來他們就可以正常使用車子了,他們也不需要在意車子是哪個廠牌的了,只需要知道有車可以開就好,這就是 Spring IoC 的概念。
回頭看一下 IoC 的定義,就能理解其中的含意了:
“將 Object 的控制權 交給外部的 Spring Container 來管理。”
如果要讓 Spring 去創建一個 Tesla 的 Object,並且預先存放在這個 Spring Container 中的話,就需要使用 @Component
此 Annotation
@Component
用法: 只能加在 class 上
作用: 將該 class 變成由 Spring Container 所管理的 Object
Tesla.java
📝NOTE: 為 Tesla 加上
@Component
後,以後當啟動 Spring Boot application 時,Spring Container 就會同時被啟動起來,接著 Spring 就會為我們去創建一個 Tesla 的 Object,並存放在 Spring Container 中
@Component
後,此 bean 的名稱預設會是 class name 的首字母轉成小寫接著,要將這個 Spring 所管理的 tesla bean 交給 Father 及 Mother 使用,要實現此需求有以下兩個步驟:
@Component
變成 bean@Autowired
Annotation📝NOTE: 「依賴注入(Dependency Injection, DI)」
加上
@Autowired
後, Spring 就會把你想要的 bean 交到你手上,Spring 將 bean 交到你手上這個動作,就稱為**「依賴注入(Dependency Injection, DI)」**。為何稱作**「依賴注入」**?
因為 Father 想要使用 tesla 這個 bean,因此 Father 依賴於 tesla bean,而 Spring 把 tesla 這個 bean 交給 Father ,就是把 Father 依賴的東西交給他、注入依賴給他,因此才會稱作**「依賴注入」**
最後,當去執行 Father 的 travel() 方法時,輸出的結果就會是:
@Autowired
(Henry補充盡量別用)不使用原因及替代方法可參考該網站
https://kaisheng714.github.io/articles/analyzing-dependency-injection-patterns-in-spring
變數的類型盡量使用 interface
如果同時有多個 class 都實現了 Car interface 的情況下,那當 @Autowired
到底要將哪個實現類注入給 Father 呢? ⮕ 解決辦法: @Qualifier
@Qualifier
用法: 通常是加在 class 變數上,並會跟 @Autowired
同時使用
作用: 指定要載入 bean 的 name
📝NOTE: 記得 bean name 首字母為”小寫”
example:
在 car 變數加上 @Qualifier
,並指定為 "tesla" 這個 bean 之後,此時 @Autowired
就會把類型為 Car 且 name 為 "tesla" 的那個 bean 注入到 Father 中
此方式最大的特點是: Bean 的建立與依賴的注入是同時發生的
@Component
⮕ Spring 會為我們創建一個該 class 的 bean,然後放到 Spring Container 中@Configuration
⮕ 執行這個 class 中的 code,去對 Spring Container 進行設定 (設定甚麼就根據 code 的內容)@Component
@Configuration
+ @Bean
@Configuration
@Bean
用法: 只能加在 帶有 @Configuration
class 的「方法」上
作用: 在 Spring Container 中創建一個 bean
example:
注意事項:
@Bean
一定要加在帶有 @Configuration
的 class 裡面@Bean
方法 return 的物件@Bean
方法創建的 bean name,預設會是該”方法的名稱”!!!@PostConstruct
、@InitializingBean
若今天在 Tesla 類中添加 double remainingBattery ****剩餘電量的屬性
但此時 Spring 只是為我們創建 tesla bean 並存放在 Spring Container 中,並沒有為它的 remainingBattery 進行初始化,因此該 tesla bean 的 remainingBattery 屬性值就預設為 0。
那如果要同時去初始化該 tesla bean 的 remainingBattery 屬性值,有以下 2 種方法:
@PostConstruct
@PostConstruct
用法: 加在「方法」上
作用: 初始化 bean 中的內容
注意事項:
@PostConstruct
註解的方法必須為 public
、void
,且 不能有參數
example:
在 Tesla 類中添加 initialize()
方法並未方法加上 @PostConstruct
Annotation 後,當創建 tesla bean 後,Spring 就會接著執行被 @PostConstruct
註解的方法,去初始化 tesla bean 中的內容
example:
啟動 Spring Boot application
啟動一個空的 Spring Container 出來
根據以下兩種方式 創建 bean,並放進 Spring Container 中:
@Component
@Configuration
+ @Bean
根據以下兩種方式 初始化 bean:
完成以上步驟,bean 就變成「可被使用」的狀態了
Spring Boot application 運行成功,console 輸出:
基本上與流程相同,但要注意以下事項:
@Qualifier
指名為 tesla bean是一個安全相關的框架,提供授權、驗證的功能,如果單只有引入會導致所有api回傳401,需要覆寫去自定義驗證方式
只要指定限制特定URL的傳入(也可鎖定post或get),就能簡單做好登入頁面
要先登入google、fb、line等申請憑證(根據自己的需求選擇),並將憑證放在自己的xml或yml
ex:google https://console.cloud.google.com/apis
加入第三方登入驗證,只要在自定義授權裡簡單設置oauth2Login()就能達成
透過一次登入滿足在多個地方訪問不同資源
AOP 是一種程式設計思想,它允許你將橫切關注點(Cross-Cutting Concerns)從主要的業務邏輯中分離出來,以模組化的方式進行管理。橫切關注點是指那些無法單獨劃分為一個模組的功能,Spring AOP 通過提供一種方法來定義切面(Aspects),讓你能夠將這些橫切關注點應用到程式碼中。
主要概念:
創建 UserService 類
創建切面類 LoggingAspect
範例(使用LoggingAspect)
範例(未使用LoggingAspect)
執行結果
優點:
應用場景:
Spring Boot,很多人會想到Spring 和Spring MVC。
究竟它們有什麼差別?
第一,Spring是一種框架,包含一系列的IoC容器的設計和依賴注入(DI)及整合AOP功能。
第二,Spring Boot 和 Spring MVC 都是一種框架,同時它們的核心是Spring。
第三,Spring Boot包含了Spring MVC,同時能簡化配置。
Spring Boot 的特色:
創建獨立的Spring應用程式
嵌入式Tomcat, Jetty, Undertow (不用部署WAR包)
提出自主的starter來簡化配置
隨時自動地配置Spring及相關的第3方Library
提供已隨時就緒的功能如Metrics, 程式的健康檢查及外部化配置
不會生成任何代碼及無任何XML配置的前設要求
創建一個簡單的Spring boot
https://blog.miniasp.com/post/2022/09/19/Spring-Boot-Quick-Start-From-Scratch
Spring boot的tomcat預設8080port也可以調整
https://www.javatpoint.com/spring-boot-change-port
什麼是Spring Cloud ?
Spring Cloud是一組用於構建分散式、彈性和可伸縮微服務的框架和工具集合。它是基於Spring框架的一個專門設計用於協助開發和管理微服務架構的子項目。
Spring Cloud提供了各種模塊和功能,用於幫助開發人員在微服務架構下解決一些常見的問題,例如:
總的來說,Spring Cloud為開發人員提供了一整套的工具和框架,用於開發、部署和管理微服務架構,幫助實現高效、可伸縮和可靠的分散式系統。
Spring Cloud Netflix是Spring Cloud底下的一個子專案,將Netflix一系列開源工具和框架(Netflix OSS Integrations)整合到Spring Cloud中,以提供開發者更容易使用Netflix OSS(Open Source Software)中的各種服務,例如:
總之,Netflix OSS是一系列的開源項目和工具,可以幫助開發者在不同的場景下構建、運行和監控分佈式系統,並從Netflix的實踐中受益。
https://ithelp.ithome.com.tw/users/20107338/ironman/1445?page=1
Spring Cloud和Kubernates的差異
Spring batch是一個輕量級、全面的批處理框架,旨在開發對企業系統日常運營至關重要的強大批處理應用程序。
Spring Batch 提供了處理大量記錄所必需的可重用功能,包括日誌記錄/跟踪、事務管理、作業處理統計、作業重啟、跳過和資源管理。它還提供更先進的技術服務和功能,通過優化和分區技術實現極高容量和高性能的批處理作業。簡單和復雜的大批量批處理作業都可以以高度可擴展的方式利用該框架來處理大量信息。