JavaBean chính xác là gì?


1793

Tôi đã hiểu, tôi nghĩ rằng "Bean" là một lớp Java với các thuộc tính và getters / setters. Theo tôi hiểu, nó tương đương với cấu trúc C. Điều đó có đúng không?

Ngoài ra, có một sự khác biệt cú pháp thực sự giữa một bean và một lớp thông thường? Có bất kỳ định nghĩa đặc biệt hoặc một giao diện?

Về cơ bản, tại sao có một thuật ngữ cho điều này?

Ngoài ra Serializablegiao diện có ý nghĩa gì?


14
Xem những nơi mà Đậu Java được sử dụng? . Đó là một lớp học theo các quy ước nhất định.
Matthew Flaschen

5
Để hoàn thiện, đây là một liên kết đến Đặc tả JavaBeans .
informatik01

2
Chỉ cần một lưu ý. Nếu bạn từng nghe người ta nói về thuật ngữ POJO, họ thường thực sự có nghĩa là Bean. Khi bạn thấy POJO, chúng hầu như luôn có setters & getters, có khả năng tuần tự hóa, thực tế, POJO không yêu cầu setters và getters, giao diện tuần tự hóa hoặc bất cứ thứ gì khác - nó chỉ đơn giản là một đối tượng Java đơn giản không có yêu cầu cụ thể.
Bill K

Câu trả lời:


2013

JavaBean chỉ là một tiêu chuẩn

  1. Tất cả các thuộc tính riêng tư (sử dụng getters / setters )
  2. Một hàm tạo không có đối số công khai
  3. Thực hiện Serializable.

Đó là nó. Đó chỉ là một quy ước. Rất nhiều thư viện phụ thuộc vào nó mặc dù.

Đối với Serializable, từ tài liệu API :

Khả năng nối tiếp của một lớp được kích hoạt bởi lớp thực hiện giao diện java.io.Serializable. Các lớp không thực hiện giao diện này sẽ không có bất kỳ trạng thái nào được tuần tự hóa hoặc giải tuần tự hóa. Tất cả các kiểu con của một lớp tuần tự hóa đều là tuần tự hóa. Giao diện tuần tự hóa không có phương thức hoặc trường và chỉ phục vụ để xác định ngữ nghĩa của việc tuần tự hóa.

Nói cách khác, các đối tượng tuần tự hóa có thể được ghi vào luồng và do đó các tệp, cơ sở dữ liệu đối tượng, bất cứ thứ gì thực sự.

Ngoài ra, không có sự khác biệt về cú pháp giữa một JavaBean và một lớp khác - một lớp là một JavaBean nếu nó tuân theo các tiêu chuẩn.

Có một thuật ngữ cho nó bởi vì tiêu chuẩn cho phép các thư viện lập trình mọi thứ với các thể hiện lớp mà bạn xác định theo cách được xác định trước. Ví dụ, nếu một thư viện muốn truyền phát bất kỳ đối tượng nào bạn truyền vào nó, nó sẽ biết điều đó có thể vì đối tượng của bạn được tuần tự hóa (giả sử lib yêu cầu các đối tượng của bạn phải là JavaBeans thích hợp).


198
Đúng vậy, theo tôi, hầu như tất cả các tài liệu xoay quanh các loại đậu không thể mô tả thuật ngữ chính xác như bạn có. +1
AndaP

10
Có phải các thành viên của một hạt đậu cũng phải là đậu? Có vẻ như là một yêu cầu hợp lý ..
worldsayshi

14
@worldsayshi - Không, không bắt buộc. Ví dụ, một bean có thể chứa String; và String không phải là một bean. . Vì vậy, không, các thành viên Java bean không cần phải có bất kỳ khía cạnh nào của Java bean. Mặc dù nó đơn giản hơn nếu chúng cũng là đậu.
Viliam Búr

12
"Tất cả các thuộc tính riêng tư" là không chính xác. Các thuộc tính được suy ra từ getters và setters (nếu có một phương thức X getFoo () -> bean có một thuộc tính có thể đọc được gọi là "foo"; nếu có một phương thức setFoo (X foo) -> bean có một thuộc tính có thể ghi "foo"). Các thuộc tính có thể được hỗ trợ bởi các trường thành viên (nhưng không phải là) thường là riêng tư.
Puce

2
Tôi hy vọng trở thành một Java bean "một lớp phải công khai". Và nó có thực sự cần nó nên thực hiện Giao diện nối tiếp không ??
Satyabrata sahoo

286

Có một thuật ngữ để làm cho nó nghe đặc biệt. Thực tế không nơi nào gần bí ẩn như vậy.

Về cơ bản, một "Bean":

  • là một đối tượng tuần tự hóa (nghĩa là nó thực hiện java.io.Serializablevà thực hiện đúng như vậy), rằng
  • có "thuộc tính" mà getters và setters chỉ là các phương thức với một số tên nhất định (như, giả sử, getFoo()là getter cho thuộc tính "Foo") và
  • có một hàm tạo 0-arg công khai (vì vậy nó có thể được tạo theo ý muốn và được cấu hình bằng cách đặt thuộc tính của nó).

Cập nhật:

Về phần Serializable: Đó không là gì ngoài "giao diện đánh dấu" (giao diện không khai báo bất kỳ chức năng nào) cho Java biết rằng lớp triển khai đồng ý (và ngụ ý rằng nó có khả năng) "tuần tự hóa" - một quá trình chuyển đổi một thể hiện thành một luồng byte. Các byte đó có thể được lưu trữ trong các tệp, được gửi qua kết nối mạng, v.v. và có đủ thông tin để cho phép JVM (ít nhất là một loại biết về loại đối tượng) để tái tạo lại đối tượng sau - có thể trong một phiên bản khác của ứng dụng, hoặc thậm chí trên một máy hoàn toàn khác!

Tất nhiên, để làm được điều đó, lớp phải tuân theo một số hạn chế nhất định. Chủ yếu trong số đó là tất cả các trường cá thể phải là các kiểu nguyên thủy (int, bool, v.v.), các thể hiện của một số lớp cũng có khả năng tuần tự hóa hoặc được đánh dấu transientđể Java sẽ không bao gồm chúng. (Tất nhiên điều này có nghĩa là transientcác trường sẽ không tồn tại trong chuyến đi qua luồng. Một lớp có transientcác trường nên được chuẩn bị để xác định lại chúng nếu cần thiết.)

Một lớp không thể tuân theo các giới hạn đó sẽ không được triển khai Serializable(và, IIRC, trình biên dịch Java thậm chí sẽ không cho phép nó làm như vậy.)


Đây có lẽ là một câu hỏi ngu ngốc, nhưng một trường đối tượng có thể là gì ngoài một kiểu nguyên thủy hoặc một thể hiện của một lớp?
kingfrito_5005

8
@ kingfrito_5005: Nó sẽ là cái này hay cái khác. Nhưng nếu đó là một thể hiện của một lớp, thì vấn đề là lớp đó có được tuần tự hóa hay không. Để một lớp có thể tuần tự hóa, các transientphần không phải của nó phải thuộc loại tuần tự hóa.
cHao

có lẽ đã quên đề cập rằng các nhà xây dựng nên không có đối số. có một hàm tạo mặc định công khai (vì vậy nó có thể được tạo theo ý muốn và được cấu hình bằng cách đặt thuộc tính của nó).
Amos Kosgei

@AmosKosgei: Đừng quên; nó chỉ là dư thừa. Một hàm tạo mặc định theo định nghĩa có thể được gọi mà không có đối số.
cHao

@Amos: Tuy nhiên, khi tôi nhìn vào nó, có vẻ như "constructor mặc định" có nghĩa là một cái gì đó hơi khác trong Java so với trong C ++. : P Đã thay thế "mặc định" bằng "0-arg".
cHao

94

JavaBeans là các lớp Java tuân thủ quy ước mã hóa cực kỳ đơn giản. Tất cả bạn phải làm là

  1. thực hiện java.io.Serializablegiao diện - để lưu trạng thái của một đối tượng
  2. sử dụng một hàm tạo đối số rỗng công khai - để khởi tạo đối tượng
  3. cung cấp các phương thức getter / setter công khai - để lấy và đặt các giá trị của các biến riêng tư (thuộc tính).

Giải thích đơn giản như vậy là những gì tôi đang tìm kiếm. Cảm ơn bạn!
Modo

62

Thuộc tính của JavaBeans

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

  1. Lớp JavaBean phải thực hiện Serializablehoặc Externalizable

  2. Lớp JavaBean phải có hàm tạo không có đối số

  3. 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

  4. Tất cả các biến đối tượng JavaBean phải ở chế độ riêng tư

Ví dụ về JavaBeans

@Entity
public class Employee implements Serializable{

   @Id
   private int id;
   private String name;   
   private int salary;  

