我有一个关于两个注解两个问题: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