CHƯƠNG 1: SPRING FRAMEWORK 1. Sự ra đời của Spring Vào năm 2002, Spring Framework phát hành phiên bản đầu tiên bởi Rod Johnson. Việc xây dựng các ứng dụng doanh nghiệp trở nên đơn giản và dễ dàng hơn. Theo đà phát triển đó, Spring đã trở thành framework mã nguồn mở phổ biến nhất để xây dựng các ứng dụng doanh nghiệp.
Theo một số nguồn, trên 50% các ứng dụng web Java hiện nay đang sử dụng Spring. Để ngăn chặn sự phức tạp trong phát triển các ứng dụng, Spring Framework thường dựa trên các quan điểm như sau: Đơn giản hóa công việc phát triển thông qua việc sử dụng các POJO (Plain Old Java Object). Nới lỏng ràng buộc giữa các thành phần thông qua việc sử dụng Dependency Injection. Giảm thiểu các mã nghi thức và soạn sẵn (boilerplate) thông qua việc sử dụng các khuôn mẫu (template) và các khía cạnh.
Đặc điểm của Spring Spring Framework cung cấp một mô hình lập trình và cấu hình toàn diện cho các ứng dụng doanh nghiệp dựa trên Java hiện đại - trên bất kỳ loại nền tảng triển khai nào. Spring nhẹ và trong suốt (nhẹ: kích thước nhỏ, version cơ bản chỉ khoảng 2MB; trong suốt: hoạt động một cách trong suốt với lập trình viên). Spring là một mã nguồn mở, được phát triển, chia sẻ và có cộng đồng người dùng rất lớn. Spring Framework được xây dựng dựa trên 2 nguyên tắc design chính là: Dependency Injection (DI) và Aspect Oriented Programming (AOP).
Những tính năng core (cốt lõi) của Spring có thể được sử dụng để phát triển Java Desktop, ứng dụng mobile, Java Web. Mục tiêu chính của Spring là giúp phát triển các ứng dụng J2EE một cách dễ dàng hơn dựa trên mô hình sử dụng POJO (Plain Old Java Object). Ưu và nhược điểm của Spring Ưu điểm: Xác định template trước: Spring Framework cung cấp những template cho Hibernate, Struts, JDBC, v. Vì vậy, lập trình viên không cần phải viết quá nhiều code và có thể bỏ qua những bước cơ bản.
Dễ dàng kiểm thử: Dependency Injection làm cho việc kiểm thử phần mềm, ứng dụng được tiến hành dễ dàng hơn. Dung lượng nhỏ: Spring Framework có dung lượng nhỏ nhờ vào mô hình POJO. Spring Framework không bắt lập trình viên phải kế thừa các lớp hay thực hiện qua bất kì giao diện nào. Đó là lí do Spring Framework được coi là bất khả xâm phạm.
Phát triển nhanh: Dependency Injection tạo nên tính năng đặc biệt của Spring Framework giúp hỗ trợ các framework khác và giúp cho việc phát triển ứng dụng JavaEE dễ dàng hơn. Hỗ trợ khai báo: Spring Framework cung cấp những hỗ trợ khai báo về bộ nhớ đệm, xác nhận, giao dịch và định dạng. Tính trừu tượng: Nó cung cấp sự trừu tượng hóa cao cho các chi tiết JavaEE như JMS, JDBC, JPA và JTA. Spring hỗ trợ sử dụng khá nhiều công nghệ như ORM Framework, các logging framework, JEE, các thư viện tạo lịch trình (Quartz và JDK timer).
Nhược điểm Vì cốt lõi Spring là Dependency Injection và Aspect Oriented Programming nên nó mang nhược điểm của 2 nguyên tắc design này: mã lệnh và luồng chạy chương trình phức tạp. Tuy Spring khá dễ tiếp cận nhưng để thuần hóa nó thực sự là điều không hề dễ dàng, điều này đòi hỏi người phát triển phải có nhiều kinh nghiệm. Spring Core Spring Core chính là thành phần trung tâm, cốt lõi của Spring Framework. Lược đồ dưới đây mô tả mối quan hệ giữa Spring Core với các thành phần khác trong Spring Framework: 4 do an Hình 1.
Spring Framework Runtime 1. Spring Bean Spring Bean là trung tâm của Spring Core và là trái tim của một ứng dụng Spring. Trái ngược với EJB, Spring Framework được thiết kế từ lõi bằng cách sử dụng các POJO hay các Spring Bean. Spring Bean có thể được hiểu là các đối tượng Java đơn giản.
Điều này khá tương đồng với nguyên lý thiết kế “Đơn trách nhiệm” (single responsibility) của Robert C Martin trong lập trình hướng đối tượng. Khái niệm Dependency Injection (có thể dịch tiêm các thành phần phụ thuộc) là một sức mạnh nổi bật của Spring Framework. Dependency Injection là một mẫu thiết kế phần mềm mà các đối tượng phụ thuộc sẽ được inject vào một lớp nào đó. Dependency Injection là một implementation cụ thể của khái niệm Inversion of Control (đảo ngược điều khiển).
Ta sẽ có một ví dụ đơn giản về Dependency Injection như sau: Bạn có một web controller có nhiệm vụ lưu thông tin gửi từ form người dùng. Theo nguyên lý Đơn trách nhiệm, bạn không muốn lớp controller tương tác với cơ sở dữ liệu. Thay vào đó, bạn sẽ sử dụng một lớp service để làm công việc này. Như vậy, controller của bạn sẽ chỉ phải xử lý dữ liệu của form (get form data, validate data,…) rồi gọi một phương thức của lớp service được inject để lưu dữ liệu.
Controller không cần phải quan tâm hay lo lắng về 5 do an kết nối cơ sở dữ liệu, pooling hay bảng nào sẽ được update. Cũng như service không cần phải biết request có những thông tin gì. Ưu và nhược điểm Ưu điểm: Làm cho clients độc lập hơn dễ dàng hơn để kiểm tra đơn vị. Thúc đẩy tái sử dụng, kiểm thử và bảo trì.
Giảm mã boilerplate trong các đối tượng áp dụng từ tất cả các công việc để khởi tạo hoặc thiết lập phụ thuộc được xử lý bởi một thành phần cung cấp. Dependency Injection cho phép phát triển đồng thời hoặc độc lập. Nhược điểm: Các nhà phát triển phải tham khảo nhiều tập tin theo cách một hệ thống thực hiện. Dependency Injection thường đòi hỏi nhiều dòng code để thực hiện cùng một code thừa kế.
Aspect Oriented Programming 1. Khái niệm Aspect Oriented Programming (AOP) – lập trình hướng khía cạnh: là một kỹ thuật lập trình (kiểu như lập trình hướng đối tượng) nhằm phân tách chương trình thành cách module riêng rẽ, phân biệt, không phụ thuộc nhau. Khi hoạt động, chương trình sẽ kết hợp các module lại để thực hiện các chức năng nhưng khi sửa đổi 1 chức năng thì chỉ cần sửa 1 module. AOP không phải dùng để thay thế OOP mà để bổ sung cho OOP.
Aspect Oriented Programming 6 do an 1. Ưu và nhược điểm Ưu điểm: Thiết kế đơn giản: “You aren’t gonna need it (YAGNI)” – chúng ta chỉ cài đặt những thứ chúng ta thực sự cần mà không bao giờ cài đặt trước. Cài đặt chương trình một cách trong sáng: mỗi một module chỉ làm cái mà nó cần phải làm, giải quyết được hai vấn đề code tangling và code scattering. Tái sử dụng dễ dàng.
Nhược điểm: Khái nhiệm khá trừu tượng, độ trừu tượng của chương trình cao. Luồng chương trình phức tạp. Spring Context Spring Context mang mọi thứ lại với nhau. Spring Context kế thừa các tính năng của Spring Bean và bổ sung các hỗ trợ cho internationalization (ví dụ như các resource bundle), event propagation, resource loading … Ngoài ra, Spring Context cũng hỗ trợ các tính năng của Java EE như EJB, JMX và truy cập từ xa cơ bản.
Interface ApplicationContext là tiêu điểm của Spring Context. Spring Expression Language (SpEL) Spring Expression Language là một ngôn ngữ ngắn gọn giúp cho việc cấu hình Spring Framework trở nên linh hoạt hơn. Internationalization (i18n) Spring cung cấp các hỗ trợ mở rộng đa ngôn ngữ cho mục đích quốc tế hóa (Internationalization) (i18n) thông qua việc sử dụng Spring Interceptor, Locale Resolvers và Resource Bundles cho các địa phương khác nhau. Các dự án của Spring Trên thực tế Spring Framework là một tập hợp của nhiều dự án con.
Spring Core như chúng ta đã tìm hiểu là nền tảng của các dự án trong Spring Framework. Một một dự án sẽ đảm nhận một chức năng riêng trong việc xây dựng các ứng dụng. Các dự án lớn của Spring Framework bao gồm: 7 do an Spring MVC: Được thiết kế dành cho việc xây dựng các ứng dụng nền tảng web. Đây là một dự án chúng ta không thể bỏ qua khi xây dựng các ứng dụng Java web.
Spring Data: Cung cấp một cách tiếp cận đúng đắn để truy cập dữ liệu từ cơ sở dữ liệu quan hệ, phi quan hệ, map-reduce và thậm chí còn hơn thế nữa. Spring Security: Dự án này cung cấp các cơ chế xác thực (authentication) và phân quyền (authorization) cho ứng dụng của bạn. Spring Boot: Spring Boot là một framework giúp chúng ta phát triển cũng như chạy ứng dụng một cách nhanh chóng. Spring Batch: Dự án này giúp chúng ta dễ dàng tạo các lịch trình (scheduling) và tiến trình (processing) cho các công việc xử lý theo mẻ (batch job).
Spring Integration: Là một implementation của Enterprise Integration Patterns (EIP). Dự án này thiết kế một kiến trúc hướng thông điệp hỗ trợ việc tích hợp các hệ thống bên ngoài. Spring XD: Mục tiêu của dự án này là đơn giản hóa công việc phát triển các ứng dụng Big Data. Spring Social: Dự án này sẽ kết nối ứng dụng của bạn với các API bên thứ ba của Facebook, Twitter, Linkedin … Hình 3.
Sơ lược các thành phần trong Spring Framework Trong giới hạn của đề tài, chúng ta sẽ tìm hiểu kỹ hơn về các dự án phục vụ việc phát triển web: 8 do an 1. Spring Boot Spring Boot là một Project nằm trên tầng IO Execution (Tầng thực thi) của Spring IO Framework. Spring Boot là một bước tiếp theo của Spring, để làm cho Spring dễ dàng hơn trong việc thiết lập và phát triển ứng dụng. Với Spring Boot, các cấu hình Spring được giảm thiểu tối đa.
Spring Boot hỗ trợ các bộ chứa nhúng (embedded containers) điều này cho phép các ứng dụng web có thể chạy độc lập mà không cần phải trên khai lên các Web Server. Spring Boot có thể giải thích một cách đơn giản bởi hình minh họa dưới đây: Hình 4. Minh họa Spring Boot Lợi ích của Spring Boot: Nó rất dễ dàng để phát triển các ứng dụng dựa trên Spring với Java hoặc Groovy. Nó giảm thiểu thời gian phát triển và tăng năng xuất.
Nó tránh việc phải viết nhiều mã nguyên mẫu (boilerplate Code), Annotations và các cấu hình XML. Nó dễ dàng để bạn tương tác các ứng dụng Spring Boot với các hệ sinh thái của Spring như Spring JDBC, Spring ORM, Spring Data, Spring Security. Nó đi theo cách tiếp cận “Nguyên tắc cấu hình mặc định” để giảm thiểu thời gian và nỗ lực cần thiết để phát triển ứng dụng. Nó cung cấp các Server nhúng (Embedded HTTP servers) như là Tomcat, Jetty.
để phát triển và test các ứng dụng web nhanh chóng và dễ dàng. Nó cung cấp công cụ CLI (Command Line Interface) để phát triển và test các ứng dụng Spring Boot (Java hoặc Groovy) từ các dòng lệnh (command prompt) rất dễ dàng và nhanh chóng.