   public Employee() {}

   public Employee(String name, int salary) {
      this.name = name;
      this.salary = salary;
   }
   public int getId() {
      return id;
   }
   public void setId( int id ) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName( String name ) {
      this.name = name;
   }
   public int getSalary() {
      return salary;
   }
   public void setSalary( int salary ) {
      this.salary = salary;
   }
}

3
Các chú thích là cần thiết hay là một phần của Java Bean?
gianni christofakis

7
@giannischristofakis Không, các chú thích là không cần thiết. Các chú thích được sử dụng một phần của Spring Framework, sử dụng rộng rãi Java Beans.
Tianxiang Xiong

1
Tại sao nó cần phải có một hàm tạo không có đối số?
Renato

6
@Renato này rất đơn giản. hãy nghĩ về mùa xuân phải tự động khởi tạo bean của bạn với arg-constructor ... nó sẽ vượt qua như thế nào? ;)
Alex75

24

Giải thích với một ví dụ.

1. nhập java.io.Serializable

Đối với serialization, xem tài liệu .

2. lĩnh vực tư nhân

Các trường nên riêng tư để ngăn các lớp bên ngoài dễ dàng sửa đổi các trường đó. Thay vì trực tiếp gia nhập vào các trường đó, các phương thức getter / setter hữu ích được sử dụng.

3. Người xây dựng

Một nhà xây dựng công cộng mà không có bất kỳ đối số.

4. getter / setter

Phương pháp Getter và setter để truy cập và sửa đổi các trường riêng.

/** 1. import java.io.Serializable */
public class User implements java.io.Serializable {
    /** 2. private fields */
    private int id;
    private String name;

    /** 3. Constructor */
    public User() {
    }
    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }

    /** 4. getter/setter */
    // getter
    public int getId() {
        return id;
    }
    public String getName() {
        return name;
    }
    // setter
    public void setId(int id) {
        this.id = id;
    }
    public void setName(String name) {
        this.name = name;
    }
}

2
tôi đoán setId(int id)cơ thể bạn muốn nói this.id = id;thay vìthis.id = is;
steven7mwesigwa

18

Đậu Java đang sử dụng cho ít mã hơn và tiếp cận nhiều công việc hơn ... Đậu Java được sử dụng trên toàn Java EE như một hợp đồng phổ biến để khám phá và truy cập thời gian chạy. Ví dụ: JavaServer Pages (JSP) sử dụng Java Beans làm đối tượng truyền dữ liệu giữa các trang hoặc giữa các servlet và JSP. Khung kích hoạt JavaBeans của Java EE sử dụng Đậu Java để tích hợp hỗ trợ cho các loại dữ liệu MIME vào Java EE. API quản lý EE của Java sử dụng JavaBeans làm nền tảng cho công cụ tài nguyên được quản lý trong môi trường Java EE.

Về tuần tự hóa:

Trong tuần tự hóa đối tượng, một đối tượng có thể được biểu diễn dưới dạng một chuỗi byte bao gồm dữ liệu của đối tượng cũng như thông tin về loại đối tượng và các loại dữ liệu được lưu trữ trong đối tượng.

Sau khi một đối tượng được tuần tự hóa đã được ghi vào một tệp, nó có thể được đọc từ tệp và được giải tuần tự hóa, đó là thông tin loại và byte đại diện cho đối tượng và dữ liệu của nó có thể được sử dụng để tạo lại đối tượng trong bộ nhớ.


17

Bạn sẽ thấy Tuần tự hóa hữu ích khi triển khai dự án của bạn trên nhiều máy chủ vì các bean sẽ được duy trì và chuyển qua chúng.


1
Bạn có thể vui lòng cung cấp thêm thông tin về việc triển khai dự án trên nhiều máy chủ không? cảm ơn bạn
Hanfeng

4
giả sử một cụm có một vài máy chủ, đối với Websphere liên kết này stackoverflow.com/questions/3193345/ có thể giúp đỡ.
Trương Hà

10

Java Beans là một tiêu chuẩn và các yêu cầu cú pháp cơ bản của nó đã được giải thích rõ ràng bằng các câu trả lời khác.

