Spring vs EJB. Spring có thể thay thế EJB không? [đóng cửa]


96

Spring có thể sử dụng các giao dịch giống như EJB . Đối với tôi, Spring có thể thay thế yêu cầu sử dụng EJB. Bất cứ ai có thể cho tôi biết những lợi ích bổ sung của việc sử dụng EJB là gì?

Câu trả lời:


201

Spring được phát triển để thay thế cho EJB ngay từ khi mới thành lập, vì vậy câu trả lời là tất nhiên bạn có thể sử dụng Spring thay cho EJB.

Nếu có "lợi thế" khi sử dụng EJB, tôi muốn nói rằng điều đó sẽ phụ thuộc vào kỹ năng của đội bạn. Nếu bạn không có chuyên môn về Spring và có nhiều kinh nghiệm về EJB, thì có thể gắn bó với EJB 3.0 là một bước đi tốt.

Về lý thuyết, máy chủ ứng dụng được viết để hỗ trợ tiêu chuẩn EJB có thể được chuyển từ máy chủ ứng dụng Java EE tuân thủ này sang máy chủ ứng dụng Java EE tương thích. Nhưng điều đó có nghĩa là tránh xa bất kỳ và tất cả các tiện ích mở rộng dành riêng cho nhà cung cấp khóa bạn với một nhà cung cấp.

Dễ dàng chuyển các cổng Spring giữa các máy chủ ứng dụng (ví dụ: WebLogic, Tomcat, JBOSS, v.v.) vì nó không phụ thuộc vào chúng.

Tuy nhiên, bạn bị khóa vào Spring.

Spring khuyến khích các phương pháp thiết kế OO tốt (ví dụ: giao diện, lớp, tách các mối quan tâm) có lợi cho bất kỳ vấn đề nào họ chạm vào, ngay cả khi bạn quyết định chuyển sang Guice hoặc khung DI khác.

Cập nhật: Câu hỏi và câu trả lời này đã có năm tuổi vào năm 2014. Cần phải nói rằng thế giới lập trình và phát triển ứng dụng đã thay đổi rất nhiều trong thời gian đó.

Nó không chỉ là sự lựa chọn giữa Java hoặc C #, Spring hoặc EJB. Với vert.x , bạn có thể tránh hoàn toàn Java EE. Bạn có thể viết các ứng dụng đa ô, có khả năng mở rộng cao mà không cần máy chủ ứng dụng.

Cập nhật: Bây giờ là tháng 3 năm 2016. Spring Boot cung cấp một cách tốt hơn để viết ứng dụng mà không cần máy chủ ứng dụng Java EE. Bạn có thể tạo một JAR thực thi và chạy nó trên JVM.

Tôi tự hỏi liệu Oracle có tiếp tục hỗ trợ thông số kỹ thuật Java EE hay không. Các dịch vụ web đã tiếp quản cho các EJB. Giải pháp EJB đã chết. (Chỉ là ý kiến ​​của tôi.)


7
Theo tôi, "lock in" là một cụm từ quá mạnh để miêu tả về mùa Xuân. Rốt cuộc, Spring được thiết kế để gắn kết mọi thứ lại với nhau, không phải để thay thế chúng, bạn luôn có thể chọn những gì bạn muốn tích hợp. Bên cạnh đó, mọi thứ đều có khóa, ngay cả những Apache Commons đơn giản nhất cũng khóa chúng ta, nhưng chúng ta vẫn sử dụng nó hàng ngày.
Christopher Yang

3
Không có nhà cung cấp nào thay thế cho VMWare / Spring theo cách bạn có thể chọn giữa Oracle, Red Hat và IBM cho các nền tảng Java EE. Đó là tất cả những gì tôi muốn nói. Đó không phải là một nhận xét về khả năng hoặc tính hữu dụng của Spring. Tôi tình cờ thích nó rất nhiều. Tôi sử dụng nó mỗi ngày và ngủ vào ban đêm.
duffymo

1
@ChristopherYang chính xác. Ý tôi là, "Java" sẽ là một khóa-n của nhà cung cấp. Vì vậy, cuối cùng, chúng ta chỉ cần ngừng tranh cãi và hoàn thành một việc gì đó. :-)
cbmeeks

4
Câu hỏi này đã gần năm năm. Cá nhân tôi nghĩ rằng EJB là công nghệ đã lỗi thời, đã thua thiệt về mọi mặt đối với các dịch vụ web HTTP. Đơn giản và mở chiến thắng. Cung cấp cho tôi dịch vụ REST và bạn có thể giữ các EJB của mình. Mùa xuân hỗ trợ họ một cách độc đáo. Đó là nơi mà thế giới đã đi.
duffymo

1
Cảm ơn vi đa trả lơi. Chỉ tìm kiếm những lợi ích khi đánh giá cái tốt hơn (SPRING, EJB 3.x) cho việc di chuyển từ ứng dụng EJB 2.1 hiện có. Một câu hỏi nữa, EJB 3.x cũng hỗ trợ WebService. Vì vậy, chúng ta có thể nhận được lợi ích của JNDI / RMI cho phân phối ứng dụng Java và WS cho các ứng dụng khác không?
noboundaries

48

