Spring Framework

Trở thành lập trình viên Java là một sự lựa chọn tuyệt vời.

Trải qua hơn 20 năm phát triển, Java đã để lại nhiều dấu ấn, tốt có, xấu có. Nếu coi Java như nền tảng quan trọng để xây dựng Enterprise Software thì Spring chiếm một phần không hề nhỏ trong nền tảng ấy.

Khi Spring ra đời, nhiệm vụ của nó là thay thế các công nghệ Java dùng cho doanh nghiệp, vốn khá cồng kềnh và nặng nề như EJB. Spring đề xuất một giải pháp nhẹ nhàng, tinh gọn hơn so với EJB bằng cách bơm cho POJO sức mạnh vốn chỉ có ở EJB và các anh em của nó. Dần dần EJB và J2EE cũng cải tiến theo hướng của Spring: EJB cũng sử dụng POJO, triển khai ý tưởng DI(Dependency Injection) và AOP(Aspect-Oriented Programming).

Dù J2EE(hay JEE) có thể đuổi kịp được Spring, Spring vẫn không ngừng phát triển và vươn xa đến những vùng đất J2EE mới chỉ chập chững hoặc chưa từng đặt chân vào như: phát triển trên nền mobile, tích hợp social API, NoSQL database, cloud computing, big data… Tương lai của Spring thực sự rất tươi sáng.

Khóa học lập trình Java Web spring -  giáo trình nâng cao - demo dự án thực tế - Hoàn thành đồ án đảm bảo việc có việc - khai giảng tháng 13/8.
 
Spring Components
Sơ lược các thành phần trong Spring Framework

Tôi là một Spring developer từ năm 2004. Từ đó đến nay, tôi dùng Spring cho mọi dự án tôi tham gia. Spring gồm rất nhiều mô-đun và mỗi dự án được tôi áp dụng một hoặc nhiều mô-đun phù hợp. 

Trong bài viết này, tôi liệt kê 11 lý do sử dụng Spring cho project của bạn. Tôi sẽ cố gắng giúp bạn có một cái nhìn tổng quan về các mô-đun của Spring cũng như các trường hợp áp dụng chúng. Tất cả đều được đúc kết từ kinh nghiệm thực chiến của tôi.

Có thể bạn sẽ lạ lẫm với một số công nghệ nhưng điều quan trọng là bạn phải nắm được vấn đề mà công nghệ đó đang giải quyết.

1. Xây dựng Web Application với Spring:

Web application

Với nhiều Java developer, phát triển web application là mục tiêu chính của họ. Nếu bạn đã và đang hướng đến mục tiêu này, bạn sẽ nhận thấy rõ 3 thử thách cần vượt qua :  state management, workflow, validation. Một điều không vui nữa, HTTP lại là stateless design, vì vậy, vượt qua 3 thử thách kể trên chưa bao giờ đơn giản.

Spring MVC là một framework được xây dựng trên nền của Spring. Nó vẫn bảo tồn được các tinh hoa của Spring và là một công cụ đắc lực hỗ trợ bạn trong vấn đề này. Dựa trên mô hình MVC kinh điển, Spring MVC sẽ giúp bạn xây dựng các web application linh hoạt và mạnh mẽ.

Mặc dù tôi không bắt đầu sự nghiệp Spring developer của mình với Spring MVC nhưng về sau, đa số các dự án tôi tham gia đều cần đến nó. 

Spring web flow
Spring Web Flow

Nếu bạn cần một web app kiểu stateful, hãy thử Spring Web Flow. Spring Web Flow giúp bạn xây dựng một wizard - một tập hợp các cửa sổ mà người dùng phải duyệt qua tuần tự trước khi lấy được dữ liệu. Spring Web Flow giúp bạn tránh được việc lưu trữ quá nhiều dữ liệu tạm.

Với Spring Web Flow, bạn có thể thử sức với một project đặt vé máy bay, vé tàu hỏa.

2.  Tiếp cận với RESTful Service:

RESTful service

Với phần này, hãy làm quen với Spring HATEOAS. HATEOAS là một ràng buộc thuộc REST application architecture. Xem thêm về HATEOAS tại đây.

HATEOAS = Hypermedia As The Engine Of Application State.

Spring HATEOAS
Spring HATEOAS

Tôi sẽ thử một cách diễn giải ngắn gọn nhất về HATEOAS. Tôi hiểu concept của nó nhưng tôi chưa áp dụng HATEOAS vào project của mình bao giờ.

Một web service developer sẽ cung cấp một "hợp đồng" với consumer của service đó trước khi consumer gọi đến service.

Trong thế giới của SOAP, điều này gần giống với việc tạo một interface, nhờ interface đó mà client biết được method nào có thể sử dụng được.

Trong thế giới của REST, chúng ta xây dựng các URL kèm theo dữ liệu phù hợp, chúng ta vẫn cần biết server đang "mong đợi" thông tin gì.

Trong thế giới của Hypermedia, bộ phận resource identifier (bộ nhận dạng tài nguyên) sẽ đưa ra các yếu tố liên quan đến những thông tin mà nó cần. Những yếu tố này có thể coi như các quy ước để tương tác giữa 2 bên trong tương lai.

Jersey cũng là một open source web service xây dựng trên nền tảng Java. Việc xây dựng web service của Jersey tuân theo đặc tả của JSR. 
Việc convert các API từ Spring sang Jersey và ngược lại tương đối dễ dàng. 

Jersey chỉ tập trung vào REST, Jersey không thể hỗ trợ một JSP webpage trong khi Spring MVC mang lại cho bạn cả 2 thứ một cách xuất sắc. Nếu client muốn dùng jQuery trong JSP webpage, Spring MVC hoàn toàn đáp ứng được. Kể cả khi bạn muốn sử dụng một framework JavaScript MVC bất kỳ, Spring MVC vẫn hỗ trợ bạn. Theo tôi, khi bạn phân vân giữa Spring MVC và các giải pháp khác, hãy theo Spring MVC.

Spring MVC mang đến sự thanh thoát cũng như đảm bảo cấu trúc mạch lạc cho mô hình servlet programming. Nó tách riêng model với view (Thực ra vấn đề này được Struts MVC giải quyết từ cách đây rất lâu. Spring MVC chỉ theo sau một chút)

Các framework Javascript MVC có vài trò gần giống với Spring MVC nhưng chúng được áp dụng cho tầng Javascript. Với các framework Javascript MVC, bạn có thể dựng các trang web độc lập với logic của server.

Hai tầng được dựng từ Java và Javascript sẽ liên lạc và trao đổi dữ liệu với server thông qua các đường RESTful (RESTful URL).

3. Spring Security và vấn đề bảo mật:

Với tất cả project có dính dáng đến phát triển web, tôi đều cần đến Spring Security. Sau đây là 2 phút giới thiệu về Spring Security:

Spring Security
Spring Security

Spring Security sẽ interceipt các URL theo một mẫu (pattern) nào đó, chẳng hạn, các URL có dạng "/user" thì mọi người dùng đều truy cập được, còn dạng "admin" thì chỉ khả dụng với một vài cá nhân nào đó. 

Nhờ Spring Security, bạn có thể dán một annotation lên các method để phục vụ công tác bảo mật. Tôi sẽ dành một bài viết về vấn đề này.

Spring Security cung cấp cả 2 cơ chế authentication(xác thực) và authorization(phân quyền):

Xác thực - authentication: xác định bạn là ai

Phân quyền - authorization: giới hạn những hành động của bạn

Khi bắt đầu một project mới, tôi tích hợp Spring Security và sử dụng cơ chế in-memory authentication.

Với cơ chế này, bạn sẽ tạo ra sẵn một đống username, password và các phân quyền, nhét chúng vào một file xml hoặc java... Spring Security sẽ cho phép bạn truy cập với một username và password tương ứng, sau khi truy cập, bạn sẽ được phân quyền phù hợp. Sau này, bạn có thể thay đổi cơ chế xác thực, phân quyền mà không làm ảnh hưởng tới business logic của hệ thống.

4. Thao tác trong CSDL với Spring

Spring Data

Để làm việc với cơ sở dữ liệu, tôi thường dùng Spring ORM và hibernate. 

