Sự khác biệt giữa JavaBean và POJO là gì?


210

Tôi không chắc về sự khác biệt. Tôi đang sử dụng Hibernate và, trong một số sách, họ sử dụng JavaBean và POJO như một thuật ngữ có thể hoán đổi cho nhau. Tôi muốn biết nếu có một sự khác biệt, không chỉ trong bối cảnh Hibernate, mà là các khái niệm chung.

Câu trả lời:


252

Một JavaBean tuân theo các quy ước nhất định. Đặt tên Getter / setter, có một hàm tạo mặc định công khai, có thể tuần tự hóa, v.v ... Xem các Công ước JavaBeans để biết thêm chi tiết.

Một POJO (đối tượng Java cũ đơn giản) không được xác định chặt chẽ. Đó là một đối tượng Java không có yêu cầu triển khai một giao diện cụ thể hoặc xuất phát từ một lớp cơ sở cụ thể hoặc sử dụng các chú thích cụ thể để tương thích với một khung công tác nhất định và có thể là bất kỳ tùy ý nào (thường tương đối đơn giản) Đối tượng Java.


41
Lưu ý rằng JavaBean có thể và thường là POJO và nhiều POJO thực sự là JavaBeans.
Joachim Sauer

8
Không, theo định nghĩa của POJO, Java Bean không phải là POJO vì để được coi là Java Bean, một lớp phải tuân theo các quy ước mã hóa nhất định (ví dụ: có một hàm tạo không có đối số, có các phương thức bắt đầu bằng các từ "get" và / hoặc "thiết lập") hoặc được phân phối với lớp BeanInfo.
Nat

15
Vì đây là các quy ước , tôi nghĩ rằng bạn có thể lập luận thành công rằng một bean có thể là POJO (ví dụ: bạn không được thừa hưởng từ giao diện JavaBean hoặc tương tự)
Brian Agnew

1
Đặc tả JavaBeans không xác định JavaBean ngoài việc rất lỏng lẻo là "thành phần phần mềm có thể tái sử dụng" (hoặc một số như vậy). Nó không cần phải có hàm tạo không có đối số, không cần các phương thức bắt đầu bằng "get" hoặc "set", không cần phải tuần tự hóa, thậm chí không cần phải là một lớp.
Tom Hawtin - tackline

4
Theo thuật ngữ toán học, chúng ta có thể nói rằng Javabeans tạo thành một tập hợp con của POJO, bởi vì, các ràng buộc cụ thể đặt trên POJO làm cho nó trở thành một Javabean.
Nishit

106

Tất cả các JavaBeans đều là POJO nhưng không phải tất cả POJO đều là JavaBeans.

JavaBean là một đối tượng Java thỏa mãn các quy ước lập trình nhất định:

  • lớp JavaBean phải triển khai tuần tự hóa hoặc bên ngoài;
  • lớp JavaBean phải có một hàm tạo không có đối số công khai;
  • tất cả các thuộc tính JavaBean phải có các phương thức setter và getter công khai (nếu thích hợp);
  • tất cả các biến đối tượng JavaBean phải là riêng tư.

1
Tôi nghĩ rằng POJO không thể thực hiện Serializable.
naXa

10
"lớp JavaBean phải có hàm tạo không có đối số;" cũng thêm công khai tại đây
radistao

JavaBean có thể tuần tự hóa và đó là lý do tại sao JavaBean KHÔNG phải là POJO.
karlihnos

25

Theo Martin Fowler, POJO là một đối tượng đóng gói Business Logic trong khi Bean (ngoại trừ định nghĩa đã nêu trong các câu trả lời khác) chỉ hơn một container để chứa dữ liệu và các thao tác có sẵn trên đối tượng chỉ đơn thuần là đặt và lấy dữ liệu.

Thuật ngữ này được đặt ra trong khi Rebecca Parsons, Josh MacKenzie và tôi đang chuẩn bị cho một cuộc nói chuyện tại một hội nghị vào tháng 9 năm 2000. Trong cuộc nói chuyện, chúng tôi đã chỉ ra nhiều lợi ích của việc mã hóa logic kinh doanh vào các đối tượng java thông thường thay vì sử dụng Entity Beans. Chúng tôi tự hỏi tại sao mọi người lại chống lại việc sử dụng các đối tượng thông thường trong hệ thống của họ và kết luận rằng đó là vì các đối tượng đơn giản thiếu một cái tên lạ mắt. Vì vậy, chúng tôi đã cho họ một cái, và nó được bắt rất độc đáo.

http://www.martinfowler.com/bliki/POJO.html


7

POJO: Nếu lớp có thể được thực thi với JDK bên dưới, mà không có bất kỳ thư viện bên thứ ba bên ngoài nào khác hỗ trợ thì POJO được gọi là

JavaBean: Nếu lớp chỉ chứa các thuộc tính với các bộ truy cập (setters và getters), chúng được gọi là javabeans. Nói chung, các hạt đậu sẽ không chứa bất kỳ logic kinh doanh nào thay vì được sử dụng để chứa một số dữ liệu trong đó.

Tất cả Javabeans là POJO nhưng tất cả POJO không phải là Javabeans