Tuy nhiên, IMO, nó không chỉ là một tiêu chuẩn cú pháp đơn giản. Ý nghĩa thực sự hoặc mục đích sử dụng của Đậu Đậu, cùng với các công cụ hỗ trợ khác nhau xung quanh tiêu chuẩn, để tạo điều kiện tái sử dụng mã và kỹ thuật phần mềm dựa trên thành phần, tức là cho phép các nhà phát triển xây dựng các ứng dụng bằng cách lắp ráp các thành phần (lớp) hiện có và không phải viết bất kỳ mã (hoặc chỉ phải viết một ít mã keo). Thật không may, công nghệ này được ngành công nghiệp đánh giá thấp và sử dụng kém, có thể được nói từ các câu trả lời trong chủ đề này.

Nếu bạn đọc của Oracle hướng dẫn về Đậu Java , bạn có thể hiểu rõ hơn về điều đó.


Bài viết hữu ích và liên kết. Khi tôi nghĩ về các loại đậu, tôi thực sự nghĩ về loại công cụ "Visual Builder", như được minh họa trong bài viết của Oracle. Tôi tự hỏi liệu có nhiều khung công tác khác sử dụng chúng theo cách lớn không ...
loài gặm nhấm

9

Theo Wikipedia:

  1. Lớp phải có một hàm tạo mặc định công khai (không có đối số). Điều này cho phép khởi tạo dễ dàng trong khung chỉnh sửa và kích hoạt.

  2. Các thuộc tính lớp phải có thể truy cập bằng cách sử dụng get, set, là (có thể được sử dụng cho các thuộc tính boolean thay vì get) và các phương thức khác (còn gọi là phương thức accessor và phương thức mutator) theo quy ước đặt tên tiêu chuẩn. Điều này cho phép dễ dàng kiểm tra tự động và cập nhật trạng thái bean trong các khung, nhiều trong số đó bao gồm các trình soạn thảo tùy chỉnh cho các loại thuộc tính khác nhau. Setters có thể có một hoặc nhiều hơn một đối số.

  3. Các lớp nên được tuần tự hóa. [Điều này cho phép các ứng dụng và khung công tác lưu, lưu trữ và khôi phục trạng thái của bean một cách đáng tin cậy theo cách độc lập với VM và của nền tảng.]

Để biết thêm thông tin theo liên kết này .


7

Về phần thứ hai của câu hỏi của bạn, Tuần tự hóa là một cơ chế kiên trì được sử dụng để lưu trữ các đối tượng dưới dạng một chuỗi các byte đã ký. Đặt ít chính thức hơn, nó lưu trữ trạng thái của một đối tượng để bạn có thể truy xuất nó sau đó, bằng cách khử tuần tự hóa.


7

Java Bean là một lớp java [khái niệm] cần tuân theo các quy ước sau:

  1. Nó nên có một hàm tạo không có đối số.
  2. Nó nên được nối tiếp.
  3. Nó sẽ cung cấp các phương thức để thiết lập và nhận các giá trị của các thuộc tính, được gọi là phương thức getter và setter.

Nó là một thành phần phần mềm có thể tái sử dụng. Nó có thể gói gọn nhiều đối tượng vào một đối tượng để có thể truy cập cùng một đối tượng từ nhiều vị trí và là một bước để bảo trì mã dễ dàng.


1
Tôi thích cụm từ "thành phần phần mềm có thể tái sử dụng" khi nói về đậu java - bởi vì đậu java nói chung hoàn toàn không làm gì cả.
Rodney P. Barbati

6

Chúng được tuần tự hóa, có hàm tạo đối số bằng 0 và cho phép truy cập vào các thuộc tính bằng các phương thức getter và setter. Tên "Bean" đã được đặt để bao gồm tiêu chuẩn này, nhằm mục đích tạo ra các thành phần phần mềm có thể sử dụng lại cho Java. according to wiki

Các đối tượng tạo thành xương sống của ứng dụng của bạn và được quản lý bởi bộ chứa Spring IoC được gọi là các bean. Bean là một đối tượng được khởi tạo, lắp ráp và được quản lý bởi bộ chứa Spring IoC. Mặt khác, bean chỉ đơn giản là một trong nhiều đối tượng trong ứng dụng của bạn. according to xuân io .


4

Chỉ cần một chút nền tảng / cập nhật về khái niệm đậu. Nhiều câu trả lời khác thực sự có những gì nhưng không nhiều tại sao trong số họ.

Chúng được phát minh sớm trên Java như là một phần của việc xây dựng GUI. Chúng tuân theo các mẫu dễ dàng cho các công cụ tách ra cho phép chúng tạo bảng thuộc tính để bạn có thể chỉnh sửa các thuộc tính của Bean. Nói chung, các thuộc tính Bean thể hiện một điều khiển trên màn hình (Nghĩ x, y, chiều rộng, chiều cao, văn bản, ..)

Bạn cũng có thể nghĩ về nó như một cấu trúc dữ liệu được gõ mạnh.

Theo thời gian, những thứ này trở nên hữu ích cho nhiều công cụ sử dụng cùng loại quyền truy cập (Ví dụ: Hibernate để duy trì cấu trúc dữ liệu cho cơ sở dữ liệu)

Khi các công cụ phát triển, chúng di chuyển nhiều hơn về phía các chú thích và tránh xa các tên setter / getter. Bây giờ hầu hết các hệ thống không yêu cầu đậu, chúng có thể lấy bất kỳ đối tượng java cũ đơn giản nào có thuộc tính chú thích để cho chúng biết cách thao tác với chúng.

Bây giờ tôi thấy đậu như những quả bóng tài sản có chú thích - chúng thực sự chỉ hữu ích cho các chú thích mà chúng mang theo.

Bản thân đậu không phải là một mô hình lành mạnh. Chúng phá hủy sự đóng gói bởi bản chất của chúng vì chúng phơi bày tất cả các thuộc tính của chúng đối với các thao tác bên ngoài và khi chúng được sử dụng, có xu hướng (không có nghĩa là một yêu cầu) để tạo mã để thao tác bên ngoài thay vì tạo mã bên trong hạt (vi phạm "don 't yêu cầu một đối tượng cho các giá trị của nó, yêu cầu một đối tượng làm điều gì đó cho bạn "). Sử dụng pojos chú thích với getters tối thiểu và không có setters là OO phục hồi đóng gói nhiều hơn và với khả năng bất biến.

Nhân tiện, vì tất cả những thứ này đã xảy ra, ai đó đã mở rộng khái niệm này thành một thứ gọi là Enterprise Java Beans. Đây là ... khác nhau. và chúng phức tạp đến mức nhiều người cảm thấy họ không hiểu toàn bộ khái niệm Bean và ngừng sử dụng thuật ngữ này. Tôi nghĩ, đây là lý do tại sao bạn thường nghe thấy đậu được gọi là POJO (vì mọi đối tượng java là POJO, điều này về mặt kỹ thuật là ổn, nhưng khi bạn nghe ai đó nói POJO, họ thường nghĩ về điều gì đó theo mô hình bean)


Ngay trên - vi phạm "không yêu cầu một đối tượng cho các giá trị của nó, yêu cầu một đối tượng làm điều gì đó cho bạn")
ARK

3

Java Bean là bất kỳ lớp java nào thỏa mãn ba tiêu chí sau:

  1. Nó sẽ thực hiện giao diện tuần tự hóa (giao diện A Marker).
  2. Hàm tạo nên ở chế độ công khai và không có đối số (Những gì người khác gọi là "hàm tạo không có đối số").
  3. Nó nên có getter và setters.

Tốt để lưu ý trường serialVersionUID rất quan trọng để duy trì trạng thái đối tượng. Mã dưới đây đủ điều kiện là một bean:

public class DataDog implements java.io.Serializable {

private static final long serialVersionUID = -3774654564564563L;

private int id;
private String nameOfDog;

//The constructor should NOT have arguments
public DataDog () {}


/** 4. getter/setter */

// getter(s)
public int getId() {
    return id;
}
public String getNameOfDog() {
    return nameOfDog;
}
// setter(s)
public void setId(int id) {
    this.id = id;
}
public void setNameOfDog(String nameOfDog) {
    this.nameOfDog = nameOfDog;
}}

2

Để hiểu JavaBean, bạn cần chú ý các nội dung sau: JavaBean là một công cụ khái niệm và không thể đại diện cho một lớp các điều cụ thể

JavaBean là một công cụ phát triển có thể được hình dung trong hoạt động của các thành phần phần mềm có thể tái sử dụng

JavaBean dựa trên đặc tả Sun JavaBeans và có thể là các thành phần có thể tái sử dụng. Tính năng lớn nhất của nó là khả năng sử dụng lại.


1

Bean một lớp Java với các tên phương thức tuân theo các nguyên tắc Java Bean (còn được gọi là các mẫu thiết kế) cho các thuộc tính , phương thứcsự kiện. Vì vậy, bất kỳ phương thức công khai nào của lớp bean không phải là một phần của định nghĩa thuộc tính là phương thức bean. Tối thiểu, một lớp Java ngay cả với một thuộc tính là thành viên duy nhất (tất nhiên, đi kèm với getter và setter công khai), một phương thức công khai với tư cách là thành viên duy nhất hoặc chỉ một phương thức đăng ký trình nghe sự kiện công khai là một bean Java. Hơn nữa, thuộc tính có thể là thuộc tính chỉ đọc (có phương thức getter nhưng không có setter) hoặc thuộc tính chỉ ghi (chỉ có phương thức setter). Bean Java cần phải là một lớp công khai để hiển thị với bất kỳ công cụ hoặc bộ chứa beanbox nào. Container phải có khả năng khởi tạo nó; do đó, nó phải có một nhà xây dựng công cộng quá. Các tả JavaBeanskhông yêu cầu bean phải có hàm tạo zero-args công khai, rõ ràng hoặc mặc định, cho một container để khởi tạo nó. Nếu bạn có thể cung cấp một tệp (có phần mở rộng .ser) có chứa một phiên bản được tuần tự hóa, một công cụ beanbox có thể sử dụng tệp đó để khởi tạo một bean nguyên mẫu. Mặt khác, bean phải có hàm tạo zero-args công khai, rõ ràng hoặc mặc định.

