我有一個關於兩個註解兩個問題: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();
}
}
你是說「@Model」在功能上等於「@RequestScoped」+「@Named 「?謝謝。 – marlon 2014-10-07 02:25:11
另外,成員字段用@Produces註釋的目的是什麼?不能將會員類直接注入任何需要它的類中? – marlon 2014-10-07 02:30:36
是的,「@Model」是「@RequestScoped」和「@Named」的原型,因此在功能上相同。 「@Produces」註解只是'實現'一種工廠方法(這裏是一個字段),它產生了EntityManager的實例。你也可以在任何地方使用「@PersistenceContext」直接注入EntityManager,但是使用CDI的資源生產者模式可以使用「@Inject」並使用限定符注入不同的實例。這可能f.i.如果您需要在不同數據庫上運行2個EntityManager實例,那麼情況就是如此。 – shillner 2014-10-07 07:45:49