我为同一个会话提供了两个SessionScoped CDI bean实例。我的印象是CDI会为我生成一个实例,但它产生了两个。我误解了CDI是如何工作的,还是我发现了一个错误?
这是bean代码:
package org.mycompany.myproject.session;
import java.io.Serializable;
import javax.enterprise.context.SessionScoped;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.servlet.http.HttpSession;
@Named @SessionScoped public class MyBean implements Serializable {
private String myField = null;
public MyBean() {
System.out.println("MyBean constructor called");
FacesContext fc = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession)fc.getExternalContext().getSession(false);
String sessionId = session.getId();
System.out.println("Session ID: " + sessionId);
}
public String getMyField() {
return myField;
}
public void setMyField(String myField) {
this.myField = myField;
}
}
这是Facelet代码:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<f:view contentType="text/html" encoding="UTF-8">
<h:head>
<title>Test</title>
</h:head>
<h:body>
<h:form id="form">
<h:inputText value="#{myBean.myField}"/>
<h:commandButton value="Submit"/>
</h:form>
</h:body>
</f:view>
</html>
以下是部署和导航到页面的输出:
INFO: Loading application org.mycompany_myproject_war_1.0-SNAPSHOT at /myproject
INFO: org.mycompany_myproject_war_1.0-SNAPSHOT was successfully deployed in 8,237 milliseconds.
INFO: MyBean constructor called
INFO: Session ID: 175355b0e10fe1d0778238bf4634
INFO: MyBean constructor called
INFO: Session ID: 175355b0e10fe1d0778238bf4634
使用GlassFish 3.0.1
答案 0 :(得分:4)
Ryan,正如covener已经写过的那样,构造函数也将被调用该bean的每个代理。这是所有代理机制的标准行为,它不仅提供接口代理(如java.lang.reflect.proxy东西),而且提供真正的类代理。
还想象一下,每个序列化也会调用ct。因此,如果您在负载均衡的集群上工作,您会看到很多次。因此,请将@PostConstruct用于一般的bean。
LieGrue, STRUB
答案 1 :(得分:3)
当新建代理用于注入点时,CDI实现可能会调用底层bean的默认构造函数 - 这是javassist的默认行为,用于焊接和openwebbeans。
在默认构造函数中避免繁重的工作,如果可以,请将其移动到@PostConstruct中!