Khi bean được khởi tạo, API Java Bean (java.beans. *) Có thể hướng nội và gọi các phương thức trên nó. Nếu không có lớp nào thực hiện giao diện BeanInfo hoặc mở rộng triển khai BeanInfo, thì lớp SimpleBeanInfo, có sẵn, việc xem xét nội bộ bao gồm sử dụng sự phản chiếu (nội quan ngầm) để nghiên cứu các phương thức được hỗ trợ bởi bean đích và sau đó áp dụng các mẫu thiết kế đơn giản (hướng dẫn) để suy ra những phương thức nào thuộc tính, sự kiện và phương thức công khai được hỗ trợ. Nếu một lớp triển khai giao diện BeanInfo (đối với bean Foo, thì nó phải được đặt tên là FooBeanInfo), API sẽ bỏ qua phần hướng nội ngầm và sử dụng các phương thức công khai (getPropertyDescriptor (), getMethodDescriptors (), getEventSetDes thông tin. Nếu một lớp mở rộng SimpleBeanInfo có sẵn, tùy thuộc vào phương thức công khai SimpleBeanInfo nào (getPropertyDescriptor (), getMethodDescriptors (), getEventSetDescriptors ()) bị ghi đè, nó sẽ sử dụng các phương thức được ghi đè đó để lấy thông tin; đối với một phương thức không bị ghi đè, nó sẽ mặc định cho phần hướng nội ngầm tương ứng. Một hạt đậu cần phải được khởi tạo ngay cả khi không có nội quan ngầm được thực hiện trên nó. Do đó, yêu cầu của một nhà xây dựng zeri-args công cộng. Nhưng, tất nhiên, giao diện Nối tiếp hoặc Bên ngoài không cần thiết để được nhận diện. Tuy nhiên, đặc tả Java Bean nói, 'Chúng tôi cũng muốn nó là một trò chơi tầm thường đối với trường hợp phổ biến của một Bean nhỏ bé chỉ muốn lưu trạng thái bên trong của nó và không muốn nghĩ về nó.' Vì vậy, tất cả các bean phải thực hiện giao diện Nối tiếp hoặc Bên ngoài. Nhìn chung, Đặc tả JavaBeans không khó và nhanh về những gì tạo thành một bean. "Viết các thành phần JavaBeans dễ dàng đến mức đáng kinh ngạc. Bạn không cần một công cụ đặc biệt và bạn không phải thực hiện bất kỳ giao diện nào. Viết đậu đơn giản chỉ là vấn đề tuân theo các quy ước mã hóa nhất định. Tất cả những gì bạn phải làm là làm cho lớp của bạn trông giống như một hạt đậu - công cụ sử dụng đậu sẽ có thể nhận ra và sử dụng hạt đậu của bạn. " Một cách tầm thường, ngay cả lớp sau đây là Java Bean,

public class Trivial implements java.io.Serializable {}

Nói, một constructor bean có một số tham số. Giả sử một số loại đơn giản. Container có thể không biết giá trị nào để gán cho chúng; ngay cả nếu có, trường hợp kết quả có thể không được sử dụng lại. Nó chỉ có thể có ý nghĩa nếu người dùng có thể định cấu hình (chỉ định giá trị) bằng cách nói các chú thích hoặc tệp cấu hình xml như trong Spring bean. Và giả sử một số tham số là loại hoặc giao diện. Một lần nữa, container có thể không biết những giá trị nào được gán cho nó. Nó chỉ có thể có ý nghĩa nếu người dùng có thể định cấu hình (chỉ định các đối tượng cụ thể) bằng cách nói các chú thích hoặc tệp cấu hình xml. Tuy nhiên, ngay cả trong Spring (thông qua các tệp cấu hình xml), việc gán các đối tượng cụ thể (có tên chuỗi) cho các đối số của hàm tạo (thuộc tính hoặc phần tử của đối số hàm tạo) không phải là kiểu an toàn, về cơ bản giống như tiêm tài nguyên. Việc tham chiếu đến các bean Spring khác (được gọi là cộng tác viên; thông qua phần tử trong phần tử đối số của hàm tạo) về cơ bản là phần tử phụ thuộc và do đó là an toàn. Rõ ràng, một phụ thuộc (bean cộng tác viên) có thể có một hàm tạo với các tham số được chèn; những người phụ thuộc được tiêm có thể có một hàm tạo với các tham số, v.v. Trong kịch bản này, cuối cùng, bạn sẽ cần một số lớp bean (ví dụ: MyBean. Class) mà container có thể khởi tạo bằng cách gọi MyBean () mới trước khi có thể xây dựng các bean cộng tác khác thông qua việc tiêm phụ thuộc vào constructor, do đó, yêu cầu cho các hạt để có hàm tạo zero-args công khai. Giả sử, nếu một container không hỗ trợ nội xạ phụ thuộc và / hoặc không cho phép gán các giá trị loại đơn giản cho hàm tạo thông qua một số chú thích hoặc tệp cấu hình xml như trong Spring, constructor bean không nên có tham số. Ngay cả một ứng dụng Spring bean cũng cần một số bean để có hàm tạo zero-args công khai (ví dụ: trong trường hợp ứng dụng Spring của bạn không có bean chỉ với các kiểu đơn giản là đối số của hàm tạo).

Đậu được quản lý JSF chạy trong một thùng chứa web. Chúng có thể được cấu hình bằng chú thích @ManagedBean hoặc với tệp tài nguyên cấu hình ứng dụng được quản lý-bean.xml. Tuy nhiên, nó chỉ hỗ trợ tiêm thông qua tiêm tài nguyên (không phải loại an toàn); không phù hợp để tiêm trên các nhà xây dựng. Thông số kỹ thuật của JSFyêu cầu các hạt được quản lý phải có các hàm tạo đối số không công khai. Hơn nữa, kể từ phiên bản 2.3 của thông số kỹ thuật này, việc sử dụng cơ sở bean được quản lý như được chỉ định trong phần này được khuyến khích mạnh mẽ. Một giải pháp tích hợp tốt hơn và gắn kết hơn để giải quyết vấn đề tương tự là sử dụng Bối cảnh và tiêm phụ thuộc (CDI), như được chỉ định trong JSR-365. "Nói cách khác, các hạt quản lý CDI được sử dụng, cung cấp phương pháp tiêm phụ thuộc an toàn cho các nhà xây dựng cho Spring bean. Đặc tả CDI áp dụng đặc tả Managed Beans, áp dụng cho tất cả các bộ chứa của nền tảng JEE, không chỉ tầng web. Do đó, bộ chứa web cần triển khai đặc tả CDI.

Đây là một trích từ đặc tả Managed Bean Đậu được quản lý là các đối tượng được quản lý vùng chứa với các yêu cầu tối thiểu, còn được gọi là từ viết tắt POJOs (Các đối tượng Java cũ đơn giản) có thể được xem như là một phiên bản nâng cao nền tảng Java EE của mô hình thành phần JavaBeans được tìm thấy trên nền tảng Java SE Sầu. Người đọc sẽ không bỏ lỡ rằng Đậu quản lý có tiền thân trong cơ sở đồng âm được tìm thấy trong công nghệ JavaServer Faces (JSF), Managed Managed Beans như được định nghĩa trong đặc tả này thể hiện sự khái quát hóa của những gì được tìm thấy trong JSF; đặc biệt, Đậu được quản lý có thể được sử dụng ở mọi nơi trong ứng dụng Java EE, không chỉ trong các mô-đun web. Ví dụ: trong mô hình thành phần cơ bản, Đậu được quản lý phải cung cấp hàm tạo không có đối số, nhưng một đặc tả được xây dựng trên Đậu được quản lý, chẳng hạn như CDI (JSR-299), có thể nới lỏng yêu cầu đó và cho phép Đậu được quản lý cung cấp cho các nhà xây dựng chữ ký phức tạp hơn, miễn là họ tuân theo một số quy tắc được xác định rõ ... Một Managed Bean không được là: một lớp cuối cùng, một lớp trừu tượng, một lớp bên trong không tĩnh . Managed Bean có thể không được tuần tự hóa không giống như một thành phần JavaBean thông thường. Do đó, đặc điểm kỹ thuật cho Đậu được quản lý, còn được gọi là đậu POJO hoặc POJO, cho phép mở rộng như trong CDI.

Đặc tả CDI định nghĩa lại các bean được quản lý là: Khi chạy trong Java EE, một lớp Java cấp cao nhất là một bean được quản lý nếu nó đáp ứng các yêu cầu:

• Nó không phải là một lớp bên trong. • Đây là lớp không trừu tượng hoặc được chú thích @Decorator. • Nó không triển khai javax.enterprise.inject.spi.Extension. • Nó không được chú thích @Vetoed hoặc trong gói được chú thích @Vetoed. • Nó có một hàm tạo thích hợp, hoặc là: lớp có hàm tạo không có tham số hoặc lớp khai báo hàm tạo có chú thích @Inject.

Tất cả các lớp Java đáp ứng các điều kiện này là các bean được quản lý và do đó không cần khai báo đặc biệt để xác định một bean được quản lý. Hoặc là

nếu nó được định nghĩa là một bean được quản lý bởi bất kỳ đặc tả Java EE nào khác và nếu

• Nó không được chú thích với một chú thích xác định thành phần EJB hoặc được khai báo là một lớp bean EJB trong ejb-jar.xml.

Không giống như Spring bean, nó không hỗ trợ các hàm tạo với các kiểu đơn giản, điều này có thể khả thi nếu nó hỗ trợ cấu hình với các tệp cấu hình xml như trong Spring hoặc bất kỳ chú thích nào.

EJB chạy trong một thùng chứa EJB. Nó làĐặc điểm kỹ thuậtnói: Một thành phần bean phiên là một Bean được quản lý. "Lớp này phải có một hàm tạo công khai không có đối số, nó nói cho cả bean phiên và bean điều khiển thông báo. Hơn nữa, nó nói, lớp Bean bean phiên là không bắt buộc phải thực hiện giao diện SessionBean hoặc giao diện Nối tiếp. Vì lý do tương tự như các hạt đậu JSF, rằng việc tiêm phụ thuộc EJB3 về cơ bản là tiêm tài nguyên, các hạt đậu JSF không hỗ trợ các hàm tạo với các đối số, nghĩa là thông qua việc tiêm phụ thuộc. Tuy nhiên, nếu bộ chứa EJB thực hiện CDI, thì tùy chọn: Lớp có thể có Trình xây dựng bổ sung được chú thích bằng chú thích Tiêm, nó nói cho cả bean phiên và bean điều khiển thông báo bởi vì, Một EJB được đóng gói vào một kho lưu trữ đậu CDI và không được chú thích bằng javax.enterprise.inject. Chú thích được kích hoạt, được coi là hỗ trợ CDI hạt đậu."


0

Trong thực tế, Đậu chỉ là đối tượng tiện dụng để sử dụng. Tuần tự hóa chúng có nghĩa là có thể dễ dàng duy trì chúng (lưu trữ ở dạng dễ phục hồi).

Công dụng điển hình của Đậu trong thế giới thực:

  • các đối tượng tái sử dụng đơn giản POJO (Các đối tượng Java cũ)
  • đối tượng thị giác
  • Spring sử dụng Đậu cho các đối tượng để xử lý (ví dụ: Đối tượng người dùng cần được tuần tự hóa trong phiên)
  • EJB (Enterprise Java Beans), các đối tượng phức tạp hơn, như Đậu JSF (JSF là công nghệ khá lỗi thời) hoặc Đậu Đậu

Vì vậy, trên thực tế, Đậu là chỉ là một quy ước / tiêu chuẩn để mong đợi một thứ gì đó từ một đối tượng Java mà nó sẽ hành xử (tuần tự hóa) và đưa ra một số cách để thay đổi nó (setters cho các thuộc tính) theo một cách nhất định.

Làm thế nào để sử dụng chúng, chỉ là phát minh của bạn, nhưng hầu hết các trường hợp phổ biến tôi tranh thủ ở trên.

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.