2014-10-06 125 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