Backing Bean (@ManagedBean) 또는 CDI Bean (@Named)?


109

방금 Core JavaServer Faces, 3rd Ed를 통해 읽기 시작했습니다 . 그리고 그들은 이것을 말합니다 (강조 내) :

JSF 페이지에서 사용할 수있는 Bean에 대해 두 개의 별도 메커니즘 인 CDI Bean과 JSF 관리 Bean이 있다는 것은 역사적 사고입니다. 애플리케이션이 Tomcat과 같은 일반 서블릿 실행기에서 작동해야하는 경우가 아니면 CDI Bean을 사용하는 것이 좋습니다 .

왜? 그들은 제공하지 않는 어떤 정당성을. @ManagedBeanGlassFish 3에서 실행되는 프로토 타입 애플리케이션의 모든 빈에 대해 사용해 왔지만 실제로이 문제를 발견하지 못했습니다. 에서 @ManagedBean로 마이그레이션하는 것은 특별히 신경 쓰지 @Named않지만 왜 귀찮게 해야하는지 알고 싶습니다 .



4
@Bozho : 그 질문은 매우 비슷하지만 Pascal의 답변을 몇 번 읽은 후에도 CDI가 훨씬 우수 한지 이해하지 못합니다 . 저는 CDI를 모르고 "더 나은"것이기 때문에 배우게되어 기쁩니다. 왜 더 낫습니까?
Matt Ball

"응용 프로그램이 Tomcat과 같은 일반 서블릿 실행기에서 작동해야하는 경우가 아니라면"저는 Tomcat 만 사용하고 CDI를 강력히 권장합니다. Tomcat은 그것을 잘 지원할 수
칼 Kildén

1
@ KarlKildén "일반 서블릿 러너"는 비 CDI 가능 서블릿 컨테이너를 나타냅니다. 글을 쓰는 시점에서 Tomcat은 약간의 마법을 제외하고는 CDI를 지원하지 않았습니다.
Thorbjørn Ravn Andersen 2012 년

답변:


64

CDI는 JavaEE 전체 종속성 주입을 허용하기 때문에 일반 JSF보다 선호됩니다. POJO를 주입하고 관리 할 수도 있습니다. JSF를 사용하면 CDI로 할 수있는 것의 일부만 주입 할 수 있습니다.


- 그러니까 기본적으로, 나는 거의 모든 클래스의 인스턴스를 주입 할 수 있습니다 (이 "올바른 재료"가 제공 그냥 인수 없음의 생성자, 무엇을? 내가 사용할 수있는 반면, CDI와) @ManagedBean나는 일반으로 주입하려는 경우 JSF?
Matt Ball

3
@MattBall Matt는 몇 년 후이 마이그레이션에 대해 언급 할 수 있습니까?
Koray Tugay 2013 년

5
@KorayTugay 2011 년 6 월 이후로이 코드를 건드리지 않았지만 CDI로 전환했고 모든 것이 잘 작동했습니다. 특정 질문이 있으시면 기꺼이 답변 해 드리겠습니다.
Matt Ball

170

CDI를 사용하십시오.

JSF 2.3 당으로 @ManagedBean되어 사용되지 . 사양 문제 1417 도 참조하세요 . 더 이상 선택하는 이유가 아니라고이 수단 @ManagedBean이상 @Named. 이것은 Mojarra 2.3.0 베타 버전 m06에서 처음 구현되었습니다.

여기에 이미지 설명 입력


역사

핵심적인 차이점은 @ManagedBeanJSF 프레임 워크에 의해 관리되며 @ManagedProperty다른 JSF 관리 Bean을 통해서만 사용할 수 있다는 것입니다. @NamedCDI 프레임 워크를 통해 애플리케이션 서버 (용기)에 의해 관리된다 경유 @Inject같은 컨테이너 관리 아티펙트의 종류를 사용할 수 @WebListener, @WebFilter, @WebServlet, @Path, @Stateless, 등 심지어 JSF @ManagedBean. 다른 쪽에서는 내부 또는 다른 컨테이너 관리 아티팩트 내부에서 작동 @ManagedProperty하지 않습니다@Named . 그것은 실제로 내부에서만 작동합니다 @ManagedBean.

또 다른 차이점은 CDI가 실제로 요청 / 스레드 단위로 대상 범위의 현재 인스턴스에 위임하는 프록시를 주입한다는 것입니다 (예 : EJB가 주입되는 방식). 이 메커니즘은 JSF로는 불가능한 더 넓은 범위의 빈에 더 좁은 범위의 빈을 주입 할 수있게합니다 @ManagedProperty. JSF는 setter를 호출하여 여기에 물리적 인스턴스를 직접 "주입"합니다 (이것이 바로 setter가 필요한 이유이지만 에서는 필요 하지 않음@Inject ).

직접적인 단점은 아니지만-다른 방법이 있습니다-범위 @ManagedBean는 단순히 제한됩니다. 다른 관점에서 보면에 대해 "너무 많이"노출하지 않으려면 @Inject관리되는 Bean을 그대로 유지할 수도 있습니다 @ManagedBean. 그것은처럼 protectedpublic. 그러나 그것은 실제로 중요하지 않습니다.

적어도 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를 설치하는 방법 도 참조하십시오 .


4
나는 생성하고 beans.xml, @ManagedBeanbacking bean을 @Named로 변환 @ManagedProperty하고, @Inject. 모든 것이 세상과 잘 어울립니다. 그러나 @EJB주석을로 변경 @Inject하면 배포가 실패하고 ( org.jboss.weld.exceptions.DeploymentException) 메시지가 표시 WELD-001408 Injection point has unsatisfied dependencies됩니다. @Inject인터페이스가없는 EJB를 @Named빈 에 주입하는 데 실제로 사용해야합니까 , 아니면 계속 사용해야 @EJB합니까? EJB는 내 CDI Bean이 포함 된 WAR과 동일한 EAR의 EJB JAR에 패키지됩니다.
Matt Ball

그냥 작동합니다. 현재 용접 버전에서 여전히이 문제에 직면하고 있습니까?
BalusC 2013

아아, 나는 말할 수 없었다. 이 질문은 2 명의 고용주와 2 년 이상 전의 것입니다. Bozho의 답변에 대한 이전 의견에 따르면 CDI /로 전환했을 것 @Named입니다.
Matt Ball

"MyFaces CODI는 JSF의 javax.faces.bean.ViewScoped를 CDI에 완전히 투명하게 브리징하여 더 쉽게 만들 수 있습니다 @Named @ViewScoped.하지만 이렇게하면 결과 URL에 추악한 windowId 요청 매개 변수가 추가되며 일반 페이지 간 탐색에서도 마찬가지입니다." DeltaSpike를 사용하면 더 이상 사실이 아닙니다. 창 범위가 필요하지 않은 경우 dsId 및 windowId URL 매개 변수를 모두 비활성화 할 수 있습니다.
JanM

1
@Jan : 그리고 그 사이에, OmniFaces 또한 JSF를 가지고 2.2 등 @ViewScopedJSF 2.0 / 2.1 : showcase.omnifaces.org/cdi/ViewScoped
BalusC

16

Java EE 6 및 CDI를 사용하면 Managed Bean에 대해 다른 옵션이 있습니다.

  • @javax.faces.bean.ManagedBeanJSR 314를 참조하며 JSF 2.0과 함께 도입되었습니다. 주요 목표는 JSF 페이지 내에서 빈을 사용하기 위해 faces-config.xml 파일의 구성을 피하는 것이 었습니다.
  • @javax.annotation.ManagedBean(“myBean”) JSR 316에 의해 정의됩니다. Java EE의 다른 곳에서 사용하기 위해 JSF 관리 Bean을 일반화합니다.
  • @javax.inject.Named(“myBean”) CDI를 활성화하려면 web / WEB-INF 폴더에 beans.xml 파일이 필요하다는 점을 제외하면 위의 것과 거의 같습니다.

1
처음 둘의 차이점은 무엇입니까?
Matt Ball

첫 번째 어노테이션의 목표는 JSF에서 사용하기 위해 faces-config.xml의 빈 구성을 대체하는 것입니다. 두 번째는 개념을 "java ee 6 컨테이너"에 복사합니다. 더 많은 함수 (@PostConstruct 및 @PreDestroy 주석)가 있지만 JSF 페이지 (표현식 언어 사용)에서도 연결할 수 있습니다.
h2mch 2010

1
beans.xml파일 이 필요한 가요? 오늘날에도 이것이 사실입니까?
Thufir

2
아니요, JavaEE7에서는 더 이상 beans.xml이 필요하지 않습니다. docs.oracle.com/javaee/7/tutorial/doc/cdi-adv001.htm
h2mch 2014

1
JavaEE7에서는 beans.xml이 필요하지 않습니다. docs.oracle.com/javaee/7/tutorial/cdi-adv001.htm (올바른 링크) blogs.oracle.com/theaquarium/entry/…(Java의 기본 CDI 활성화) EE 7)
M. Atif Riaz

2

GlassFish 3.0.1에서 CDI를 사용하고 있었지만 제대로 작동하려면 Seam 3 프레임 워크 (Weld)를 가져와야했습니다. 꽤 잘 작동했습니다.

GlassFish 3.1에서는 CDI가 작동을 멈추고 Seam Weld가 작동을 멈췄습니다. 이 버그를 열었 지만 아직 수정되지 않았습니다. 모든 코드를 javax.faces. * 주석을 사용하도록 변환해야했지만 작동하게되면 CDI로 돌아갈 계획입니다.

CDI를 사용해야한다는 데 동의하지만 아직 해결되지 않은 한 가지 문제는 @ViewScoped 주석으로 수행 할 작업입니다. 나는 그것에 의존하는 많은 코드를 가지고 있습니다. @ManagedBean을 사용하지 않는 경우 @ViewScoped가 작동하는지 여부는 명확하지 않습니다. 누구든지 이것을 명확히 할 수 있다면 감사하겠습니다.


-1

CDI로 전환해야하는 한 가지 좋은 이유 @Inject는 JSF 관리 Bean과 REST 서비스 (예 : Jersey / JAX-RS)에 공통 세션 범위 리소스 (예 : 사용자 프로필)를 포함 할 수 있다는 것 입니다.

반면에 @ViewScopedJSF를 고수해야하는 설득력있는 이유는 @ManagedBean특히 중요한 AJAX가있는 모든 경우에 그렇습니다. CDI에는 이에 대한 표준 대체가 없습니다.

@ViewScopedCDI bean 에 대한 유사한 주석을 지원할 수있는 것 같지만 개인적으로 사용하지는 않았습니다.

http://seamframework.org/Seam3/FacesModule

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.