1. Trang chủ
  2. » Công Nghệ Thông Tin

Mọi điều cần biết về Spring Framework cơ bản

28 5 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 28
Dung lượng 1,61 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Spring Frame work 1 Kiến trúc cơ bản của một web app được xây dựng bằng Spring có những gì? A Spring Intializer Là những công cụ giúp khởi tạo spring một cách nhanh chóng và tự động Công cụ sd dễ dàng và phổ biến nhất là starter spring io B JPA (Java Persistence API) JPA là một interface đặc biệt dùng để làm việc với cơ sở dử liệu quan hệ JPA cung cấp 1 mô hình POJO cho phép ánh xạ các table với các columns thành các class với các fields C Hibernate Hibernate là thư viện ORM mã nguồn mở giúp lập.

Trang 1

Spring Frame work

1 Kiến trúc cơ bản của một web app được xây dựng bằng Spring có những gì?

A Spring Intializer

- Là những công cụ giúp khởi tạo spring một cách nhanh chóng và tự động

- Công cụ sd dễ dàng và phổ biến nhất là starter.spring.io

B JPA (Java Persistence API)

- JPA là một interface đặc biệt dùng để làm việc với cơ sở dử liệu quan hệ

- JPA cung cấp 1 mô hình POJO cho phép ánh xạ các table với các columns thành các class với các fields

C Hibernate

- Hibernate là thư viện ORM mã nguồn mở giúp lập trình viên map các object (POJO) với hệ quản trị csdl quan hệ Vì thao tác thông qua các đối tượng nên Hibernate không cần quan tâm tới đang sd hệ quản trị csdl nào

2 Dependency Injection with Spring

A SOLID Principle in OOP

- Nguyên lý SOLID là tập hợp 5 nguyên lý giúp code tối ưu và “cứng” hơn trong OOP

- Single Responsibility Principle : mỗi class chỉ thực hiện 1 trách nhiệm, nhiệm vụ duy nhất, và chỉ

sửa đổi class với 1 lý do duy nhất

- Open/Closed Principle : Có thể thoải mái mở rộng một class nhưng ko được sưa đổi bên trong

class đó Hiểu đơn giản là khi ta muốn thêm chức năng cho chương trình thì ta tạo class mới mở rộng từ class cũ (kế thừa hoặc sở hiểu class củ) không nên sửa đổi class củ

- Liskov Substitution Principle: Trong 1 chương trình, các object của class con có thể thay thế class

cha mà không làm thay đổi tính đúng đắn của chương trình

o Ví dụ: ta có 1 class Vit, các class VitXiem, VitBau kế thừa từ class Vit và chạy bình

thường , tuy nhiên nếu ta thêm class VitMay cần pin mới chạy được Khi cho VitMay kế thừa class Vit thì sẽ gây lỗi vì class Vit không có pin Đây là 1 TH vi phạm nguyên lý

- Interface Segregation Principle : Thay vì dùng 1 Interface lớn ta nên tách thành nhiều Interface

nhỏ với nhiều mục đích khác nhau và cụ thể

- Dependency Inversion Principle:

o Các module (file, class, project ) cấp cao không nên phụ thuộc vào các module cấp thấp

Cả 2 nên phụ thuộc vào abstaction Nghĩa là nên có 1 abstraction để kết nối giữa 2 module thay vì 2 module kết nối trực tiếp với nhau

Trang 2

o Interface (abstraction) không nên phụ thuộc vào chi tiết mà ngược lại.(các class giao tiếp với nhau thông qua interface chứ không phải implementation) Nghĩa là các implementation sẽ phụ thuộc vào interface ntn chứ interface sẽ độc lập khỏi

implementation

 Ví dụ : ta có bóng đèn đốt và bóng đèn huỳnh quang (implementation) cả 2 đều có đuôi tròn (interface) và 2 bóng đến có thể tùy thích đổi chỗ cho nhau bởi vì ở ghim chỉ quan tâm là đuôi gì (chỉ quan tâm interface)

B Dependency Injection

1 Khái niệm Dependency Injection

- Dependency (phụ thuộc) : là 2 class có mối quan hệ phụ thuộc với nhau Ví dụ class A dùng

method của class B, ta gọi đó là sự phụ thuộc hay dependency

- Dependeny Injection : là kỹ thuật lập trình cho phép ta inject (tiêm) một dependency vào object

trong quá trình runtime

o Có 3 loại depency injection :

 Construcor injection : các dependency sẽ được cung cấp qua constructor

 Setter Injection : các dependency sẽ được cung cấp qua setter

 Interface Injection

 Trong đó Constructor injection được sử dụng nhiều nhất

- IoC (Inversion of Control): là một kỹ thuật đảo ngược điều khiển một cách linh hoạt Dễ hiểu hơn

thì IoC là kỹ thuật cho phép dependencies có thể được inject trong lúc runtime

- Một điều quan trọng về đặc tính của framework đó là những methods do người dùng tự định nghĩa để thêm vào sẽ không được gọi bởi chính framework mà được gọi bởi chính code của người lập trình Vai trò chính của framework là phân phối hoạt động của ứng dụng IoC sẽ cung cấp cho framework công cụ mạnh mẽ để đối xử với các methods thêm vào từ người dùng

- IoC Container : IoC Container là phần dùng để thực hiện IoC

2 ApplicationContext, Bean và Anotation cơ bản trong Spring

- ApplicationContext và bean: Spring Container (Spring IoC Container) sẽ tạo ra các đối tượng

quản lý các đối tượng và quản lý dòng đời của chúng Các đối tượng này được gọi là Bean Spring Container đc dùng phổ biến nhất là ApplicationContext Hay nói dễ hiểu Spring đặt tên cho container là AplicationContext và các dependency trong container là bean

- Note: hàm SpringApplication.run() trong class App sẽ khởi tạo một Container nên ta có thể dùng

ApplicationContext để lưu container thành 1 biến

- @Component: là anotation để chú thích các class giúp Spring nhận diện đó là 1 Bean Nói cách

khác là khai báo 1 bean cho Spring

- Cơ chế tìm bean của Spring: Spring sẽ tìm các class cùng cấp hoặc thấp hơn class App để tìm các

class có anotation component và khởi tạo một object từ class đó và thêm vào bean

Trang 3

- @Autowired : là anotation để kha báo rằng phương thức hoặc thuộc tính này cần đc inject

từ class bên ngoài Khi Spring khởi tạo bean từ class có anotation này sẽ tự động inject object cần thiết vào

- Lưu ý : khi Spring chỉ khởi tạo bean 1 lần chính vì vậy khi inject nó sẽ inject chính object đã

được tạo trước đó, muốn Spring inject một object mới thì ta dùng anotation

@Scope("prototype") ngay trước tên class

- @Qualifizer : anotation này được dùng khi một bean có nhiều thể hiện khác nhau, vi thế khi

injected spring sẽ ko biết inject thể hiện nào, do đó qualifize sẽ gợi ý cho spring nên injected thể hiện nào Syntax : @Qualifizer(“class_name”)

- @Primary : primary dùng để set 1 bean thành primary bean, khi mà một bean có nhiều thể

hiện ta có thể set 1 thể hiện là primary khi đó khi injected spring sẽ tự động injected primary bean vào, nếu muốn injected các thể hiện khác ta dùng @Qualifizer

- Có chế hoạt động như sau : khi Spring chạy nó sẽ đọc trong file

resoures/application.property xem profilename nào đang được áp dụng Khi biết

profilename nào đang được áp dụng thì Spring sẽ chỉ nhận beans từ những profilename đó còn các profilename khác sẽ được phết lờ ko quan tâm bởi spring

- Câu lệnh để set profile trong file application.property : spring.profiles.active = profilename

- Default Profile : defautl profile là profile mặc định được sử dụng khi người dùng ko có bất kì config profile nào

o Syntax: @Profile({“profilename”, “default”})

4 Spring Bean Life Cycle

- Vòng đời của một bean (bean life cycle) là khoảng thời gian từ lúc nó được khởi tạo đến khi

nó bị destoy Bean life cycle sẽ được quản lý mới container, khi chương trình được chạy thì

Trang 4

đầu tiền container sẽ khởi động và container sẽ khởi tạo beans, và trước khi container tắt nó cũng sẽ destroy beans

- Trong đó ta có thể can thiệp vào quá life cycle của bean Ngoài ra ta có thể thấy trong vòng đời thì có rất nhiêu aware interface Aware interface được dùng bởi framework để khởi tạo vòng đời cho beans, thông thường ltv sẽ ko cần dùng và nghĩ tới đó

- Có 3 cách để can thiệp vào vòng đời của beans

o C1: dùng XML (chả ai dùng)

o C2: implement interface BeanPostProcesser và ghi đè 2 methods là

postProcessBeforeInstillization() để truy cập vào khoảng thời gian trước khi object được tạo từ benas đc khởi tạo và postProcessAfterInstillization() để truy cập vào khoảng thời gian trước khi destroy bean (dùng rất ít trong thực tể)

o C3: dùng anotation(được dùng nhiều nhất)

 @PostContruct : can thiệp vào khoảng thời gian trước khi object của beans được khởi tạo

 @PreDetroy : can thiệp vào khoảng thời gian trước khi bean bị phá hủy

 Cơ chế : trước khi khởi tạo object của benas khối code sau @PostContruct sẽđược thực thi Và trước khi beans bị destroy thì khối code sau @PreDestroy

sẽ được thực thi

5 Spring Framework Configruation

- Ta có 3 cách để có thể config được spring

o Dùng file XML

o Dùng anotation (@Compenent, @Cnotroller, @Service, )

o Dùng java class (@Configuration và @Bean để tạo class config)

- Trong đó dùng java class được sd phổ biến

A Spring Framework Stereotypes

- Spring Stereotypes là những Anotation được dùng để định nghĩa Bean này có chức năng cụ thể gì

- Gồm 3 stereotypes anotation chính

o @Controller : định nghĩa bean này là controller có chức năng điều hướng các request

o @Service : định nghĩa bean này là service có chức năng thực hiện các nghiệp vụ logic

Trang 5

o @Repository: định nghĩa bean này là respo có chức năng giao tiếp với DB, thực hiện các querry theo yêu cầu của Service(tương tự như DAO)

- Nếu chưa rõ chức năng của bean ta có thể dùn @Component chỉ để biến nó thành bean

o @ComponentScan(“className”) hoặc @Component({“className1”, “className2”})

o @SpringBootApplication(scanBasePackages = “className”) hoặc

@SpringBootApplication(scanBasePackages = {“className1”, “className2”})

- Trong đó : className là tên file muốn biến thành bean

C Dùng Java class để Config Bean

- Trong thực tế đôi khi để config cho bean thì ta tự tay tạo ra một class để cấu hình cho spring giúp ta dễ dàng handle được beans hơn

- Để có thể dùng java class để config spring ta dùng 2 anotation là @Configuration và @Bean

- @Configuration để cho spring biết đây là class config

- @Bean là anotation nằm trên các methods cho phép spring biết được đây là bean và thực

hiện đưa bean này vào content

- Ví dụ :

D Dùng XML để Config Bean

- Để config bean bằng file XML ta tạo 1 file mới trong folder resources và dùng tag bean

- Syntax : <bean name=”className” class=”path”/>

- Trong đó : className là tên class muốn biến thành bean và class là đường dẫn tới class đó

- Sau khi khai bào file XML xong, ta import file XML vào file app để spring biết được là ta muốndùng thêm XML nào

- Syntax: @ImportResources(“classpath:fileName”)

E Spring Bean Scope

- Scope của một bean là nơi định nghĩa vòng đời, và cách nó được khởi tạo và quản lý bởi IoC trong 1 ngữ cảnh cụ thể Có 6 kiểu scope

Trang 6

- Singleton scope là scope mặc định của một ứng dụng spring Một bean được đn với

singleton scope sẽ khiên IoC container khởi tạo duy nhất 1 instance cho bean đó, và instance này sẽ được sd cho tất cả yêu cầu đến bean

o Syntax khai báo singleton scope : @Scope(“singleton”) hoặc để mặc định ko cần khai báo

- Prototype scope sẽ trả về các instance khác nhau mỗi khi có một yêu cầu mới để sử dụng chúng đc gửi về IoC Container

o Ví dụ:

- Để đọc được data từ file properties trước tiên ta dùng @PropertypeSource để khai báo ta muốn đọc từ file nào

o Syntax: @PropertypeSource(“classpath:fileName”)

o Lưu ý : anotation này dùng bên dưới @Confiuguration

- Để gán giá trị cho từng properties của class thì ta dùng @Value, anotation này nằm trên một biến bất kỳ và nó sẽ lấy data trong file properties và gán cho biến bên dưới nó

o Syntax: @Value(“value”)

o Nó sẽ gán value cho biến bên dưới vì thế để đọc được dữ liệu từ file properties thì

ta dùng ${} kết hợp với tên key của giá trị đó

o Synatx: @Value(“${key}”)

B Multi Properties Files

- Để thêm nhiều properties file vào 1 class ta có 2 cách

- Cách 1: nối thêm vào @PropertypeSource

o Syntax: @PropertypeSource({“classpath:fileName1”, “classpath:fileName2”})

- Cách 2: dùng @PropertypeSources chứa nhiều @PropertypeSource nhỏ khác

o Syntax: @PropertypeSources {

@PropertypeSource(“classpath:fileName1”)

@PropertypeSource(“classpath:fileName2”)

}

C Dùng Spring Boot để exernal properties

- Spring Boot cung cấp cho ta khả năng external properties thông qua file

application.properties

Trang 7

- Ta chỉ cần ghi dữ liệu vào application.properties và dùng @Value thì Spring Boot sẽ tự động đọc từ application.properties để gán giá trị cho biến nằm dưới @Value, không cần dùng đến

@PropertypeSource và file properties nào khác

D YAML

- Yaml là một dạng file định dạng dữ liệu trung giang được thiết kế để người dùng và nnlt có thể hiểu được Yaml chính là JSON nhưng mở rộng hơn

- Các quy tắt khi viết Yaml

o Thục đầu dòng dùng spacebar không dùng tab

o Để viết một list các danh sách hay chính là mảng thì dùng “-” trước mỗi phần tử của mảng

o File yaml có đuôi là yml

- Ví dụ một file yml

- Một số operate tùy chỉnh trong yml

Trang 8

- Note: Để spring Boot tự động độc file yml như 1 properties file thì ta đặt tên file là

application.yml thì khi đó file này sẽ hđ tương tự như application.properties

o Ví dụ 1 file application.properties chuyển sang application.yml

E Note và tóm lại

- Note: Vì các file tên là application (.properties/.yml) sẽ được chạy đầu tiên, nên các file khác

có thể ghi đè lên Lý do vì sao các file khác luôn ghi đè lên các file application

Trang 9

- Tóm lại: để đọc được các properties từ bên ngoài và chèn vào spring thì ta có 3 cách

o Dùng file properties và @Value và @PropertyResouce

o Dùng file application.properties của Spring Boot và @Value

- Đầu tiên để khai báo 1 file HTML sử dụng Thymeleaf ta cần khai báo xmlns trong thẻ html

o Syntax: <html lang="en" xmlns:th="http://www.thymeleaf.org">

o Khi này ta mới có thể sử dụng các attribute của Thymaleaf

- Cú pháp của Thymaleaf sẽ là các attribute nằm trong thẻ html và bắt đầu bằng th:

o Ví dụ: thuộc tính th:text sẽ ghi vào nội dung của thẻ đó

B Model object

- Model là một object sẽ được Spring gắn kèm với request

- Điều này sẽ giúp ta có thể thêm dữ liệu lên request thông qua model

- Để thêm dữ liệu vào model ta dùng phương thức addAttribute()

o Syntax: model.addAttribute(“ten_bien”, “value”)

o Trong đó : tên_biến với giá trị là value sẽ được thêm vào model và khi nào cần dùng tới biến này ta chỉ việc gọi ra thông qua tên_bien

o Tương tự setAttribute bên Servlet

- Tại Thymeleaf để đọc dử liêu từ model ta dùng standard expression

o ${tên_bien} : để lấy giá trị của tên_biến

o *{tên_biến}: lấy giá trị của một biến được chỉ định

o #{…} : để lấy massege

o @{…} : để lấy đường dẫn URL

C @RequestMaping, @GetMaping và @PostMaping

- Cả @GetMaping và @PostMaping đều là anotaion giúp controller gửi request cho Thymeleaf.Chỉ khác là một cái dùng method get một cái dùng method request

- Còn @RequestMaping có thể sử dụng cả 2 methods

- Cấu trúc của một phương thức để gọi tới Thymaleaf như sau

Trang 10

- Trong đó:

o @GetMaping hoặc @PostMapping sẽ nhận tham số là các chuỗi đường dẫn đến Thymaleaf đó Như ví dụ trên thì đường dẫn đến index sẽ là localhost:8080/ hoặc localhost:8080 hoặc localhost:8080/index

o @GetMaping hoặc @PostMapping sẽ được dùng trên một phương thức String và return của phương thức đó chính là tên file Thymaleaf muốn gọi tới

o Phương thức bên dưới @GetMaping hoặc @PostMapping có thể nhận tham số là Model để có thể add thêm dữ liệu vào Model để gửi đi cho Themyleaf

D Cơ chế

- Ta có thể thấy đường đi của request trong hình sau

E Spring Dev Tool

- Spring cung cấp một côn cụ là Dev Tool cho phép việc restart project khi đang code một cách nhanh chóng

- Ta chỉ cần chọn phần build/Build Project để dùng Spring Dev Tool restart project

F Gửi datat từ Thymeleaf cho Contoller

- Có 2 cách ta có thể gửi dữ liệu từ Thymeleaf cho Controller

Trang 11

