2012-08-31 26 views
11

Được rồi, vì vậy tôi có một bean sao lưu JSF cần tham chiếu đến bean khác (@NoneScoped).Tiêm vs ManagedProperty

Tôi có nên @Inject hoặc sử dụng @ManagedProperty để lấy tham chiếu mẫu từ vùng chứa không?

Tại sao nên sử dụng cái này chứ không phải cái kia, trong tâm trí tôi, hai cách tiếp cận đạt được điều tương tự.

Trả lời

10

@ManagedProperty@NoneScoped xuất phát từ thông số JSF 2.0 trong khi @Inject xuất phát từ thông số CDI.

Nếu bạn chỉ đang làm việc trên một ứng dụng servlet không sử dụng bất kỳ tính năng nào khác của JavaEE 6, hãy truy cập @ManagedProperty. Chú thích đó cũng có lợi thế so với @Inject: bạn có thể sử dụng EL (ngôn ngữ biểu thức) với nó (although there are workarounds to get that in CDI).

Cả chú thích/vùng chứa dường như đạt được "cùng một điều" nhưng theo những cách rất khác nhau và chúng hoạt động với các vùng chứa khác nhau. Đậu được quản lý bởi CDI sẽ có sẵn cho JSF nhưng không có sẵn cho phó. Nếu bạn chú thích các bean của bạn với các chú thích JSF cụ thể thì hãy quên sử dụng các định dạng tùy chỉnh, các trình chặn, các phương thức sản xuất, v.v. Tôi thường thích phương pháp tiếp cận với CDI hơn, vì cuối cùng nó phức tạp hơn nhưng sự lựa chọn sẽ phụ thuộc vào nhu cầu thực tế của bạn .

Bao bì nó lên, vì nó có vẻ như bạn chỉ sử dụng các tính năng JSF sau đó dính vào @ManagedProperty (CDI không thể hiểu @NoneScoped chú thích, trong CDI tất cả đậu là thuộc phạm vi @Default nếu không có chỉ định). Chuyển sang CDI trong dự án của bạn có thể thay thế không chỉ là @ManagedProperty đối với một @Inject một, nhưng tất cả @RequestScoped (v.v.) của bạn cho CDI cụ thể.

6

Tôi sẽ ưu tiên CDI hơn đậu được quản lý bất cứ khi nào có thể. CDI phong phú hơn trong việc kiểm tra phụ thuộc thời gian triển khai và sự hỗ trợ proxy của nó ngăn chặn rò rỉ phạm vi. Điều này giúp xác minh tính chính xác của mô hình của bạn dễ dàng hơn. Producers thường có thể được sử dụng để cung cấp mã keo khi cần thiết.

+2

tôi sẽ thêm này, tương tự như những gì dưới đây, bạn có những thứ như EJB bạn có thể tiêm với CDI. Bạn cũng có thể giữ chúng ra khỏi tầm nhìn của bạn nếu bạn không cung cấp cho họ một @Name (mà chỉ đơn giản là làm cho chúng có sẵn cho EL). Sử dụng CDI cũng cung cấp cho bạn các điểm mở rộng lớn hơn những gì có sẵn trong JSF, nhưng đó không phải là một phần của câu hỏi :) Tôi đề nghị gắn bó với CDI. – LightGuard

Các vấn đề liên quan