2014-10-06 6 views
0

가 나는 두 개의 주석에 대한 두 가지 질문이있다 :CDI 주입 및 @Model 주석

1) 왜 "faceContext은"자원 클래스에서 주입되어야 하는가? 대신 MemberController는 FacesContext 객체를 obatin하기 위해 register() 메소드에서 "FacesContext.getCurrentInstance()"를 직접 사용할 수 있습니까? 그렇게하는 것이 훨씬 간단 해 보입니다.

2) @ 모델을 @Singleton으로 교체 할 수 있습니까? 아니면 심지어 @ApplicationScoped?

감사합니다. 정적 팩토리 메소드를 사용하여 얻을 수있는 FacesContext의 istead를 주입

는 MemberController.java

@Model 
public class MemberController { 

@Inject 
private FacesContext facesContext; 

@Inject 
private MemberRegistration memberRegistration; 

@Produces 
@Named 
private Member newMember; 

@PostConstruct 
public void initNewMember() { 
    newMember = new Member(); 
} 

public void register() throws Exception { 
    try { 
     memberRegistration.register(newMember); 
     FacesMessage m = new FacesMessage(FacesMessage.SEVERITY_INFO, "Registered!", "Registration successful"); 
     facesContext.addMessage(null, m); 
     initNewMember(); 
    } catch (Exception e) { 
     String errorMessage = getRootErrorMessage(e); 
     FacesMessage m = new FacesMessage(FacesMessage.SEVERITY_ERROR, errorMessage, "Registration unsuccessful"); 
     facesContext.addMessage(null, m); 
    } 
} 
} 

Resources.java

public class Resources { 
// use @SuppressWarnings to tell IDE to ignore warnings about field not being referenced directly 
@SuppressWarnings("unused") 
@Produces 
@PersistenceContext 
private EntityManager em; 

@Produces 
public Logger produceLog(InjectionPoint injectionPoint) { 
    return Logger.getLogger(injectionPoint.getMember().getDeclaringClass().getName()); 
} 

@Produces 
@RequestScoped 
public FacesContext produceFacesContext() { 
    return FacesContext.getCurrentInstance(); 
} 
} 

답변

0

한 번만 방법에 대해 걱정해야합니다 장점이있다 생성자 메서드 또는 필드를 구현할 때 현재 컨텍스트를 가져옵니다. 컨텍스트가 필요할 때마다 간단히 삽입 할 수 있으며 출처는 어디서나 볼 수 있습니다. 또한 컨텍스트를 얻는 방법이 바뀌면 몇 가지 이점이 있습니다 ...

두 번째 질문에 대한 대답은 요구 사항에 따라 다릅니다. @Model은 @RequestScoped 및 @Named에 대한 스테레오 타입이므로 @Singleton 또는 @ApplicationScoped로 직접 바꿀 수는 없습니다. 두 주석이 모든 요청에 ​​대해 단일 객체를 만들기 위해 컨테이너를 표시합니다. 그럼에도 불구하고 각 요청에 대해 다른 개체를 사용하는 것보다이 요구 사항이 더 적합하다면 변경할 수 있습니다.)

+0

"@Model"은 기능상으로 "@RequestScoped"+ "@Named "? 감사. – marlon

+0

또한 회원 필드에 @Produces가 주석 된 이유는 무엇입니까? 멤버 클래스를 필요로하는 클래스에 직접 삽입 할 수 없습니까? – marlon

+0

예 "@Model"은 "@RequestScoped"및 "@Named"에 대한 스테레오 타입이므로 기능적으로 동일합니다. "@Produces"어노테이션은 EntityManager의 인스턴스를 생성하는 팩토리 메소드 (여기서는 필드) 패턴을 단순히 '구현'한다. 다른 곳에서는 "@PersistenceContext"를 사용하여 EntityManager를 직접 삽입 할 수도 있지만이 리소스 생성자 패턴의 CDI를 사용하면 "@Inject"를 사용하고 한정자를 사용하여 다른 인스턴스를 주입 할 수 있습니다. 이것은 f.i 일 것입니다. 서로 다른 데이터베이스에서 작동하는 2 개의 EntityManager 인스턴스가 필요할 경우가 될 수 있습니다. – shillner

관련 문제