Lunski's Clutter

This is a place to put my clutters, no matter you like it or not, welcome here.

0%

Spring and Hibernate

主流Java框架Spring。

系列文章

O

將之前學到的技術整理成系列文章,Java Spring Framework, Hibernate與Kubernetes。

KRs

  1. 領域探索 100%

Spring Boot成為主流

簡化 Spring的框架,基於 Spring Framework (下面會提到),開發人員提供了一個快速、簡單、高效、可擴展和易於部署的開發框架,有助於加快開發進程,降低開發成本。

通過 Spring Boot Starter 模組(Maven 或 Gradle)實現自動配置,MySQL、MongoDB,消息隊列等支持,自動配置類中通常會註冊一些 Spring Bean,這些 Bean 會根據 Spring Boot 的自動配置規則進行設置。

application.properties實現對不同環境的配置支持。

img
Source Code

去除繁瑣配置,Spring MVC > Spring Boot取代

  1. 配置Maven依賴 > Spring Boot保留
  2. 配置web.xml加載spring mvc
  3. 資料庫配置
  4. 讀取文件的配置
  5. Log
  6. Tomcat > Spring Boot內建

Spring Annotations

  1. @SpringBootApplication:標記主配置類,同時啟用自動配置和組件掃描。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2. @RestController:標記一個類為 REST 風格的控制器。
3. @GetMapping/@PostMapping/@PutMapping/@DeleteMapping:定義@RestController中 HTTP 的 GET/POST/PUT/DELETE 方法對應的路徑和處理器方法。
4. @Component:通用的組件注解,標記一個類為 Spring 組件。
5. @EnableCaching:啟用緩存管理。
6. @EnableAsync:啟用異步方法調用。
7. @Entity:對應到table, 後接@Table(name = "...")
8. @Autowired:自動注入 Spring Bean。
9. @Service:定義比CRUD更複雜操作
10. @SpringBootApplication: 啟動程式
11. @Data:Lombok 簡化 getter, setter, toString
12. @Repository封裝後端database crud操作
13. @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
14. @Transactional 實現事務管理,方法執行過程中發生異常,則事務會自動回滾,保證數據庫的一致性。

常用的事務管理器包括:

DataSourceTransactionManager:用於支持關聯到單個數據源的事務管理。
JtaTransactionManager:用於支持全局事務管理。
JpaTransactionManager:用於支持 JPA 操作的事務管理。

@Service
public class UserService {
@Autowired
private UserRepository userRepository;

@Transactional
public void addUser(User user) {
userRepository.save(user);
}
}

Hibernate

配對應用程式模型物件和數據庫表格的資料的框架

Hibernate V.S. MyBatis

@Entity

  1. Hibernate在POJO(Java 物件)上@就可以直接映射,MyBatis較複雜
  2. Hibernate 封裝SQL開發較快
  3. MyBatis 一對一或一對多的關聯設定較簡單
  4. MyBatis 可以對SQL優化查詢

專案建置

  • Spring MVC(Model. View. Controller)

Initializr

建構專案初始架構與相依套件

  • 常用
    • Spring Web(Spring MVC)
    • Spring Data JPA(Hibernate)
    • H2(In memory database)
    • MySQL Driver
    • Lombok

Maven v.s. Gradle

建置套件
Maven:XML
Gradle:Json

pom.xml添加新依賴後需要再

1
~/apache-maven-3.9.0/bin/mvn clean install  

使用者由網頁切入(VCM)

  1. View: Postman( Get, Post, Put, Delete) in Thymeleaf/JSP or command
  2. Controller: API Layer 以前是Struts負責,溝通前端JSP(View)與後端Servlets(Model)
  3. Model: Service(Business Logic)資料數中的一個表
  4. Data Access Object, DAO: Presistence Logic Hibernate封裝SQL,封裝資料庫進行持久層的操作
  5. DB 執行SQL語句

工程師由Model切入(MCV)

如果要添加MySQL到專案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
1. pom.xml: 添加依賴套件

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>

2. application.yml: 設置參數

server:
port: 9100 # 伺服器的port號

