CodeGym /Blog Java /Ngẫu nhiên /Spring for lazy people Nền tảng, khái niệm cơ bản và ví d...
John Squirrels
Mức độ
San Francisco

Spring for lazy people Nền tảng, khái niệm cơ bản và ví dụ về mã. Phần 1

Xuất bản trong nhóm
Spring for lazy people Nền tảng, khái niệm cơ bản và ví dụ về mã.  Phần 1 - 1Trong bài viết này, tôi sẽ không nói cho bạn biết làm thế nào để thiết lập và chạy một dự án Spring đang hoạt động trong 5 phút bằng cách sử dụng mã của tôi. Tôi sẽ chỉ viết những điều cơ bản — những thứ mà bạn có thể không biết gì mà vẫn tạo được một dự án. Nhưng trong bài viết này, bạn vẫn sẽ không hiểu chuyện gì đang xảy ra và quan trọng hơn là tại sao.

Khung mùa xuân là gì?

Spring Framework, hay đơn giản là Spring, là một trong những framework phổ biến nhất để tạo các ứng dụng web bằng Java. Framework giống như một thư viện (có lẽ bạn quen thuộc với thuật ngữ này hơn), nhưng có một số điều cần xem xét. Nói một cách đại khái, khi bạn sử dụng một thư viện, bạn chỉ cần tạo các thể hiện của các lớp mà nó chứa, gọi các phương thức bạn cần và do đó nhận được kết quả bạn cần. Nói cách khác, đây là cách tiếp cận bắt buộc hơn: trong chương trình của bạn, bạn chỉ rõ thời điểm cụ thể khi bạn cần tạo đối tượng nào, khi nào gọi phương thức cụ thể nào, v.v. Với các framework, mọi thứ hơi khác một chút. Bạn chỉ cần viết một số lớp của riêng mình và viết một số logic trong đó, nhưng sau đó, chính khung đó sẽ tạo ra các thể hiện của các lớp của bạn và gọi các phương thức của chúng. Các lớp của bạn thường triển khai một số giao diện từ khung hoặc kế thừa một số lớp của nó, do đó cung cấp cho bạn một số chức năng đã được viết sẵn cho bạn. Nhưng điều này không phải lúc nào cũng đúng. Ví dụ: Spring cố gắng hết sức có thể để tránh sự kết hợp chặt chẽ như vậy (nơi các lớp của bạn phụ thuộc trực tiếp vào các lớp/giao diện trong khung). Nó sử dụng chú thích để đạt được điều này. Chúng ta sẽ quay lại vấn đề này sau. Nhưng điều quan trọng là phải hiểu rằng Spring chỉ là một tập hợp các lớp và giao diện có sẵn để bạn sử dụng :) Tôi cũng muốn lưu ý ngay rằng Spring không chỉ được sử dụng cho các ứng dụng web mà còn cho các chương trình bảng điều khiển phổ biến nhất đã quá quen thuộc với tất cả chúng ta. Và chúng tôi thậm chí sẽ viết một trong số chúng ngày hôm nay. do đó cung cấp cho bạn một số chức năng đã được viết cho bạn. Nhưng điều này không phải lúc nào cũng đúng. Ví dụ: Spring cố gắng hết sức có thể để tránh sự kết hợp chặt chẽ như vậy (nơi các lớp của bạn phụ thuộc trực tiếp vào các lớp/giao diện trong khung). Nó sử dụng chú thích để đạt được điều này. Chúng ta sẽ quay lại vấn đề này sau. Nhưng điều quan trọng là phải hiểu rằng Spring chỉ là một tập hợp các lớp và giao diện có sẵn để bạn sử dụng :) Tôi cũng muốn lưu ý ngay rằng Spring không chỉ được sử dụng cho các ứng dụng web mà còn cho các chương trình bảng điều khiển phổ biến nhất đã quá quen thuộc với tất cả chúng ta. Và chúng tôi thậm chí sẽ viết một trong số chúng ngày hôm nay. do đó cung cấp cho bạn một số chức năng đã được viết cho bạn. Nhưng điều này không phải lúc nào cũng đúng. Ví dụ: Spring cố gắng hết sức có thể để tránh sự kết hợp chặt chẽ như vậy (nơi các lớp của bạn phụ thuộc trực tiếp vào các lớp/giao diện trong khung). Nó sử dụng chú thích để đạt được điều này. Chúng ta sẽ quay lại vấn đề này sau. Nhưng điều quan trọng là phải hiểu rằng Spring chỉ là một tập hợp các lớp và giao diện có sẵn để bạn sử dụng :) Tôi cũng muốn lưu ý ngay rằng Spring không chỉ được sử dụng cho các ứng dụng web mà còn cho các chương trình bảng điều khiển phổ biến nhất đã quá quen thuộc với tất cả chúng ta. Và chúng tôi thậm chí sẽ viết một trong số chúng ngày hôm nay. Spring cố gắng hết sức có thể để tránh sự kết hợp chặt chẽ như vậy (nơi các lớp của bạn phụ thuộc trực tiếp vào các lớp/giao diện trong khung). Nó sử dụng chú thích để đạt được điều này. Chúng ta sẽ quay lại vấn đề này sau. Nhưng điều quan trọng là phải hiểu rằng Spring chỉ là một tập hợp các lớp và giao diện có sẵn để bạn sử dụng :) Tôi cũng muốn lưu ý ngay rằng Spring không chỉ được sử dụng cho các ứng dụng web mà còn cho các chương trình bảng điều khiển phổ biến nhất đã quá quen thuộc với tất cả chúng ta. Và chúng tôi thậm chí sẽ viết một trong số chúng ngày hôm nay. Spring cố gắng hết sức có thể để tránh sự kết hợp chặt chẽ như vậy (nơi các lớp của bạn phụ thuộc trực tiếp vào các lớp/giao diện trong khung). Nó sử dụng chú thích để đạt được điều này. Chúng ta sẽ quay lại vấn đề này sau. Nhưng điều quan trọng là phải hiểu rằng Spring chỉ là một tập hợp các lớp và giao diện có sẵn để bạn sử dụng :) Tôi cũng muốn lưu ý ngay rằng Spring không chỉ được sử dụng cho các ứng dụng web mà còn cho các chương trình bảng điều khiển phổ biến nhất đã quá quen thuộc với tất cả chúng ta. Và chúng tôi thậm chí sẽ viết một trong số chúng ngày hôm nay. ) Tôi cũng muốn lưu ý ngay rằng Spring không chỉ được sử dụng cho các ứng dụng web mà còn cho các chương trình console phổ biến nhất đã quá quen thuộc với tất cả chúng ta. Và chúng tôi thậm chí sẽ viết một trong số chúng ngày hôm nay. ) Tôi cũng muốn lưu ý ngay rằng Spring không chỉ được sử dụng cho các ứng dụng web mà còn cho các chương trình console phổ biến nhất đã quá quen thuộc với tất cả chúng ta. Và chúng tôi thậm chí sẽ viết một trong số chúng ngày hôm nay.