Đầu tiên, hãy để tôi nói rõ ràng, tôi không nói rằng bạn không nên sử dụng Spring, nhưng vì bạn đang yêu cầu một số ưu điểm, đây là ít nhất hai trong số chúng:

  • EJB 3 là một tiêu chuẩn trong khi Spring thì không (đó là một tiêu chuẩn thực tế nhưng điều đó không giống nhau) và điều này sẽ không thay đổi trong tương lai gần. Mặc dù bạn có thể sử dụng Spring framework với bất kỳ máy chủ ứng dụng nào, các ứng dụng Spring bị khóa trong cả bản thân Spring và các dịch vụ cụ thể mà bạn chọn để tích hợp trong Spring.

  • Khung công tác Spring nằm trên các máy chủ ứng dụng và thư viện dịch vụ. Mã tích hợp dịch vụ (ví dụ: các mẫu truy cập dữ liệu) nằm trong khuôn khổ và được tiếp xúc với các nhà phát triển ứng dụng. Ngược lại, khung EJB 3 được tích hợp vào máy chủ ứng dụng và mã tích hợp dịch vụ được đóng gói sau một giao diện. Do đó, các nhà cung cấp EJB 3 có thể tối ưu hóa hiệu suất và trải nghiệm của nhà phát triển bằng cách làm việc ở cấp máy chủ ứng dụng. Ví dụ: họ có thể liên kết chặt chẽ công cụ JPA với quản lý giao dịch JTA. Một ví dụ khác là hỗ trợ phân cụm minh bạch đối với các nhà phát triển EJB 3.

Tuy nhiên, EJB 3 không phải là hoàn hảo, nó vẫn còn thiếu một số tính năng (ví dụ như tiêm các thành phần không được quản lý như POJO đơn giản).


1
Câu trả lời mang tính giáo dục, nhưng tôi đang thắc mắc tại sao / khi nào bạn cần tiêm một POJO đơn giản thay vì khởi tạo một POJO mới?
Ömer Faruk Almalı

4
Với mục đích thử nghiệm.
Philip

22

Điểm của Pascal là hợp lệ. Tuy nhiên, có những điều sau đây có lợi cho mùa xuân.

  • Đặc tả EJB thực sự hơi lỏng lẻo, và do đó có thể quan sát thấy các hành vi khác nhau với các máy chủ ứng dụng khác nhau. Tất nhiên, điều này sẽ không đúng với hầu hết các trường hợp, nhưng tôi đã gặp vấn đề như vậy đối với một số "góc tối".

  • Spring có rất nhiều tính năng bổ sung, như tích hợp Spring-test, AOP, MVC, JSF, v.v. EJB có một số trong số đó (ví dụ: các bộ đánh chặn), nhưng theo tôi thì chúng không được phát triển nhiều.

Kết luận, nó phụ thuộc chủ yếu vào trường hợp chính xác của bạn.


Có thể một cái gì đó như Spring chỉ cần một động cơ servlet sẽ chính xác hơn (EJB có thể được sử dụng trong bất kỳ vùng chứa JEE, động cơ servlet! = JEE container).
Pascal Thivent

1
Về mặt kỹ thuật, Spring cũng không yêu cầu động cơ servlet. Ví dụ: Spring-test sử dụng ngữ cảnh trong bộ nhớ.
Bozho

3
Về mặt kỹ thuật, EJB cũng không yêu cầu một vùng chứa độc lập nếu bạn đi theo cách này. Vì EJB 3.1 có EJBContainer.createEJBContainer()API tiêu chuẩn để sử dụng một vùng chứa nhúng. Vì vậy, vẫn còn, tuyên bố của bạn là sai.
Pascal Thivent

ok, 3.1 là khá mới và rõ ràng là tôi đã quên về những bổ sung. Đã xóa điểm đó khỏi câu trả lời của tôi.
Bozho

-30

Spring là để bổ sung cho EJB, không phải để thay thế nó. Spring là một lớp trên EJB. Như chúng ta đã biết, việc viết mã EJB được thực hiện bằng cách sử dụng API, có nghĩa là chúng ta phải triển khai mọi thứ trong các API bằng cách sử dụng Spring framework. Chúng ta có thể tạo mã đĩa nồi hơi, sau đó chỉ cần lấy đĩa đó, thêm một số thứ vào nó, rồi mọi thứ đã xong. Bên trong Spring được kết nối với EJB - Spring sẽ không tồn tại nếu không có EJB.

Ưu điểm chính của việc sử dụng Spring là không có sự ghép nối nào giữa các lớp.


8
bạn hoàn toàn sai, xin lỗi
Jakub H

2
xin lỗi @sasi đây không phải là thậm chí gần một câu trả lời đúng hay đẹp .......
Prakash

4
"Mùa xuân sẽ không tồn tại nếu không có EJB." Trời đất, bạn có thật không? Bạn đã bao giờ trong đời sử dụng "\ @Stateless" trong phần khai báo của EJB hoặc sử dụng chú thích \ @EJB để tiêm chưa? Bạn có nghĩ rằng những thứ đó sẽ hoạt động ở Jetty hay Tomcat? Làm thế nào để bạn nghĩ rằng các giao dịch được quản lý dưới mùa xuân? Bạn biết rằng bạn có thể triển khai một ứng dụng Spring vào một thùng chứa servlet phải không?
99Sono

Xin lỗi, nhưng bạn chưa hiểu rõ về cấu trúc của cả hai, EJB là một phần của Java EE và spring là nguyên tắc cấu hình quy ước. Trong thực tế, nếu bạn không tìm hiểu sâu, bạn có thể sẽ nghĩ rằng chúng giống nhau đến mức nào hoặc có liên quan hay bất cứ thứ gì thuộc loại đó. Tại sao? cả hai đều có những điểm giống nhau như tiêm và nhưng sự khác biệt giữa chúng là rất lớn. Đúng là Spring được sinh ra để thay thế cho EJB trở lại thời gian do sự phức tạp của EJB nhưng đúng như vậy. Đủ tốt trong Thời gian Java EE 5 (EJB 3) được chỉnh sửa lại cũng hoạt động giống như cách mùa xuân đã làm với COC của họ
Ishimwe Aubain Consolateur
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.