这类似于@Inject每次使用时都会注入一个新实例,但我在那个线程中找不到答案。
我对CDI和JSF都很陌生,我正在尝试使用CDI而不是JSF注释。我想从MemberController检索凭据。bean本身(两者)是从jsf页面调用的。问题是MemberController中Credential的实例总是有空名称/密码,即使我确认Credential中的setter被击中。我不明白为什么凭证有两个实例。我可以通过@ManagedBean+@ManagedProperty获得我想要的东西。但我想知道我怎么能用CDI做同样的事情。
我的环境是JBoss 7.1.1+Java EE 6
凭证。Java
import javax.enterprise.context.SessionScoped;
import javax.inject.Named;
import java.io.Serializable;
@Named
@SessionScoped
public class Credential implements Serializable{
private static final long serialVersionUID = 680524601336349146L;
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
private String password;
}
MemberController.Java
@Named
@SessionScoped
public class MemberController implements Serializable {
private static final long serialVersionUID = 8993796595348082763L;
@Inject
private Credential newCredential;
public void login() {
String msg = newCredential.getName()+":"+newCredential.getPassword();
}
}
JSF页面段
<p:inputText id="username" label="Username" value="#{credential.name}" />
<p:password id="password" label="Password" value="#{credential.password}" />
<p:commandButton value="Login" action="members" actionListener="#{memberController.login}" />
注入不会调用新实例(第一次调用时,或者注入的bean有一个requestscope)。这取决于您用于bean的作用域。您使用的Scope将为每个使用您的应用程序的人生成一个新的bean(他们自己的sessionscopebean)。此范围内的数据仅对此人员可见。如果您希望应用程序的全局容器可供应用程序的所有用户访问,并且每个用户都包含相同的数据,那么您应该创建一个applicationscope或singleton bean。有了这些注释,您可以创建一个容器,在应用程序的生命周期内每个人都可以访问,作为保存数据的中心点。