7

Pojo - Đối tượng java cũ đơn giản

Lớp pojo là một lớp bình thường không có chuyên môn, lớp hoàn toàn kết hợp lỏng lẻo với công nghệ / framework. Lớp này không thực hiện từ công nghệ / khung và không mở rộng từ api công nghệ / khung mà lớp được gọi là lớp pojo.

Lớp pojo có thể thực hiện các giao diện và mở rộng các lớp nhưng siêu lớp hoặc giao diện không nên là một công nghệ / khung.

Ví dụ:

1.

class ABC{
----
}

Lớp ABC không triển khai hoặc mở rộng từ công nghệ / khung đó là lý do tại sao đây là lớp pojo.

2.

class ABC extends HttpServlet{
---
}

Lớp ABC mở rộng từ api công nghệ servlet đó là lý do tại sao đây không phải là lớp pojo.

3.

class ABC implements java.rmi.Remote{
----
}

Lớp ABC thực hiện từ rmi api đó là lý do tại sao đây không phải là lớp pojo.

4.

class ABC implements java.io.Serializable{
---
}

giao diện này là một phần của ngôn ngữ java không phải là một phần của công nghệ / framework.so đây là lớp pojo.

5.

class ABC extends Thread{
--
}

ở đây chủ đề cũng là lớp của ngôn ngữ java vì vậy đây cũng là một lớp pojo.

6.

class ABC extends Test{
--
}

nếu lớp Test mở rộng hoặc thực hiện từ các công nghệ / khung thì ABC cũng không phải là lớp pojo vì nó kế thừa các thuộc tính của lớp Test. nếu lớp Test không phải là lớp pojo thì lớp ABC cũng không phải là lớp pojo.

7.

bây giờ điểm này là một trường hợp đặc biệt

@Entity
class ABC{
--
}

@Entitylà một chú thích được đưa ra bởi api hibernate hoặc jpa api nhưng chúng ta vẫn có thể gọi lớp này là lớp pojo. lớp với các chú thích được đưa ra từ công nghệ / khung được gọi là lớp pojo trong trường hợp đặc biệt này.


2

Đậu Java là loại POJO đặc biệt .

Đặc sản được liệt kê dưới đây với lý do

nhập mô tả hình ảnh ở đây


1

POJOSvới các quy ước nhất định (getter / setter, công cụ xây dựng no-arg công khai, các biến riêng tư) và đang hoạt động (ví dụ: được sử dụng để đọc dữ liệu theo biểu mẫu) JAVABEANS.


1

Tóm lại: điểm tương đồng và khác biệt là:

   java beans:                          Pojo:
-must extends serializable              -no need to extends or implement.
 or externalizable.                     
-must have public class .               - must have public class
-must have private instance variables.      -can have any access specifier variables.
-must have public setter and getter method. - may or may not have setter or getter method.
-must have no-arg constructor.           - can have constructor with agruments.

Tất cả Đậu JAVA đều là POJO nhưng không phải tất cả POJO đều là Đậu JAVA.


0

Bạn đã thấy các định nghĩa chính thức ở trên, cho tất cả chúng có giá trị.

Nhưng đừng quá bận tâm về định nghĩa. Chúng ta hãy nhìn vào ý nghĩa của mọi thứ ở đây.

JavaBeans được sử dụng trong các ứng dụng Java dành cho doanh nghiệp, nơi người dùng thường xuyên truy cập dữ liệu và / hoặc mã ứng dụng từ xa, tức là từ máy chủ (qua web hoặc mạng riêng) qua mạng. Do đó, dữ liệu liên quan phải được truyền theo định dạng nối tiếp vào hoặc ra khỏi máy tính của người dùng - do đó cần các đối tượng Java EE để thực hiện Giao diện tuần tự hóa. Bản chất của JavaBean này không khác gì các đối tượng ứng dụng Java SE có dữ liệu được đọc từ hoặc được viết ra thành một hệ thống tệp. Việc sử dụng các lớp Java một cách đáng tin cậy qua một mạng từ một loạt các kết hợp máy / hệ điều hành người dùng cũng đòi hỏi phải áp dụng các quy ước để xử lý chúng. Do đó, yêu cầu thực hiện các lớp này là công khai, với các thuộc tính riêng, hàm tạo không có đối số và các getters và setters được tiêu chuẩn hóa.

Các ứng dụng Java EE cũng sẽ sử dụng các lớp khác với các lớp đã được triển khai như JavaBeans. Chúng có thể được sử dụng để xử lý dữ liệu đầu vào hoặc tổ chức dữ liệu đầu ra nhưng sẽ không được sử dụng cho các đối tượng được truyền qua mạng. Do đó, các cân nhắc ở trên không cần phải được áp dụng cho thanh đó có giá trị như các đối tượng Java. Các lớp sau này được gọi là POJO - Các đối tượng Java thuần cũ.

Nói chung, bạn có thể thấy Đậu Java chỉ là các đối tượng Java được điều chỉnh để sử dụng qua mạng.

Có rất nhiều sự cường điệu - và một lượng không nhỏ - trong thế giới phần mềm kể từ năm 1995.

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.