Đây là phần giới thiệu về từng công nghệ được đề cập.
Spring-DAO
Spring-DAO không phải là một mô-đun mùa xuân theo nghĩa chặt chẽ, mà là các quy ước sẽ quy định bạn viết DAO và viết chúng tốt. Do đó, nó không cung cấp giao diện, triển khai cũng như mẫu để truy cập dữ liệu của bạn. Khi viết DAO, bạn nên chú thích chúng @Repository
để các ngoại lệ được liên kết với công nghệ cơ bản (JDBC, Hibernate, JPA, v.v.) luôn được dịch sang DataAccessException
lớp con thích hợp .
Ví dụ: giả sử bạn hiện đang sử dụng Hibernate và lớp dịch vụ của bạn bắt kịp HibernateException
để phản ứng với nó. Nếu bạn thay đổi thành JPA, các giao diện DAO của bạn sẽ không thay đổi và lớp dịch vụ sẽ vẫn biên dịch với các khối bắt HibernateException
, nhưng bạn sẽ không bao giờ nhập các khối này vì các DAO của bạn hiện đang ném JPA PersistenceException
. Bằng cách sử dụng @Repository
trên DAO của bạn, các ngoại lệ được liên kết với công nghệ cơ bản được chuyển sang Spring DataAccessException
; lớp dịch vụ của bạn nắm bắt được các ngoại lệ này và nếu bạn quyết định thay đổi công nghệ bền bỉ, thì Spring tương tự DataAccessExceptions
sẽ vẫn được ném ra vì spring đã dịch các ngoại lệ gốc.
Tuy nhiên, lưu ý rằng điều này có giới hạn sử dụng vì những lý do sau:
- Thông thường, bạn không nên nắm bắt các trường hợp ngoại lệ liên tục, vì nhà cung cấp có thể đã lùi giao dịch (tùy thuộc vào loại ngoại lệ chính xác) và do đó bạn không nên tiếp tục thực hiện với một đường dẫn thay thế.
- Hệ thống phân cấp các trường hợp ngoại lệ thường phong phú hơn trong nhà cung cấp của bạn so với những gì Spring cung cấp và không có ánh xạ chính xác từ nhà cung cấp này sang nhà cung cấp kia. Dựa vào điều này là nguy hiểm. Tuy nhiên, đây là một ý tưởng hay để chú thích các DAO của bạn
@Repository
, vì các hạt đậu sẽ được tự động thêm vào bằng quy trình quét. Hơn nữa, Spring có thể thêm các tính năng hữu ích khác vào chú thích.
Spring-JDBC
Spring-JDBC cung cấp lớp JdbcTemplate, loại bỏ mã đường ống dẫn nước và giúp bạn tập trung vào truy vấn SQL và các tham số. Bạn chỉ cần cấu hình nó bằng một DataSource
, và sau đó bạn có thể viết mã như sau:
int nbRows = jdbcTemplate.queryForObject("select count(1) from person", Integer.class);
Person p = jdbcTemplate.queryForObject("select first, last from person where id=?",
rs -> new Person(rs.getString(1), rs.getString(2)),
134561351656L);
Spring-JDBC cũng cung cấp JdbcDaoSupport mà bạn có thể mở rộng để phát triển DAO của mình. Về cơ bản, nó định nghĩa 2 thuộc tính: một DataSource và một JdbcTemplate mà cả hai đều có thể được sử dụng để triển khai các phương thức DAO. Nó cũng cung cấp một trình dịch ngoại lệ từ ngoại lệ SQL sang ngoại lệ DataAccessExceptions mùa xuân.
Nếu bạn định sử dụng jdbc thuần túy, đây là mô-đun bạn sẽ cần sử dụng.
Spring-ORM
Spring-ORM là một mô-đun ô bao gồm nhiều công nghệ bền bỉ, cụ thể là JPA, JDO, Hibernate và iBatis. Đối với mỗi công nghệ này, Spring cung cấp các lớp tích hợp để mỗi công nghệ có thể được sử dụng theo các nguyên tắc cấu hình của Spring và tích hợp trơn tru với quản lý giao dịch của Spring.
Đối với mỗi công nghệ, cấu hình về cơ bản bao gồm việc tiêm một DataSource
hạt đậu vào một số loại SessionFactory
hoặc EntityManagerFactory
vv. Đối với JDBC thuần túy, không cần các lớp tích hợp như vậy (ngoài JdbcTemplate), vì JDBC chỉ dựa vào DataSource.
Nếu bạn định sử dụng ORM như JPA hoặc Hibernate, bạn sẽ không cần spring-jdbc mà chỉ cần mô-đun này.
Spring-Data
Spring-Data là một dự án ô cung cấp một API chung để xác định cách truy cập dữ liệu (DAO + chú thích) theo cách chung chung hơn, bao gồm cả nguồn dữ liệu SQL và NOSQL.
Ý tưởng ban đầu là cung cấp một công nghệ để nhà phát triển viết giao diện cho DAO (các phương thức của công cụ tìm kiếm) và các lớp thực thể theo cách bất khả tri về công nghệ và chỉ dựa trên cấu hình (chú thích về DAO & các thực thể + cấu hình mùa xuân, có thể là xml- hoặc dựa trên java), quyết định công nghệ triển khai, có thể là JPA (SQL) hoặc redis, hadoop, v.v. (NOSQL).
Nếu bạn tuân theo các quy ước đặt tên được xác định bởi spring cho các tên phương thức công cụ tìm kiếm, bạn thậm chí không cần cung cấp các chuỗi truy vấn tương ứng với các phương thức công cụ tìm kiếm cho các trường hợp đơn giản nhất. Đối với các tình huống khác, bạn phải cung cấp chuỗi truy vấn bên trong các chú thích trên các phương thức của công cụ tìm.
Khi ngữ cảnh ứng dụng được tải, spring sẽ cung cấp proxy cho các giao diện DAO, chứa tất cả các mã soạn sẵn liên quan đến công nghệ truy cập dữ liệu và gọi các truy vấn đã định cấu hình.
Spring-Data tập trung vào các công nghệ không phải SQL, nhưng vẫn cung cấp một mô-đun cho JPA (công nghệ SQL duy nhất).
Cái gì tiếp theo
Biết tất cả những điều này, bây giờ bạn phải quyết định những gì để chọn. Tin tốt ở đây là bạn không cần phải đưa ra lựa chọn cuối cùng cho công nghệ. Đây thực sự là nơi Spring power cư trú: là một nhà phát triển, bạn tập trung vào công việc kinh doanh khi bạn viết mã và nếu bạn làm tốt, việc thay đổi công nghệ cơ bản là một chi tiết triển khai hoặc cấu hình.
- Xác định mô hình dữ liệu với các lớp POJO cho các thực thể và các phương thức get / set để đại diện cho các thuộc tính của thực thể và các mối quan hệ với các thực thể khác. Bạn chắc chắn sẽ cần chú thích các lớp và trường thực thể dựa trên công nghệ, nhưng hiện tại, POJO là đủ để bắt đầu. Bây giờ chỉ cần tập trung vào các yêu cầu kinh doanh.
- Xác định giao diện cho các DAO của bạn. 1 DAO bao gồm chính xác 1 thực thể, nhưng bạn chắc chắn sẽ không cần DAO cho từng thực thể đó, vì bạn có thể tải thêm các thực thể bằng cách điều hướng các mối quan hệ. Xác định các phương thức tìm kiếm tuân theo các quy ước đặt tên nghiêm ngặt.
- Dựa trên điều này, người khác có thể bắt đầu làm việc trên lớp dịch vụ, với các chế độ giả mạo cho DAO của bạn.
- Bạn tìm hiểu các công nghệ bền bỉ khác nhau (sql, no-sql) để tìm ra công nghệ phù hợp nhất với nhu cầu của mình và chọn một trong số chúng. Dựa trên điều này, bạn chú thích các thực thể và triển khai các DAO (hoặc để mùa xuân triển khai chúng cho bạn nếu bạn chọn sử dụng dữ liệu mùa xuân).
- Nếu các yêu cầu kinh doanh phát triển và công nghệ truy cập dữ liệu của bạn không đủ để hỗ trợ nó (giả sử bạn bắt đầu với JDBC và một vài thực thể, nhưng bây giờ cần một mô hình dữ liệu phong phú hơn và JPA là lựa chọn tốt hơn), bạn sẽ phải thay đổi cách triển khai trong số các DAO của bạn, thêm một vài chú thích trên các thực thể của bạn và thay đổi cấu hình mùa xuân (thêm định nghĩa EntityManagerFactory). Phần còn lại của mã doanh nghiệp của bạn sẽ không thấy các tác động khác từ thay đổi của bạn.
Lưu ý: Quản lý giao dịch
Spring cung cấp một API để quản lý giao dịch. Nếu bạn dự định sử dụng spring để truy cập dữ liệu, bạn cũng nên sử dụng spring để quản lý giao dịch, vì chúng tích hợp với nhau rất tốt. Đối với mỗi công nghệ truy cập dữ liệu được hỗ trợ bởi Spring, có một trình quản lý giao dịch phù hợp cho các giao dịch địa phương hoặc bạn có thể chọn JTA nếu bạn cần các giao dịch phân tán. Tất cả chúng đều triển khai cùng một API, do đó (một lần nữa) lựa chọn công nghệ chỉ là vấn đề cấu hình có thể được thay đổi mà không ảnh hưởng thêm đến mã doanh nghiệp.
Lưu ý: Tài liệu mùa xuân
Các liên kết đến tài liệu Spring mà bạn đã đề cập khá cũ. Đây là tài liệu của bản phát hành mới nhất (4.1.6, bao gồm tất cả các chủ đề):
Spring-data không phải là một phần của Spring framework. Có một mô-đun chung mà bạn nên đọc trước để làm quen với các nguyên tắc. Tài liệu có thể được tìm thấy tại đây: