Bean là 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ức và sự 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."