CDI注入和@Model注释

时间:2014-10-06 04:52:44

标签: ejb cdi

我有两个关于两个注释的问题:

1)为什么" faceContext"必须从Resources类注入?相反,MemberController可以直接使用" FacesContext.getCurrentInstance()"在register()方法中使用FacesContext对象?这样做似乎要简单得多。

2)@ Model可以替换@Singlel吗?甚至是@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();
}
}

1 个答案:

答案 0 :(得分:0)

注入FacesContext而不是使用静态工厂方法获取它具有以下优点:在实现生成器方法或字段时,您只需要关心如何获取当前上下文。每次你需要上下文时,你可以简单地注入它,它对你来说是完全透明的。当如何获得上下文的任何变化时,这也可能有一些好处,...

第二个问题的答案取决于您的要求。由于@Model只是@RequestScoped和@Named的刻板印象,因此您无法直接将其替换为@Singleton或@ApplicationScoped,因为这两个注释都是为了为所有请求创建单个对象的容器。然而,如果这比满足您的要求更好,而不是为每个请求设置不同的对象,您可以自由更改它;)