Kết cấu

Nhưng Spring không chỉ là một framework cụ thể. Thay vào đó, nó là một tên chung được sử dụng để chỉ một số khung nhỏ, mỗi khung thực hiện một loại công việc riêng. Spring for lazy people Nền tảng, khái niệm cơ bản và ví dụ về mã.  Phần 1 - 2

https://docs.spring.io/spring/docs/4.3.26.RELEASE/spring-framework-reference/htmlsingle/
Hình 2.1. Tổng quan về Spring Framework

Như bạn có thể thấy, Spring là mô-đun. Điều này cho phép chúng tôi chỉ kết nối các mô-đun chúng tôi cần cho ứng dụng của mình và không kết nối những mô-đun mà rõ ràng là chúng tôi sẽ không sử dụng. Theo những gì tôi biết, chính cách tiếp cận này đã giúp Spring vượt trội so với đối thủ cạnh tranh lúc bấy giờ (EJB) và dẫn đầu. Các ứng dụng sử dụng EJB kéo theo rất nhiều phụ thuộc đằng sau chúng và kết quả là chúng hoạt động chậm chạp và chậm chạp. Hình ảnh cho thấy Spring Framework bao gồm một số mô-đun:
  • Truy cập dữ liệu
  • mạng
  • Cốt lõi
  • và hơn thế nữa
Hôm nay chúng ta sẽ làm quen với một số khái niệm có trong mô-đun chính: bean, ngữ cảnh và những khái niệm khác. Như bạn có thể đoán, mô-đun Truy cập Dữ liệu chứa các công cụ để làm việc với dữ liệu (chủ yếu là cơ sở dữ liệu) và mô-đun Web để làm việc trên mạng (bao gồm tạo các ứng dụng web, sẽ được thảo luận sau). Ngoài ra, có một cơ sở hạ tầng toàn diện hỗ trợ Spring: nhiều dự án khác không được đưa vào chính thức trong khuôn khổ, nhưng được tích hợp liền mạch vào dự án Spring của bạn (ví dụ: Spring Security, mà tôi cũng hy vọng sẽ đề cập đến, dành cho xác thực người dùng trên một trang web).

Tại sao Java có Spring Framework?

Chà, bên cạnh thực tế là nó hợp thời trang, bóng bẩy và mới mẻ, tôi có thể nói ngay bây giờ rằng ngay khi bạn có được dù chỉ một chút kỹ năng sử dụng Spring, bạn sẽ hiểu có rất nhiều loại công việc mà bạn không còn có nữa. phải làm, và bao nhiêu công việc mà mùa xuân đảm nhận. Bạn có thể viết vài chục dòng cài đặt cấu hình và viết một vài lớp, và bạn kết thúc với một dự án đang hoạt động. Nhưng ngay khi bạn bắt đầu tự hỏi có bao nhiêu thứ đang được giấu kín, bao nhiêu công việc đang được thực hiện và bạn sẽ phải viết bao nhiêu mã nếu bạn định triển khai cùng một dự án dựa trên các servlet hoặc socket thuần túy và Java thuần túy, tóc của bạn sẽ dựng đứng :) Mùa xuân thậm chí còn được mô tả như một loại ma thuật. Bạn trải nghiệm điều này khi bạn thấy rằng mọi thứ đều hoạt động, nhưng bạn cũng có một ý tưởng sơ bộ về cách thức và khối lượng công việc đang diễn ra đằng sau hậu trường — vì vậy có vẻ như thực sự có một loại phép thuật nào đó đang hoạt động :) Gọi nó là phép thuật thì dễ hơn là cố gắng giải thích tất cả được kết nối với nhau như thế nào. :) Lập luận thứ hai ủng hộ việc nghiên cứu Spring là khoảng 90% cơ hội việc làm cho các nhà phát triển cơ sở (dựa trên quan sát cá nhân của tôi) yêu cầu kiến ​​thức hoặc ít nhất là một ý tưởng chung về những gì Spring đang làm.Data, Web MVCSecuritycác mô-đun cung cấp cho các nhà phát triển phức tạp :) Nhưng hôm nay chỉ nói về những điều cơ bản.

DI/IoC

