Java InitialContext.doLookup调用Bean';s构造函数两次
我有一个名为Java InitialContext.doLookup调用Bean';s构造函数两次,java,jboss,ejb,Java,Jboss,Ejb,我有一个名为RandomBean的SFSB,它有一个默认构造函数、@PostConstruct、@PreDestroy和@Remove方法。构造函数中有一个简单的计数器 @Stateful public class RandomBean { public static int c = 0; public static final Logger logger = Logger.getLogger(RandomBean.class); private Random r;
RandomBean
的SFSB,它有一个默认构造函数、@PostConstruct
、@PreDestroy
和@Remove
方法。构造函数中有一个简单的计数器
@Stateful
public class RandomBean {
public static int c = 0;
public static final Logger logger = Logger.getLogger(RandomBean.class);
private Random r;
private int cc;
public RandomBean() {
c += 1;
cc = c;
r = new Random();
logger.info("Random constructed: " + cc);
}
@PostConstruct
public void init() {
logger.info("Random started: " + cc);
}
public int nextInt() {
logger.info("Random invoked: " + cc);
return r.nextInt();
}
@PreDestroy
public void destroy() {
logger.info("Random destroyed: " + cc);
}
@Remove
public void remove() {
logger.info("removed: " + cc);
}
}
我还有一个servlet,它执行这个bean的查找并调用它的nextInt
方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
logger.info("Doing get");
try {
RandomBean r = InitialContext.doLookup("java:module/RandomBean");
logger.info("get! " + r.nextInt());
r.remove();
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
让我困惑的是,RandomBean
的构造函数似乎被调用了两次:
02:13:09,558 INFO [org.sokolas.model.HelloServlet] (http-localhost/127.0.0.1:8080-1) Doing get
02:13:09,559 INFO [org.sokolas.model.RandomBean] (http-localhost/127.0.0.1:8080-1) Random constructed: 1
02:13:09,560 INFO [org.sokolas.model.RandomBean] (http-localhost/127.0.0.1:8080-1) Random constructed: 2
02:13:09,561 INFO [org.sokolas.model.RandomBean] (http-localhost/127.0.0.1:8080-1) Random started: 2
02:13:09,561 INFO [org.sokolas.model.RandomBean] (http-localhost/127.0.0.1:8080-1) Random invoked: 2
02:13:09,562 INFO [org.sokolas.model.HelloServlet] (http-localhost/127.0.0.1:8080-1) get! -2028573462
02:13:09,562 INFO [org.sokolas.model.RandomBean] (http-localhost/127.0.0.1:8080-1) removed: 2
02:13:09,563 INFO [org.sokolas.model.RandomBean] (http-localhost/127.0.0.1:8080-1) Random destroyed: 2
这种行为是故意的吗?我是否应该将所有初始化放在@PostConstruct
方法中,而不使用构造函数?
我正在使用JBoss EAP 6.2。容器可能会决定预先创建bean实现的其他实例。 在实例创建时,它不会绑定到任何客户端会话 您应该将所有初始化逻辑放入ejbCreate/@Init或@PostConstruct方法中。 如果您查看EJB3.1规范第4.6.1节中SFSB可能执行的操作,您甚至会看到,在构造函数中不允许您执行容器服务的任何调用,但在回调中可以执行更多操作