2014-10-06 179 views
0

我有一個關於兩個註解兩個問題:CDI注入和@Model註釋

1)爲什麼出現「faceContext」必須從資源類注射?相反,MemberController可以直接在register()方法中使用「FacesContext.getCurrentInstance()」來obatin一個FacesContext對象?這樣做似乎簡單得多。

2)@Mingle可以被@Singleton替換嗎?甚至@ApplicationScoped?

謝謝。

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

注入得到它使用靜態工廠方法的FacesContext中istead的優點,你將只有一次去關心如何在實現生產者方法或字段時獲取當前上下文。每次你需要上下文時,你都可以簡單地注入它,它對你來說是完全透明的。這可能也有一些好處,當有任何改變如何獲得上下文,...

第二個問題的答案取決於您的要求。由於@Model僅僅是@RequestScoped和@Named的構造型,您不能直接將其替換爲@Singleton或@ApplicationScoped,因爲這些註釋都是通過容器爲所有請求創建單個對象。然而,如果這比你的要求更好地滿足你的要求,那麼你可以自由地改變它;)

+0

你是說「@Model」在功能上等於「@RequestScoped」+「@Named 「?謝謝。 – marlon 2014-10-07 02:25:11

+0

另外,成員字段用@Produces註釋的目的是什麼?不能將會員類直接注入任何需要它的類中? – marlon 2014-10-07 02:30:36

+0

是的,「@Model」是「@RequestScoped」和「@Named」的原型,因此在功能上相同。 「@Produces」註解只是'實現'一種工廠方法(這裏是一個字段),它產生了EntityManager的實例。你也可以在任何地方使用「@PersistenceContext」直接注入EntityManager,但是使用CDI的資源生產者模式可以使用「@Inject」並使用限定符注入不同的實例。這可能f.i.如果您需要在不同數據庫上運行2個EntityManager實例,那麼情況就是如此。 – shillner 2014-10-07 07:45:49