CDI를 사용하십시오.
JSF 2.3 당으로 @ManagedBean
되어 사용되지 . 사양 문제 1417 도 참조하세요 . 더 이상 선택하는 이유가 아니라고이 수단 @ManagedBean
이상 @Named
. 이것은 Mojarra 2.3.0 베타 버전 m06에서 처음 구현되었습니다.
역사
핵심적인 차이점은 @ManagedBean
JSF 프레임 워크에 의해 관리되며 @ManagedProperty
다른 JSF 관리 Bean을 통해서만 사용할 수 있다는 것입니다. @Named
CDI 프레임 워크를 통해 애플리케이션 서버 (용기)에 의해 관리된다 경유 @Inject
같은 컨테이너 관리 아티펙트의 종류를 사용할 수 @WebListener
, @WebFilter
, @WebServlet
, @Path
, @Stateless
, 등 심지어 JSF @ManagedBean
. 다른 쪽에서는 내부 또는 다른 컨테이너 관리 아티팩트 내부에서 작동 @ManagedProperty
하지 않습니다@Named
. 그것은 실제로 내부에서만 작동합니다 @ManagedBean
.
또 다른 차이점은 CDI가 실제로 요청 / 스레드 단위로 대상 범위의 현재 인스턴스에 위임하는 프록시를 주입한다는 것입니다 (예 : EJB가 주입되는 방식). 이 메커니즘은 JSF로는 불가능한 더 넓은 범위의 빈에 더 좁은 범위의 빈을 주입 할 수있게합니다 @ManagedProperty
. JSF는 setter를 호출하여 여기에 물리적 인스턴스를 직접 "주입"합니다 (이것이 바로 setter가 필요한 이유이지만 에서는 필요 하지 않음@Inject
).
직접적인 단점은 아니지만-다른 방법이 있습니다-범위 @ManagedBean
는 단순히 제한됩니다. 다른 관점에서 보면에 대해 "너무 많이"노출하지 않으려면 @Inject
관리되는 Bean을 그대로 유지할 수도 있습니다 @ManagedBean
. 그것은처럼 protected
대 public
. 그러나 그것은 실제로 중요하지 않습니다.
적어도 JSF 2.0 / 2.1에서 CDI로 JSF 백킹 빈을 관리 할 때의 주요 단점은 @ViewScoped
. 은 @ConversationScoped
가깝게 있지만, 수동으로 시작 및 중지 요구하고 못생긴 추가 cid
결과 URL에 대한 요청 매개 변수를. MyFaces CODI는 JSF javax.faces.bean.ViewScoped
를 CDI 에 완전히 투명하게 브리징하여 더 쉽게 만들 수 있습니다 @Named @ViewScoped
.하지만 이렇게하면 windowId
결과 URL에 추악한 요청 매개 변수 가 추가 되며 일반 페이지 간 탐색에서도 마찬가지입니다. OmniFaces 는 @ViewScoped
빈의 범위를 임의의 요청 매개 변수 대신 JSF보기 상태에 실제로 연결 하는 진정한 CDI로이 모든 것을 해결합니다 .
(3 년이 질문 / 대답 한 후 해제) JSF 2.2은 새로운 완전히 CDI 호환 제공 @ViewScoped
의 맛에 상자 밖으로 주석을 javax.faces.view.ViewScoped
. JSF 2.2 @FlowScoped
에는 @ManagedBean
동등한 기능 이없는 CDI 전용도 함께 제공되어 JSF 사용자를 CDI로 이동시킵니다. 예상 @ManagedBean
대로 및 친구들은 Java EE 8에 따라 더 이상 사용되지 않을 것입니다. 현재 여전히을 사용중인 경우 @ManagedBean
향후 업그레이드 경로에 대비하기 위해 CDI로 전환하는 것이 좋습니다. CDI는 WildFly, TomEE 및 GlassFish와 같은 Java EE 웹 프로필 호환 컨테이너에서 쉽게 사용할 수 있습니다. Tomcat의 경우 JSF에 대해 이미했던 것과 똑같이 별도로 설치해야합니다. Tomcat에 CDI를 설치하는 방법 도 참조하십시오 .