專案管理 Maven
MavenMaven 是一個專案管理與自動化構建的工具,主要用於 Java 的專案。 目前由 Apache 軟體基金會管理。另外一個常見的工具 Gradle,這邊就不多介紹,主要的用途都類似。
是根據專案物件模型(Project Object Model, POM)概念設計,在 pom.xml 檔案中描述專案的基本資訊、與外部模組的依賴關係、建構順序、目錄與外掛程式,並執行 Maven 提供的構建方法就可快速完成編譯、打包等等。剛進入透過 Maven 管理的專案會自動從遠端的程式庫 (mvn repository)下載依賴
專案結構當我們剛創建好一個由 Maven 構建的 Spring Boot 專案,他的結構會像是下面這樣
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182my-spring-boot-app│ pom.x ...
Spring Boot Bean 介紹及常見應用
Spring Bean (註解 Annotation)由 Spring IoC 容器管理的對象稱為 Bean 。Bean 是由 Spring IoC 容器實例化、組裝和管理的對象。應用 Annotation 可以將一個物件註冊成為 Bean。
使用 Annotation 的好處:
只要在任意的 class 開頭定義好,Spring 啟動後就會自動去找,不需要一個一個匯入
名稱就可以對應該 Class 要做甚麼或是被引入甚麼套件
Spring 會自動根據 Annotation 去將該 class 設定成特定的用途或是引入特定套件。
依照不同應用層面分類:1. 配置與啟動1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId></dependency>
@SpringBootApplication:
結合了 @Configuration、@Enab ...
Spring Boot 介紹
Spring Boot是 Java 最主流的後端開發框架,Spring Boot 其實算是早期的框架 Spring 的擴充升級,其核心的概念都有延續。過往框架 Spring 配置繁瑣,為跟上其他語言的框架,像是 Python (Django), PHP (Laravel) 等主流框架簡化配置的設計,所以才衍伸出 Spring Boot 快速整合管理 Spring 底下的各類模組 (Spring Data, Spring Security, Spring AOP、Spring MVC… ) 來達到快速開發。
主要框架核心概念就是控制反轉 (Inversion Of Control) 及 依賴注入 (Dependency Injection) 來達到解耦,減少程式碼之間的依賴性,增加開發彈性,詳細的說明請見 Spring Boot IOC and DI。
Spring Boot 在啟動時,會執行元件掃描(component scan),找出具有元件標記的類別(如 @RestController、@Service、@Component),建立成元件(bean),並且將這些 bean 放入 S ...
Spring Security FilterChain 如何進行登入認證
進行 Spring Security 的實作時碰到很多底層運行架構不是很了解的狀況,上網查找一些資訊拼湊出一個比較容易理解的流程。主要是針對帳號密碼登入時的授權部分,因為牽涉到很多元件的運作,所以需要整理一下。
帳號密碼認證流程認證和授權動作都是在請求到達 Spring MVC 的運作之前,Security 就已經透過一套機制進行一系列的驗證,首先會先碰到的就是
(1) Filter Chain 的系統,這邊會透過一系列的過濾篩選,只要請求的一些 header 或是任何內容有不符合的就會先被過濾掉,算是攔截器的概念,層層篩選其中關於登入的部分會由 UsernamePasswordAuthenticationFilter 進行處理,接著會被導入
(2) Authentication Manager 統一針對授權去管理,從一堆 Provider 中找到一個可以成功認證的
(3) Authentication Provider 來判斷帳號密碼是否正確,密碼的加密及認證等等處理 (配置密碼加密的類型 PasswordEncoder 也是從這邊設置),他會從 UserDetailServi ...
Spring Boot Scheduled
排程服務 Cronjob
排程服務主要應用針對例行的處理,根據設定的時間或是間隔自動啟動
多應用 cron 的表達式去設定
常見應用的服務如 Cron, Spring Task Scheduling, windows 任務排程器, Airflow, 各雲端服務商對應的 Cronjob 服務
Spring Task Scheduling 用法
要執行排程的 class 加入 @Component 變成 bean
SpringApplication.run 的啟動類加上 @EnableScheduling 才會啟用
Spring AOP
AOP (Aspect Oriented Programming) 切面導向設計
是一種程式設計的模式,主要理念是為了減少重複出現的邏輯,比方說 log 紀錄,登入驗證、資料驗證等重複性事務,如果多個方法都需要執行到這類方法,就可以抽出來透過定義在切面中,減少程式耦合及方便去進行維護,讓開發者可以專注在更重要的業務邏輯中。
如同下圖每個箭頭是不同的方法或流程,如每個方法都要加入同樣的處理,就可以當成一個切面抽出來所以像是 log, security 的部分就被稱為 cross-cutting concerns 但都可以抽出共同需要處理的部分作為切面(藍色及綠色)。
SpringBoot 本身也提供好用的註解去實踐這樣的設計模式,可以進行切面的操作,你可以根據切入點的執行前中後等等進行設定,以控制我們的方法執行的順序。
Spring AOP 使用定義切面
通常要使用 Spring Boot AOP 需要先將切面定義出來,會在我們需要標記的切面類別上加上 @Aspect,且注意需要加上@Component 將類別標記成為 bean 才可以使用
123456@Component ...
Spring Boot IOC and DI
Day 2 - 控制反轉 (IOC) vs 依賴注入(DI)控制反轉 Inversion of Control (IOC)控制反轉是一種程式設計的方式。它的精神在於程式中所需要的輔助物件,並不是在自己的類別中建立,而是由外部控制的。建立好後,將其傳遞給主程式,這個動作稱為依賴注入,是控制反轉的實現方式。
將 Object 的控制權交給外部的 Spring 容器來管理
依賴注入 dependency injection (DI)實現控制反轉的方式,Spring 的設計目標之一是為了解隅,利用依賴抽象而非依賴實例的方式,因此設計了依賴注入(DI)。
@Component , @RestController @Service … 等註各類解加在 class 上,將 class 交給 Spring 管理,這些也就是在 Spring Boot 中所謂的 Bean (後面章節會有詳細介紹)
@Autowired 將被管理的 Bean 注入
應用範例
舉例來說有個物件專門來處理寄送訊息叫做 Sender ,我們需要使用到這個物件就必須透過 new 方法來建立出來,假設今天原本的 Sender ...
JPA, JDBC, Hibernate
JPA (Java Persistance API)
字面意思就是一個 Java 的持久化 API,將資料「儲存」與「讀取」的過程,就稱為「持久化」也可以說是將資料儲存到資料庫的過程。
JPA 其實是一個 Java 標準,定義了一組用於 ORM 的 API。它提供了一個標準的方法,使 Java 開發者能夠透過標準的介面來執行 ORM 操作,而不受特定數據庫供應商或是 ORM 框架的限制。
Hibernate
Hibernate 是一個開源的 ORM 框架,實現了 JPA 標準,是 Java 中最廣泛使用的 ORM 框架之一。
JDBC (Java Database Connectivity)
JDBC 是透過 Java 來連接資料庫的一種技術。它提供了一組用於執行 SQL 查詢、更新和管理數據庫連接的 Java 介面。透過 JDBC,Java 可以與各種不同的數據庫系統進行通信。
Spring JDBC
由 Spring 提供基於 JDBC 的模組,它提供了一個抽象層,用於簡化 JDBC 操作並處理資源管理。允許開發者使用簡單的 API 來執行 SQL 查詢、更新、刪除等操作 ...
編碼(encoding) vs 加解密 vs 雜湊(Hash)
編碼(Encoding)將原本的資料經過運算轉換成另一組資料,如果要還原可透過反向解碼(decoding)ex: Base64, URl, UTF-8
加解密(Encrypt and Decrypt)將資料透過一個 Key 來做加密或解密轉換(和編碼最大的差別)可以根據鑰匙是否相同分成對稱式與非對稱
對稱式加密 (Symmetric Encryption) (DES/Triple DES、AES)鑰匙相同,加密及解密都共用
- AES(Advanced Encryption Standard)- DES(Data Encryption Standard)- DES/Triple
AES 是目前被廣泛接受和使用的加密方式,因提供了更高的安全性和更快的加密速度。DES 和 DES/Triple DES 由於安全性弱和性能較慢,通常不是首選。
非對稱式加密 (Asymmetric Encryption) (RSA 演算法)加密與解密方式為:公鑰加密,私鑰解密
ex: RSA、ECC
雜湊(Hash)SHA256 Hash 幾個特點:
不管資料量多大經過 SHA ...
.equals() 和 == 差別
“==”
是用來判斷兩個比較物件是不是有相同的 references。
每一個物件都有獨立的 reference,假如 reference 不同就表示它們是不同的物件。
.equals()
是用來比較物件的值(儲存在 heap 上的值)。
可以判斷兩個有不同 references 的物件是否指向相同的值
總結:
== 比較的是兩個對象的引用或基本數據類型的值。
.equals() 比較的是兩個對象的內容,通常需要被覆寫,並根據自定義的邏輯進行比較。
在使用時,需要注意以下幾點:
對於基本數據類型,應該使用 == 來進行相等性比較。
對於引用類型,如果只是想比較兩個對象是否引用同一個 reference,可以使用 ==。如果需要比較兩個對象的內容的值是否相等,應該使用 .equals() 方法。
在使用 .equals() 方法時,需要注意處理 null 值的情況,以避免 NullPointerException。可以使用 Objects.equals() 方法(Java 7+)或自定義的邏輯來處理 ...