Nếu bạn đã từng thử đọc về Spring, thì điều đầu tiên bạn bắt gặp có lẽ là những từ viết tắt này: DI/IoC. Bây giờ tôi thực sự khuyên bạn nên tạm dừng bài viết này và đọc bài viết này của DZone ! IoC là viết tắt của Đảo ngược điều khiển. Tôi đã đề cập đến điều này khi tôi viết rằng việc sử dụng thư viện liên quan đến việc chính bạn chỉ ra trong mã của mình phương thức nào sẽ gọi đối tượng nào, nhưng việc sử dụng một khung thường có nghĩa là khung đó sẽ gọi mã của bạn vào đúng thời điểm. Nói cách khác, trong trường hợp sau này, bạn không còn quản lý quá trình thực thi mã/chương trình nữa — khung làm việc này giúp bạn. Bạn đã chuyển quyền kiểm soát cho khung (đảo ngược quyền kiểm soát). DI là viết tắt của tiêm phụ thuộc. Với phép nội xạ phụ thuộc, bạn không tạo đối tượng mèo trong phương thức chính rồi chuyển chúng vào phương thức của mình. Thay vào đó, Spring Framework tạo chúng cho bạn. Bạn chỉ cần nói điều gì đó như "Tôi muốn có một con mèo ở đây" và khung sẽ chuyển một con mèo cho bạn theo phương thức của bạn. Chúng ta sẽ thấy chữ viết tắt này trong các bài viết trong tương lai.

Đậu và bối cảnh

Một trong những khái niệm chính trong Spring là bean. Trên thực tế, đây chỉ là một đối tượng của một lớp nào đó. Giả sử chúng ta có một chương trình yêu cầu 3 đối tượng: một con mèo, một con chó và một con vẹt. Và chúng tôi có một loạt các lớp với một loạt các phương thức. Đôi khi chúng ta cần một con mèo cho một phương pháp, đôi khi chúng ta cần một con chó cho một phương pháp khác, và đôi khi các phương pháp của chúng ta cần cả một con mèo và một con vẹt (ví dụ: phương pháp cho mèo ăn, ha-ha). Đối với các phương pháp khác, cả ba đối tượng đều cần thiết. Vâng, trước tiên chúng ta có thể tạo ba đối tượng này trong phương thức chính, sau đó chuyển chúng đến các lớp của chúng ta, sau đó bên trong các lớp này chuyển chúng đến các phương thức liên quan... Và cứ như vậy trong toàn bộ chương trình. Nhưng nếu chúng ta cũng cho rằng thỉnh thoảng chúng ta muốn thay đổi danh sách các tham số đầu vào cho các phương thức của mình (ví dụ: chúng tôi quyết định viết lại một cái gì đó hoặc thêm chức năng mới), thì chúng tôi sẽ phải thực hiện khá nhiều thay đổi đối với mã. Và bây giờ hãy tưởng tượng rằng chúng ta không có 3 mà là 300 đối tượng như vậy. Một cách khác là tập hợp tất cả các đối tượng của chúng ta trong một danh sách (List<Object>), truyền nó cho mọi phương thức, sau đó lấy đối tượng cần thiết khi ở bên trong các phương thức. Nhưng khi chương trình chạy, điều gì sẽ xảy ra nếu một số đối tượng được thêm vào danh sách này, hoặc tệ hơn, nếu một đối tượng bị xóa thì sao? Điều này có khả năng phá vỡ mọi phương thức mà chúng ta sử dụng một chỉ mục để lấy các đối tượng từ danh sách. Để tránh sự cố này, chúng tôi quyết định lưu trữ các đối tượng của mình không phải trong danh sách mà trong bản đồ, trong đó khóa là tên của đối tượng và giá trị là chính đối tượng đó. Điều này cho phép chúng tôi truy xuất các đối tượng mà chúng tôi cần chỉ bằng cách sử dụng tên của chúng, ví dụ: get("parrot") và đáp lại chúng tôi nhận được đối tượng con vẹt. Hoặc khóa có thể là lớp của đối tượng và giá trị có thể là chính đối tượng đó. Trong trường hợp này, thay vì chỉ định tên của đối tượng, mà chỉ có thể chỉ định lớp của đối tượng mà chúng ta cần. Điều đó cũng thuận tiện. Hoặc thậm chí chúng ta có thể viết một số loại trình bao bọc cho bản đồ, trong đó một số phương thức lấy các đối tượng theo tên của chúng và các phương thức khác lấy các đối tượng theo lớp của chúng. Những gì chúng tôi đã đạt được ở đây được gọi là mộtbối cảnh ứng dụng trong Spring Framework. Bối cảnh là một tập hợp các hạt đậu (đối tượng). Chúng tôi truy cập một ngữ cảnh để lấy bean (đối tượng) mà chúng tôi cần theo tên của nó, theo loại của nó hoặc bằng một số phương tiện khác. Ngoài ra, chúng ta có thể yêu cầu chính Spring tìm kiếm bean mà chúng ta cần trong ngữ cảnh của chính nó và chuyển nó cho phương thức của chúng ta. Ví dụ: giả sử chúng ta có một phương thức như sau:

public void doSomething(Cat cat) {
    ...
}
Khi Spring gọi phương thức này, nó lấy đối tượng con mèo của chúng ta từ ngữ cảnh của nó và truyền nó cho phương thức. Nhưng bây giờ chúng tôi đã quyết định rằng, ngoài một con mèo, phương pháp của chúng tôi còn cần một con vẹt. Với Spring, không gì có thể dễ dàng hơn! Chúng tôi chỉ đơn giản viết:

public void doSomething(Cat cat, Parrot parrot) {
    ...
}
Bây giờ khi Spring gọi phương thức của chúng ta, nó hiểu cần phải truyền một con mèo và một con vẹt, vì vậy nó chuyển sang ngữ cảnh của nó, lấy hai đối tượng này và truyền chúng vào phương thức của chúng ta. Bằng cách chuyển giao quyền kiểm soát cho Spring, chúng tôi cũng chuyển giao trách nhiệm tạo các đối tượng và chuyển chúng cho các phương thức của chúng tôi, mà Spring sẽ gọi. Điều này đặt ra câu hỏi: làm thế nào để Spring biết đối tượng (bean) nào sẽ tạo?

Các cách cấu hình ứng dụng

ba cách chính để cấu hình một ứng dụng , tức là các cách để cho Spring biết chính xác đối tượng nào chúng ta cần:
  1. Tệp cấu hình XML
  2. Cấu hình dựa trên Java
  3. cấu hình tự động
Những người tạo ra Spring ưu tiên chúng theo thứ tự sau:
  • phương pháp có ưu tiên hàng đầu, nên được ưu tiên, là cấu hình tự động
  • nếu không thể sử dụng cấu hình tự động để định cấu hình chính xác tất cả các bean có thể, hãy sử dụng cấu hình dựa trên Java (liên quan đến việc tạo các đối tượng bằng mã Java)
  • và phương pháp có mức ưu tiên thấp nhất là cách cũ - sử dụng các tệp cấu hình XML.
Spring cũng cho phép chúng ta kết hợp các phương thức này. Ví dụ: hãy để Spring định cấu hình mọi thứ có thể được định cấu hình tự động, sử dụng cấu hình dựa trên Java ở bất cứ nơi nào bạn cần tham số đặc biệt và sử dụng XML cho bất kỳ cấu hình kế thừa nào. Tất cả điều này hoạt động khá linh hoạt. Tuy nhiên, nếu mọi thứ có thể được cấu hình tự động, hãy chọn tùy chọn đó. Tôi sẽ chỉ xem xét cấu hình tự động và cấu hình dựa trên Java. Các cấu hình XML được sử dụng trong hầu hết mọi ví dụ về Spring trên Internet. Hơn nữa, một khi bạn hiểu cách hoạt động của cấu hình dựa trên Java, bạn sẽ không gặp vấn đề gì khi đọc một tệp XML thực hiện điều tương tự. Cấu hình tự động được sử dụng khi chúng ta cần làm việc với các đối tượng của các lớp mà chúng ta đã viết. Nếu việc tạo một trong các đối tượng của chúng tôi yêu cầu một số logic rất cụ thể, hoặc nếu chúng ta không thể tạo một số lớp có chú thích cần thiết cho cấu hình tự động, thì chúng ta có thể sử dụng cấu hình dựa trên Java để thực hiện những gì cần làm. bên trongphần tiếp theo , chúng ta sẽ tạo một dự án Maven, kết nối một vài mô-đun chính của Spring và tạo các bean đầu tiên của chúng ta.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION