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

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.

Spring Frame work Kiến trúc web app xây dựng Spring có gì? A B - Spring Intializer Là công cụ giúp khởi tạo spring cách nhanh chóng tự động Công cụ sd dễ dàng phổ biến starter.spring.io JPA (Java Persistence API) JPA interface đặc biệt dùng để làm việc với sở dử liệu quan hệ JPA cung cấp mơ hình POJO cho phép ánh xạ table với columns thành class với fields C Hibernate - Hibernate thư viện ORM mã nguồn mở giúp lập trình viên map object (POJO) với hệ quản trị csdl quan hệ Vì thao tác thơng qua đối tượng nên Hibernate không cần quan tâm tới sd hệ quản trị csdl D H2 Databse - H2 hệ quản trị csdl nhúng trực tiếp vào project spring boot với nhiệm vụ để test, demo JPA Hibernate E Thymeleaf - Thymeleaf Java XML/HTML template engine sử dụng làm tầng view cấu trúc MVC (tương tự JPA) Dependency Injection with Spring A SOLID Principle in OOP - - - Nguyên lý SOLID tập hợp nguyên lý giúp code tối ưu “cứng” OOP Single Responsibility Principle : class thực trách nhiệm, nhiệm vụ nhất, sửa đổi class với lý Open/Closed Principle : Có thể thoải mái mở rộng class ko sưa đổi bên class Hiểu đơn giản ta muốn thêm chức cho chương trình ta tạo class mở rộng từ class cũ (kế thừa sở hiểu class củ) không nên sửa đổi class củ Liskov Substitution Principle: Trong chương trình, object class thay class cha mà khơng làm thay đổi tính đắn chương trình o Ví dụ: ta có class Vit, class VitXiem, VitBau kế thừa từ class Vit chạy bình thường , nhiên ta thêm class VitMay cần pin chạy Khi cho VitMay kế thừa class Vit gây lỗi class Vit khơng có pin Đây TH vi phạm nguyên lý Interface Segregation Principle : Thay dùng Interface lớn ta nên tách thành nhiều Interface nhỏ với nhiều mục đích khác cụ thể Dependency Inversion Principle: o Các module (file, class, project ) cấp cao không nên phụ thuộc vào module cấp thấp Cả nên phụ thuộc vào abstaction Nghĩa nên có abstraction để kết nối module thay module kết nối trực tiếp với 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 thông qua interface implementation) Nghĩa implementation phụ thuộc vào interface ntn interface độc lập khỏi implementation  Ví dụ : ta có bóng đèn đốt bóng đèn huỳnh quang (implementation) có trịn (interface) bóng đến tùy thích đổi chỗ cho ghim quan tâm (chỉ quan tâm interface) B Dependency Injection Khái niệm Dependency Injection - - - Dependency (phụ thuộc) : class có mối quan hệ phụ thuộc với Ví dụ class A dùng method class B, ta gọi phụ thuộc hay dependency Dependeny Injection : kỹ thuật lập trình cho phép ta inject (tiêm) dependency vào object q trình runtime o Có loại depency injection :  Construcor injection : dependency cung cấp qua constructor  Setter Injection : dependency cung cấp qua setter  Interface Injection  Trong Constructor injection sử dụng nhiều IoC (Inversion of Control): kỹ thuật đảo ngược điều khiển cách linh hoạt Dễ hiểu IoC kỹ thuật cho phép dependencies inject lúc runtime Một điều quan trọng đặc tính framework methods người dùng tự định nghĩa để thêm vào không gọi framework mà gọi code người lập trình Vai trị framework phân phối hoạt động ứng dụng IoC cung cấp cho framework công cụ mạnh mẽ để đối xử với methods thêm vào từ người dùng IoC Container : IoC Container phần dùng để thực IoC ApplicationContext, Bean Anotation Spring - - ApplicationContext bean: Spring Container (Spring IoC Container) tạo đối tượng quản lý đối tượng quản lý dòng đời chúng Các đối tượng gọi Bean Spring Container đc dùng phổ biến ApplicationContext Hay nói dễ hiểu Spring đặt tên cho container AplicationContext dependency container bean Note: hàm SpringApplication.run() class App khởi tạo Container nên ta dùng ApplicationContext để lưu container thành biến @Component: anotation để thích class giúp Spring nhận diện Bean Nói cách khác khai báo bean cho Spring Cơ chế tìm bean Spring: Spring tìm class cấp thấp class App để tìm class có anotation component khởi tạo object từ class thêm vào bean - - - - @Autowired : anotation để kha báo phương thức thuộc tính cần đc inject từ class bên ngồi Khi Spring khởi tạo bean từ class có anotation tự động inject object cần thiết vào Lưu ý : Spring khởi tạo bean lần inject inject object tạo trước đó, muốn Spring inject object ta dùng anotation @Scope("prototype") trước tên class @Qualifizer : anotation dùng bean có nhiều thể khác nhau, vi injected spring ko biết inject thể nào, qualifize gợi ý cho spring nên injected thể Syntax : @Qualifizer(“class_name”) @Primary : primary dùng để set bean thành primary bean, mà bean có nhiều thể ta set thể primary khi injected spring tự động injected primary bean vào, muốn injected thể khác ta dùng @Qualifizer Spring Profile - - - Profile features có Spring core dùng để config app cho enviroment người dùng Ví dụ chức i18n ứng vs ngơn ngữ bean injected vào, để spring biết người dùng dùng ngơn ngữ để injected beans cần dùng tới profile Để set beans profile ta dùng anotation profile Syntax : @Profile(“profilename”) Có chế hoạt động sau : Spring chạy đọc file resoures/application.property xem profilename áp dụng Khi biết profilename áp dụng Spring nhận beans từ profilename cịn profilename khác phết lờ ko quan tâm spring Câu lệnh để set profile file application.property : spring.profiles.active = profilename Default Profile : defautl profile profile mặc định sử dụng người dùng ko có config profile o Syntax: @Profile({“profilename”, “default”}) Spring Bean Life Cycle - Vòng đời bean (bean life cycle) khoảng thời gian từ lúc khởi tạo đến bị destoy Bean life cycle quản lý container, chương trình chạy đầu tiền container khởi động container khởi tạo beans, trước container tắt destroy beans - - Trong ta can thiệp vào q life cycle bean Ngồi ta thấy vịng đời có nhiêu aware interface Aware interface dùng framework để khởi tạo vòng đời cho beans, thông thường ltv ko cần dùng nghĩ tới Có cách để can thiệp vào vòng đời beans o C1: dùng XML (chả dùng) o C2: implement interface BeanPostProcesser ghi đè methods postProcessBeforeInstillization() để truy cập vào khoảng thời gian trước object tạo từ benas đc khởi tạo postProcessAfterInstillization() để truy cập vào khoảng thời gian trước destroy bean (dùng 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 object beans khởi tạo  @PreDetroy : can thiệp vào khoảng thời gian trước bean bị phá hủy  Cơ chế : trước khởi tạo object benas khối code sau @PostContruct thực thi Và trước beans bị destroy khối code sau @PreDestroy thực thi Spring Framework Configruation - - Ta có cách để config spring o Dùng file XML o Dùng anotation (@Compenent, @Cnotroller, @Service, ) o Dùng java class (@Configuration @Bean để tạo class config) Trong dùng java class sd phổ biến A Spring Framework Stereotypes - Spring Stereotypes Anotation dùng để định nghĩa Bean có chức cụ thể Gồm stereotypes anotation o @Controller : định nghĩa bean controller có chức điều hướng request o @Service : định nghĩa bean service có chức thực nghiệp vụ logic @Repository: định nghĩa bean respo có chức giao tiếp với DB, thực querry theo yêu cầu Service(tương tự DAO) Nếu chưa rõ chức bean ta dùn @Component để biến thành bean o - B Component Scan - - - Cơ chế mặc định spring khởi tạo bean scan class cấp thấp cấp file app Nếu muốn thay đổi hành vi mặc định Spring đẻ class vị trí khác hay cụ thể cao cấp file app ta dùng anotation @ComponentScan sử dụng scanBasePackages tromg @SpringBootApplication Syntax: o @ComponentScan(“className”) @Component({“className1”, “className2”}) o @SpringBootApplication(scanBasePackages = “className”) @SpringBootApplication(scanBasePackages = {“className1”, “className2”}) Trong : className tên file muốn biến thành bean C Dùng Java class để Config Bean - Trong thực tế đơi để config cho bean ta tự tay tạo class để cấu hình cho spring giúp ta dễ dàng handle beans Để dùng java class để config spring ta dùng anotation @Configuration @Bean @Configuration spring biết class config @Bean anotation nằm methods cho phép spring biết bean thực đưa bean vào content Ví dụ : D Dùng XML để Config Bean - Để config bean file XML ta tạo file folder resources dùng tag bean Syntax : Trong : className tên class muốn biến thành bean class đường dẫn tới class Sau khai bào file XML xong, ta import file XML vào file app để spring biết ta muốn dùng thêm XML Syntax: @ImportResources(“classpath:fileName”) E Spring Bean Scope - Scope bean nơi định nghĩa vòng đời, cách khởi tạo quản lý IoC ngữ cảnh cụ thể Có kiểu scope o Singleton o Prototype o Request o Session o Application o Websocket - - Singleton scope scope mặc định ứng dụng spring Một bean đn với singleton scope khiên IoC container khởi tạo instance cho bean đó, instance sd cho tất yêu cầu đến bean o Syntax khai báo singleton scope : @Scope(“singleton”) để mặc định ko cần khai báo Prototype scope trả instance khác có yêu cầu để sử dụng chúng đc gửi IoC Container o Syntax : @Scope(“prototype”) External Properties với Spring Framework A External Properties - - - Để import properties từ bên ngồi vào spring sử dụng gán cho object ta dùng đến @PropertypeSource @Value Đầu tiên ta cần phải có file properties improt từ bên ngồi tự tạo Nội dung file cặp key – value chứa liệu để đưa vào spring, key phải đặt tên có dấu chấm (.) o Ví dụ: Để đọc data từ file properties trước tiên ta dùng @PropertypeSource để khai báo ta muốn đọc từ file o Syntax: @PropertypeSource(“classpath:fileName”) o Lưu ý : anotation dùng bên @Confiuguration Để gán giá trị cho properties class ta dùng @Value, anotation nằm biến lấy data file properties gán cho biến bên o Syntax: @Value(“value”) o Nó gán value cho biến bên để đọc liệu từ file properties ta dùng ${} kết hợp với tên key giá trị o Synatx: @Value(“${key}”) B Multi Properties Files - Để thêm nhiều properties file vào class ta có 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ả external properties thông qua file application.properties - Ta cần ghi liệu vào application.properties dùng @Value Spring Boot tự động đọc từ application.properties để gán giá trị cho biến nằm @Value, không cần dùng đến @PropertypeSource file properties khác D YAML - - Yaml dạng file định dạng liệu trung giang thiết kế để người dùng nnlt hiểu Yaml JSON mở rộng Các quy tắt viết Yaml o Thục đầu dịng dùng spacebar khơng dùng tab o Để viết list danh sách mảng dùng “-” trước phần tử mảng o File yaml có yml Ví dụ file yml - Một số operate tùy chỉnh yml - - Note: Để spring Boot tự động độc file yml properties file ta đặt tên file application.yml file hđ tương tự application.properties o Ví dụ file application.properties chuyển sang application.yml E Note tóm lại - Note: Vì file tên application (.properties/.yml) chạy đầu tiên, nên file khác ghi đè lên Lý file khác ln ghi đè lên file application - Tóm lại: để đọc properties từ bên chèn vào spring ta có cách o Dùng file properties @Value @PropertyResouce o Dùng file application.properties Spring Boot @Value o Dùng application.yml @Value Thymeleaf A Thymeleaf - Thymeleaf template engine java có nhiệm vụ generate HTML/XML,… (đóng vai trị tầng view tương tự JSP dễ dàng dùng JSP) - Đầu tiên để khai báo file HTML sử dụng Thymeleaf ta cần khai báo xmlns thẻ html - o Syntax: o Khi ta sử dụng attribute Thymaleaf Cú pháp Thymaleaf attribute nằm thẻ html bắt đầu th: o Ví dụ: thuộc tính th:text ghi vào nội dung thẻ B Model object - Model object Spring gắn kèm với request - Điều giúp ta thêm liệu lên request thông qua model - Để thêm 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ị value thêm vào model cần dùng tới biến ta việc gọi 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ị tên_biến o *{tên_biến}: lấy giá trị biến định o #{…} : để lấy massege o @{…} : để lấy đường dẫn URL C @RequestMaping, @GetMaping @PostMaping - Cả @GetMaping @PostMaping anotaion giúp controller gửi request cho Thymeleaf Chỉ khác dùng method get dùng method request - Còn @RequestMaping sử dụng methods - Cấu trúc phương thức để gọi tới Thymaleaf sau - Trong đó: o @GetMaping @PostMapping nhận tham số chuỗi đường dẫn đến Thymaleaf Như ví dụ đường dẫn đến index localhost:8080/ localhost:8080 localhost:8080/index o @GetMaping @PostMapping dùng phương thức String return phương thức tên file Thymaleaf muốn gọi tới o Phương thức bên @GetMaping @PostMapping nhận tham số Model để add thêm liệu vào Model để gửi cho Themyleaf D Cơ chế - Ta thấy đường request hình sau E Spring Dev Tool - Spring cung cấp côn cụ Dev Tool cho phép việc restart project code cách nhanh chóng - Ta 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ó cách ta gửi liệu từ Thymeleaf cho Controller - MappedBy : ví dụ ta thấy từ khóa mappedBy từ khóa giúp thiết lập mqh chiều, tức biết có mqh với ntn Giá trị mappedBy tên phương thức mà entity phía bên lưu cho entity này, MappedBy thường kèm với OnetoMany ManytoMany - Ngồi ta dùng @Id để khai báo thuộc tính Id kèm theo @GenerateValue(strategy = GenerationType.INDENTITY) để khai báo id tự động tăng thêm có record giá trị id độc (tương tự AUTO_INCREMENT SQL) E Enum - Enum hay cụ thể Enumerate Java class thuộc tính enum số (nó gán public static final sẵn ta cần khái báo tên) Để khai báo enum ta thêm từ khóa enum trước tên class - Ví dụ: - Trong JPA để ánh xạ Enum thành table ta dùng @Enumerate class mà tham chiếu tới enum, ko dùng trực tiếp enum - Có loại liệu để JPA ghi enum xuống database - o Dùng ORDINAl : nghĩa có thứ tự , lưu thứ tự Enum ghi xuống database (kiểu ta thêm biến vào enum có lỗi) o Dùng STRING: kiểu lưu giá trị enum xuống db thay thứ tự (nên ta thêm sửa xóa enum tùy thích) Ví dụ: F Hiểu mối quan hệ mappedBy thông qua mối quan hệ nhiều - nhiều - Ở mối quan hệ nhiều nhiều cần khai báo anotation JPA tự động join table db để thực mối quan hệ - Tuy nhiên entity có @ManytoMany mặc định JPA join bảng tương ứng với anotation entity, để hạn chế điều ta dụng từ khóa mappedBy - Hiểu sâu mappedBy có chức ngăn JPA join thêm table dư thừa, mappedBy nói cho JPA biết thuộc tính entity đc join với thuộc tính entity khác rồi, nên ko cần join thêm bảng Đó lí giá trị mappedBy tên thuộc tính entity entity phía bên - Để đổi tên bảng join ta dùng @JoinTable(name= ”new_name”) @JoinColumns(name = “new_name”) để đổi tên cột Join table lưu ý tên ko đc cách dấu cách mà phải cách dấu underscore (_) - Ví dụ: o Phía đc mappedBy o Phía mappedBy o Ta thấy giá trị mappedBy categories tên thuộc tính bên phía mappedBy Ý muốn nói enity Category thằng categories Recipe G Khởi tạo liệu cho db - Để khởi tạo liệu cho db ta cần file schema.sql để tạo bảng file data.sql để insert liệu Cả file phải nằm /resources - Để sử dụng đồng thời file ta khai báo thuộc tính application.properties - Ví dụ file: o File schema.sql o - File data.sql Và kết H JPA Repository - Để thực query liệu jpa ta tạo interface đgl Repository extends lại interface CRUDRepository JPARepository interface cung cấp số methods giúp ta querry với db - CRUDRepository nhận tham số kdl: POJO cảu table muốn lấy liệu kdl thuộc tính id POJO - Ví dụ ta muốn lấy liệu từ bảng catagory ta khai báo sau: - Ngoài ta thêm @Repository để giúp Spring hiểu I Optional - Optional dễ hiểu container bao bọc class Nếu class bao bọc Null Optional ko quăng Exception mà chuyển giá trị null thành giá trị khác - Optional sd JPA để đảm bảo querry liệu hơng lấy đc liệu hơng quang Exception, ứng dụng chạy bình thường I Querry Data with JPA - Như đề cập interface CRUDRepository cung cấp cho ta số method querry với db Trong có findById querry theo Id - Ngồi ta ghi đè thêm số phương thức giúp ta querry dễ dàng Bằng cách dùng Optional tên methods có dạng findByColumns_name - Ví dụ : o Trong methods ta find dựa description nhận vào String để find - Khi có methods ta gọi tới để sử dụng Để gọi ta ta cần phải inject repository muốn dùng vào Và để đọc liệu ta dùng methods get() Get() giúp ta convert từ optional sang object - Ví dụ : (ở vd ta inject vào controller) o Trong đó:  Ta find category có description America uom có desciption Teaspoon  Sau để đọc liệu lấy ta dùng hàm get() Ở VD ta kèm theo getId() để đọc id Lombok - Lombok gì: lombok thư viện java giúp tự sinh code tự sinh setter/getter, constructor,… thông qua anotation - Để dùng đc lombok dự án ta phải khai báo file pom.xml - Một số anottaion thường dùng Lombok: - o @Getter/Setter : để tự tạo getter setter ta dùng trước thuộc tính để áp dụng cho thuộc tính dùng trước class để áp dụng cho toàn thuộc tính class o @NoArgsConstructor : tạo Constructor rỗng o @RequiredArgsConstructor : khởi tạo Constructor cho thuộc tính final đánh dấu nà @NonNull o @AllArgsConstructor : khởi tạo Constructor cho tất thuộc tính o @ToString : khởi tạo hàm toString o @EqualsAndHashCode : khởi tạo hàm Equals HashCode o @Date : kết hợp anotation o @Slf4j : để ghi file log Khi JPA có quan hệ chiều @EqualsAndHashCode sinh lỗi tràn nhớ Để khắc phục ta thêm exclude = “tên thuộc tính chiều” tham số cho @EqualsAndHashCode 10 Testing Spring Application A Các khai niệm Testing - Test fixture : trạng thái cố định tập object dùng sở cho việc testing Mục đích test fixture để đảm bảo có enviroment cố định để chạy test kết lặp lại Nó bao gồm: o setUp() : method thực thi bắt đâu test o tearDown() : method thực thi kết thúc test - Unittest : loại kiểm thử phần mềm unit phần mềm kiểm thử Kiểm thử đơn vị thực trình phát triển ứng dụng Mục tiêu Unit test lập phần code xác minh tính xác đơn vị - Intergration Test : thiết kế để test hành vi đối tượng phần hệ thống Nó chậm unit test - Functional Test : dễ hiểu test thử trình chạy application, test feature có trình chạy db connection, driver,… - TDD – Test Driven Development (Phát triển hướng kiểm thử): nghĩa test viết trc, fails fix lại test sau - BDD – Behavior Driven Development (Phát triển hướng hành vi): có nguồn gốc từ TDD định test unit phần mềm cho phù hợp với hành vi mong muốn unit - Mock : implementation giả class đc dùng để test - Spy : mock đặc biệt, cho phép ta overide lại method chọn real class B Dùng JUnit để test Spring Framework - Để dùng JUnit ta phải khai báo dependences pom Tuy nhiên Spring itializer khai báo sẵn cho ta - Để khởi tạo file test cho class ta bơi đậm tên class , nhấn vào icon đèn nhấn create test - @BeforeEach @BeforeAll : - o @BeforeEach : chạy methods bên anotatin trước test o @BeforeAll : chạy methods bên anotatin này, sau chạy tất cá test sau (nghĩa chạy method anotation lần nhất) Ví dụ test: o Trong ta thấy : o @BeforeEach dùng cho hàm setUp để khởi tạo object trước lần chạy test o AsserEquals() : dùng để kiểm tra giá trị có ko, test passed C Mockito - Mockito thư viện giúp JUnit dùng mock - Khi ta muốn test class có DI ta phải tiêm dependency vào, nhiên test nên ta ko thể tiêm dependency real Chính lúc mock xuát giúp ta fake dependency inject vào - Để khai báo thuộc tính mock ta dùng @Mock - Để khởi tạo Mock ta dùng methods Mock.mock(“tên_class”.class) hàm setUp - Ví dụ: - Ta thực test bth, nhiên tất giá trị mock class rỗng Nên để giả lập giá trị cho mock ta dùng when().thenReturn() o Syntax: when(class.methods).thenReturn(value) o Câu lệnh giả lập giá trị trả methods value - Ví dụ: - Ở ví dụ ta thấy, ta giả lập giá trị trả findAll() hashSet ta tự khai báo - Ngoài Mockito cịn có methods verify giúp ta kiểm tra số lần methods giả lập đc gọi o Syntax: verify(mockClass, times(int)).methods o Trong : kiểm tra methods giả lập mockClass gọi tới bao nhiều lần néu passed test D MockMVC - Spring boots cung cấp cho ta thứ để test layer MockMVC (ko biết hay ko MockMVC thường đc dùng để test request đến controller) - Để khởi tạo mockMVC ta dùng MockMVCBuilders o Syntax: MockMvc nameMock = MockMvcBuilders.standaloneSetup(name_Controller).build(); - Ta dùng methods perform để giả lập đường request tới controller o Syntax: nameMock.perform(get(“url”)) o Trong methods get() giúp ta truyền request đến url cụ thể - Ta dùng medthods andExpect để kiểm thử - ví dụ MockMVC: o Trong ta dùng :  Status().isOK() : để kiểm tra tình trạng kết nối  View().name(“view_name”) : để kiểm tra có trả view giống mong muốn ko E Intergration Test - Ở phần ta dùng unit test với mock Tuy nhiên với intergration test ta inject bean thật vào để test, nên ko cần dùng đến mock mà ta phải injected bean vào (ko biết hay ko dùng để test JPA hay rộng hên repo) - Đầu tiên ta có anotation nằm đầu class o @RunWith(SpringRunner.class) : ta dùng feature Spring Boots Test nên bắt buộc ta phải có anotation để làm cầu nối với JUnit (JUnit5 bị thay thành @ExtendWith(SpringExtension.class)) o @SpringBootTest : nói ta inject bean thật nên ta cần phải khởi tạo bean Đó cơng dụng anotation này, anotation khởi tạo application để lấy đc bean o @DataJpaTest: giúp ta set up đầy đủ thứ để test JPA (thơng thường có @DataJpaTest ko có @SpringBootTest) - Vì cần inject nên ta dùng @Autowired để inject, cịn lại ta test unit test bình thường - Ví dụ Ingretion Test: - Trong ta thấy: o Repo bean đc inject vào o Và JUnit ko cần @RunWith F Circle CI - Cirlce CI dịch vụ test project sẵn, tham khảo https://circleci.com/ 11 CRUD with Spring MVC A Data Binding in Spring MVC - Command Oject / Backing Bean : object POJO dùng để lấy tất thông tin từ form tầng view Khi ta nhấn submit form data đc gửi đến đây, ta hiển thị thông tin form ta dùng command object o - Ví dụ: Convert Object : object phụ trách nhiệm vụ chuyển data từ form vào entity ngược lại o Để tạo Convert Object ta phải implement Converter pakcage springframework.core.convert  Ta thấy tham số interface Converter S nghĩa object muốn chuyển đổi T object muốn chuyển đổi thành o Vì Convert Object dùng inject nên ta khai báo @Component để biến thành bean o Ví dụ Convert Object: - Data Binding : spring tự động map liệu form cho trùng khớp với command object, điều đgl data binding hay phụ thuộc liệu Ví dụ : ta nhập trường fullName form trường đc tự động map với properties fullName command object - Lưu ý : command object có liệu liên quan đến object khác ta dùng command object object để thay thể, đảm bảo tính quán liệu 12 Exception Handle - Để handle exception Spring cung cấp cho ta cách o Dùng @ResponseStatus : để thay đổi http status code theo ý muốn có exception o SimpleMappingExceptionResolver : dùng để map exception với view o @ExceptionHandler : cho phép ta thực đc việc A @ResponseStatus - @ResponseStatus : cho phép ta thay đổi http status code exception throw - Anotaion thường đc đặt class exception ta tự định nghĩa - Ví dụ class dùng @ResponseStatus - Trong : NotFoundException throw thay status code 500, ta dùng @ResponseStatus để thay thành 404 – Not Found B @ExceptionHandler - @ExceptionHandler antotaion đc dùng controller, có exception tương ứng đc throw truyển request qua anotaion anotaion chuyển hướng tới view Hay nói cách khác map exception với view - @ ExceptionHandler nhận tham số ExceptionName.class nghĩa ta khai báo cho Spring biết có ExceptionName đc throw methods bên anotation đc gọi - Ví dụ - Trong ta thấy class ModelAndView cho phép ta handle Model View redirect tới - Ngồi ta truyển Exception object vào methos chuyển sang cho view để view lấy messeeg - Ví dụ: - Trong : methods addObject dùng để add exception object cho view C @ControllerAdvice - @ControllerAdvice anotation giúp ta đánh dấu conttoller chuyên đảm nhận nhiệm vụ handle exception 13 Validation From Data - Validation nghĩa thẩm định, hành động ta kiểm tra tính đắn liệu, xem liệu có hợp lệ hay ko A JSR 303 – Java Bean Validation - JSR 303 : đặc tả cung cấp anotation giúp ta valid data - Để dùng JSR 303 ta khai báo sau pom.xml - Một số anotation để valid như: - o @Null : check data null o @NotNull : check data ko phải null o @Min : data có giá trị phải lớn o @Max : data có giá trị phải nhỏ max o @Negative : data số âm (ko gồm 0) o @NegativeOrZerro : data số âm bao gồm o @Positive o @PositiveOrZero o @Size(min = … , max = ) : check xem string có độ dài nằm khoảng max @NotBlank : chuỗi string ko đc trống o … Các anotation dùng trước properties class B @Valid BindingResult - Khi đánh dấu properties đc valid ta muốn kiếm tra data từ from có chưa ta dùng @Valid trước object cần kiểm tra controller - @Valid đánh dấu object có liệu cần đc valid controller Lưu ý : dùng @Valid @ModalAtribute phải có parameter tên object mà methods nhận đc - Ví dụ: - Nếu mà liệu valid dạng đoạn code methods bên chạy cịn data valid ko dạng quăng exception - Để handle exception validation throw ta có cách: dùng đối tượng BindingResult @HandlerException - BindingResult giúp ta handle exception trình valid throw Để kiểm tra BindingResult có giữ exception ko ta dùng methods hasErrors() C Hiển thị errors View thông qua BindingResult - Đối tượng BindingResult tự động chuyển qua view ta ko cần dùng đến model - Ở view ta dùng #fileds (biến xác định trc Spring MVC thường dùng cho việc valid) - Ta dùng methods hasError(“field”) để xác định exception, methods trả true field data invalid o - Dùng * muốn lấy tât field Ngồi ta dùng methods error(“filed”) để xem massage error, message dạng mảng nên ta dùng th:each để chuyển sang chuỗi D Sử dụng messeages.properties để thay đổi eror message - Ta khai báo properties file messeages.properties để thay đổi error message - Syntax: anotation.object.properties = new message - Ví dụ : - Trong recipe.desciption dùng để thay đổi tên thuộc tính 14 Connect Spring Boot với MySQL - Đầu tiên ta cần tạo db để connect - Để kết nối việc ta phải khai báo driver file pom.xml - Ta khai báo properties file properties để connect với mySQL - Ta thấy - o ddl-atuo : để set hành vi ddl o url : khai báo url đến db muốn kết nối URL có dạng jdbc:mysql://localhost:3306/db_name o username : tên username mà ta muốn dùng để kết nối vs db o password : password ta muốn dùng để kết nối với db o driver-class-name : tên driver o show-sql (có thể có ko) : ghi lệnh sql thực log Để khởi tạo dử liệu cho MySQL ta dùng file bootstrap tự khởi tạo SQL 15 Bổ sung CommandLineRunner vs ApplicationListener - Để khởi tạo data vừa start Spring ta có interface giúp ta làm việc Là CommandLineRunner vs ApplicationListener - interface khởi tạo implementation thành bean Spring vừa start, hành vi nên ta tận dụng để khởi tạo dử liệu cho h2 mySQL lần start Spring - Khi implement interface ta phải overide methods run, tất dòng code methods run thực Spring start ... thành biến @Component: anotation để thích class giúp Spring nhận diện Bean Nói cách khác khai báo bean cho Spring Cơ chế tìm bean Spring: Spring tìm class cấp thấp class App để tìm class có anotation... tính cần đc inject từ class bên ngồi Khi Spring khởi tạo bean từ class có anotation tự động inject object cần thiết vào Lưu ý : Spring khởi tạo bean lần inject inject object tạo trước đó, muốn Spring. .. cho spring giúp ta dễ dàng handle beans Để dùng java class để config spring ta dùng anotation @Configuration @Bean @Configuration spring biết class config @Bean anotation nằm methods cho phép spring

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

TỪ KHÓA LIÊN QUAN

w