spring:
datasource:
url: jdbc:mysql://localhost:3306/ems?useSSL=false # mysql databases 連接位址
username: root # database 用戶名
password: 123456 # database 密碼

jpa:
properties.hibernate.dialect: org.hibernate.dialect.MySQL8Dialect
hibernate.ddl-auto: update
generate-ddl: true
show-sql: true

3. `Model`: @Entity 對應到 MySQL 數據庫中的一個表

@Entity
@Table(name="employees")
public class Employee {

4. Respository: 繼承 JpaRepository 的interface

使用 Spring Data JPA 透過底層默認框架Hibernate來映射SQL語句,操作資料庫

5. Service: 定義比CRUD更複雜操作,像listUser...

@Service
public class EmployeeServiceImpl implements EmployeeService {

private EmployeeRepository employeeRepository;


6. Exception: Service會用到的錯誤控制

ResourceNotFoundException <class>

7. `Controller`: API接口定義

@RestController
@RequestMapping("/api/employees")
public class EmployeeController {

private EmployeeService employeeService;
@RequestMapping("/api/employees")
public class EmployeeController {

8. `View`: 透過內建Tomcat網頁呈現

9. 啟動程式

@SpringBootApplication
public class DemoApplication {

public static void main(String[] args) {

  • Lombok
    簡化 getter, setter, toString等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
選擇Lombok或手動添加

<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <version>1.18.0</version>
</dependency>

使用

@Data
public class Student {

會引入

import lombok.*;

或使用

@Getter
@Setter
@AllArgsConstructor
@EqualsAndHashCode
public class Student {

會引入

import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;

Spring Framework

整合簡化JSP、Servlet等Web Framework,解決類別間相依性

  • Thymeleaf
    MVC中的View,SpringBoot官方支持模板引擎,旨在成為JSP的完全替代品
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
選擇web與Template Engines或手動添加

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

引入後resource資料夾下多個Templates放模板

http://localhost:63342/spring5webapp/bookList.html

Spring的設計模式(IoC-DI, AOP)

IoC(Inversion of Control 控制反轉)

設計原則,取代new物件的依賴

讓物件的產生與配置委託給IOC容器(這裡說的也就是Spring IOC Container),讓程式到了需要時,讓容器來幫我們注入

Object obj = new Object();
改成
Object obj = ApplicationContext.getBean(Object.class);

DI(Dependency Injection 依賴注入)

實現控制反轉,讓一個物件和 class接收它所依賴(變數)的其他物件,用Annotation分離接收方和依賴,從而提供鬆耦合以及代碼重用性。

A對B依賴,B改動時,A就要跟著改

1
2
3
4
public class A{
B b = new B();
...
}

外部實例再傳入,方便維護

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class A
{
B b;
//建構元注入
public A(B _b)
{
this.b = _b;
}
//設值注入
public void a(B _b)
{
this.b = _b;
...
}
}

AOP代理模式,不動原有設計加新功能

AOP(Aspect Oriented Programming with Spring): 一種概念與一系列標準,解決跨越多個模塊的重複性問題,例如日誌輸出、性能統計、安全控制等。

1
2
3
4
5
6
7
8
9
通過 @EnableAspectJAutoProxy 注解來啟用 AOP。

@SpringBootApplication
@EnableAspectJAutoProxy
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}

Proxy Design(代理模式): 預測使用者行為,自動裝配

  1. 靜態代理(Static Proxy): 程式還沒運行前就確立了整個物件的包裝與邏輯
  2. 動態代理(Dynamic Proxy): 代理物件交由程式運行時生成

Spring Cloud

Spring Boot 中最常用的微服務框架之一,它基於 Spring Boot 構建,提供了一系列開箱即用的微服務組件,包括服務發現、負載均衡、配置中心、網關等,使得開發者可以更輕鬆地實現微服務架構,Eureka、Ribbon、Zuul、Config Server 等。

時程: 2023/2/1- 2023/3/1

Spring Boot on Kubernetes

Refs

  1. Annotation取代實作interface
  2. POJO
  3. SSH(Spring + Struts + Hibernate)

如果你覺得這篇文章很棒,請你不吝點讚 (゚∀゚)

Welcome to my other publishing channels