ORM = Object Relational Mapping - Một cơ chế cho phép biểu diễn các bảng dữ liệu dưới dạng Java object và ngược lại. Hibernate myBatis là hai ORM framework phổ biến nhất. Một sự thật thú vị, trước khi iPhone và iPad trở nên phổ biến, myBatis từng được biết đến dưới cái tên iBatis.

Nếu bạn phải xử lý một lượng lớn các đoạn code JDBC cồng kềnh, hãy chuyển qua Spring JDBC. Spring JDBC sẽ giúp thu gọn đáng kể khối code JDBC truyền thống thông qua các Template

Tôi đã từng gặp trường hợp dùng hibernate cho ORM nhưng phải gọi một SQL procedure từ hệ quản trị CSDL Oracle. Vì hibernate chỉ chấp nhận các dạng procedure "phù hợp" nên tôi sẽ dùng Spring JDBC để gọi procedure này nếu hibernate không chấp nhận nó.

Nếu bạn đang làm project mới, hãy thử Spring Data.... Với Spring Data, bạn không cần viết các CRUD operation. Chúng được tích hợp sẵn, tôi sẽ giải thích điều này trong một bài viết khác. Tôi đã kết hợp Spring Data với Oracle và MongoDB, mọi thứ hoạt động rất trơn tru. Spring Data cũng hộ trợ các CSDL NoSQL và CSDL dạng đồ thị như Redis,Neo4j, Cassandra, Couchbase....

CRUD operation = CReate, Update, Delete. Xem thêm về CRUD tại đây

5. Spring Batch

Spring Batch

Spring Batch cung cấp một tập hợp các reusable function (các hàm có thể tái sử dụng). Các hàm này giữ vai trò trọng yếu khi xử lý một lượng lớn các bản ghi trong CSDL. 

Tôi đã gặp trường hợp những câu truy vấn CSDL mất tới 1 tiếng đồng hồ để hoàn thành (tôi sẽ giải thích lý do ở phần sau). Và tất nhiên bạn không thể bắt người dùng đợi từng đó thời gian để lấy được kết quả mà họ mong muốn.

Trong một project tôi tham gia liên quan đến kiểm toán, mỗi phép toán trên CSDL đều tác động lên hàng triệu bản ghi, với trường hợp này, chúng tôi dùng Spring Batch. 

Khi đó, mỗi request phát sinh sẽ kích hoạt một Spring Batch Job và ngay lập tức một Job ID sẽ được trả về. Tôi có thể dùng Job ID đó để kiểm soát trạng thái của tiến trình xử lý và thông báo cho người dùng biết tiến độ công việc. Các thông báo cho người dùng có thể xuất hiện dưới dạng email notification hoặc bạn có thể dùng web sockets để bắn trực tiếp notification tới người dùng khi họ đang online. 

Spring Batch cũng cung cấp cho bạn một giải pháp để tự động sinh các thông báo khi trạng thái của hệ thống thay đổi. ...

Spring Batch sẽ đảm bảo tính toàn vẹn và nhất quán dữ liệu.

6. Spring Integration và các hệ thống ngoại vi:

Trong một project gần đây của tôi, đối tác sẽ gửi các report qua web service với định dạng XML. Trung bình, chúng tôi nhận 100.000 file XML trong 6 tháng. Các file XML này không quá lớn nhưng vấn đề ở đây là không thể xác định được thời điểm mà các file sẽ được gửi đến. Vì vậy, mục tiêu là phải có một bộ phận tự động "hứng" được các file này ngay khi chúng được gửi dến, sau đó tiến hành tiền xử lý rồi chuyển tiếp vào hệ thống.

Spring Integration
Spring Integration

Đó là một kịch bản phổ biến khi bạn xây dựng một service phụ thuộc vào hệ thống bên ngoài. 

Với trường hợp này, chúng tôi chọn Spring Integration. Chúng tôi cài đặt một file poller - lấy nơi đó để lưu trữ các file mà bên khách hàng gửi đến. Khi có bất cứ file nào "bay" đến, một event sẽ được tự động kích hoạt, thực hiện các nghiệp vụ xử lý rồi chuyển vào hệ thống.

Tất nhiên phần code xử lý các file này độc lập hoàn toàn so với phần còn lại của hệ thống. Nhờ vậy, hệ thống của chúng tôi không phụ thuộc hoàn toàn vào hệ thống của đối tác. Bên cạnh đó, việc test các mô-đun nhận file này cũng dễ dàng hơn rất nhiều.

7. Spring Test

Spring không hề đứng ngoài xu thế TDD. Nó cung cấp một module phục vụ cho test các application - Spring Test 

Trong module này, với Unit Test, bạn sẽ có một tập các mock object implementation để viết unit test tương thích với JNDI, servlet, portlets. Còn với Integration Test, module này hỗ trợ việc load các bean theo nhiều context khác nhau.

8. Áp dụng Spring cho các Java project đơn lẻ

Tôi từng tham gia phát triển một sản phẩm có giao diện dạng CLI - Command Line Interface - giao diện command line. Sản phẩm này có các business rules engine dựa trên nền Java và rất nặng về XML parsing. Khi hệ thổng có vấn đề, rất khó để test xem rắc rối đang xảy ra ở đâu.

Giải pháp mà tôi đề xuất lúc đó là áp dụng Spring Framework vào quy trình test. Tôi dùng các mô-đun Spring Context, Spring Test và JUnit, sau đó tạo một test package trong project đó. Tester sẽ có một file XML và các unit test để chuẩn bị dữ liệu trước mỗi lượt test.

9. Chuyển đổi application thành dạng executable với Spring boot:

Spring Boot

Spring Boot là một project mới dựa trên ý tưởng sử dụng chính Spring để đơn giản hóa Spring.

Spring Boot chủ yếu sử dụng automatic configuration để loại bỏ Spring configuration truyền thống. Dù ta sử dụng Gradle hay Maven, Spring Boot đều cung cấp một số starter project được tối ưu sẵn để giảm kích thước build files.

10. Spring Social và quá trình tích hợp các phương tiện truyền thông

Spring Social

Tôi từng sử dụng mô đun này trong một startup của mình vài năm về trước (startup của tôi thất bại - nhưng ít nhất không phải thất bại vì lí do công nghệ)

Tôi dùng Spring Social để cho phép người dùng sign in vào application của mình. Application của tôi cho phép đăng nhập từ Facebook, Google, LinkedIn, Twitter..... Spring Socical sử dụng cơ chế OAuth để việc login từ các trang mạng xã hội trở nên suôn sẻ. 

Tôi cũng áp dụng Spring Mobile cho application của mình. Spring Mobile cho phép bạn tinh chỉnh application sao cho phù hợp với các thiết bị di động. Dù vậy, thực tế cho thấy Spring Mobile không phải là lựa chọn đúng đắn nhất cho các thiết bị di động. Thay vào đó, hãy cân nhắc Bootstrap và AngularJS.

11. Bắt đầu một project với Spring 

Spring sẽ giúp bạn bắt đầu một project bất kì phù hợp với nhu cầu của chính bạn.

Trong vòng vài phút, Spring Boot sẽ giúp bạn tạo một web app hoặc standalone app, rất đơn giản nhưng không kém phần mạnh mẽ. Bạn có thể dùng Grails, kết quả thu được tương tự!

Spring Cloud là nền tảng để xây dựng micro service một cách nhanh chóng. Micro service xây dựng bởi Spring Cloud đã được tự động config phục vụ cho resgistration và discovery.

Spring XD sẽ là trợ thủ đắc lực cho các hệ thống phân tán và big data.

Spring Components
Sơ lược các thành phần trong Spring Framework

Tổng kết

Tôi hi vọng bài viết này đã giúp bạn đã nắm được những ý niệm cơ bản về cơ chế hoạt động cũng như các thành phần của Spring Framework. 

Đối với các vấn đề mà tôi đã nhắc đến, nếu bạn tìm được phương pháp giải quyết khác, hãy mạnh dạn chia sẻ với tôi cũng như cộng đồng developer trên toàn thế giới.

Bài viết được dịch từ springtutorials.com , có tham khảo ý tưởng từ cuốn Spring In Action - Tác giả: Craig Walls.