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可能执行的操作,您甚至会看到,在构造函数中不允许您执行容器服务的任何调用,但在回调中可以执行更多操作