- Đầu tiên ta có thể dùng th:name và th:value cho tag đó (tương tự JSP)

o Cơ chế : ta sẽ dùng th:name để đặt tên cho tag đó khi gửi qua request và dùng th:value để set giá trị cho th:name Nếu một tag input chỉ có th:name thì value của

nó là nội dung trong phần input người dùng nhập

o Ở Controller thì ngay methods bên dưới RequestMaping ta thêm tham số cho methods đó là data ta nhận đc từ request Lưu ý ta cần dùng @RequestParam để khai báo rằng đây là dử liệu nhận từ Thymeleaf và tham số của @RequestParram là th:name của data đó

o Ví dụ:

o Trong đó @RequestParam sẽ scan trong request có param nào có tên là tittle không nếu có nó sẽ lưu vào biến title

- Cách 2 là ta dùng th:object và th:fields để gửi dữ liệu dưới dạng object

o Cơ chế : ở Controller ta gửi kèm 1 object rỗng của object ta muốn thêm dử liệu, ở Thymeleaf ta dùng th:object và th:field để thêm dử liệu cho object đó và đồng thời gửi đi dữ liệu dưới dạng object

o Để nhận object từ thymeleaf tại controller thì ta dùng @ModalAttribute

o Trong đó hàm getID sẽ lấy id và cộng vào url gửi về cho controller

- Tại controller muốn lấy giá trị id này ra ta dùng @PathVariable() và tại url của anotation maping ta thêm expresion operater để bao lấy phần biến

Trang 12

A Khái niệm cơ bản của JPA

- JPA là một interface đặc biệt dùng để làm việc với cơ sở dử liệu quan hệ

- JPA cung cấp 1 mô hình POJO cho phép ánh xạ các table với các columns thành các class với các fields

- POJO là một class Java thuần trong đó mỗi thuộc tính đề có getter setter và tất cả thuộc tính đều private

- Fetch type là cách dữ liệu được query, có 2 kiểu fetch type

o Lazy fetch type: dữ liệu sẽ ko đc querry mãi cho đến khi nó đc tham chiếu

o Eager fetch type : dữ liệu sẽ được querry ngay từ đầu

- @Lob : là anotation giúp tăng giá trị lưu trữ của một kdl

B Undirectional và Bidirectional

- Undirectional hay mối quan hệ một chiều : là khi 2 table có mqh với nhau nhưng chỉ 1 table biết nó có liên hệ với table kia, còn table kia thì ko hề biết bảng nào có liên hệ với nó (one-way)

- Bidirectional hay mqh 2 chiều: nghĩa là cả 2 table đều biết chúng có mqh với nhau

- Thông thường nên sd bidirectional để giúp ta điều hướng object từ cả 2 hướng

Trang 13

- Syntax : @OnetoMany/ManytoMany/ManytoOne (cascade = Cascadetype.type)

o Trong đó type là các kiểu cascade ở bảng trên

D @Entity và @OnetoMany/ManytoMany/ManytoOne

- @Entity để khai báo rằng POJO này là một thực thể

- @OnetoMany/ManytoMany/ManytoOne đc dùng trên các thuộc tính (thuộc tính này là instance của 1 entity) và để khai báo rằng mqh của entity này với entity hiện tại Hay dễ hiểu

là thể hiện mối quan hệ giữa các entity

Trang 14

- MappedBy : ở ví dụ trên ta thấy từ khóa mappedBy từ khóa này giúp thiết lập một mqh 2 chiều, tức là cả 2 đều sẽ biết nó có mqh với nhau ntn Giá trị của mappedBy sẽ là tên của phương thức mà entity phía bên kia lưu cho entity này, MappedBy thường đi kèm với OnetoMany và ManytoMany

- Ngoài ra ta có thể dùng @Id để khai báo rằng thuộc tính này là Id và kèm theo

@GenerateValue(strategy = GenerationType.INDENTITY) để khai báo rằng id sẽ tự động tăng thêm khi có record mới và giá trị trong id là độc nhất (tương tự AUTO_INCREMENT trong SQL)

- Có 2 loại dữ liệu để JPA ghi enum xuống database

o Dùng ORDINAl : nghĩa là có thứ tự , nó sẽ chỉ lưu thứ tự của Enum khi ghi xuống database (kiểu này nếu ta thêm một biến vào enum thì sẽ có lỗi)

o Dùng STRING: kiểu này nó sẽ lưu giá trị của enum xuống db thay vì thứ tự (nên ta có thể thêm sửa xóa enum tùy thích)

Ngày đăng: 22/07/2022, 14:13

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w