Aplicaciones ansiosas. Frijoles administrados construidos varias veces.

Tengo un montón deansioso ApplicationScoped frijoles manejados Algunos de ellos son inyectados en otros por elManagedProperty Anotación, formando un árbol de dependencias. Cada frijol dependiente manipula a su padre después de la construcción.

Sin embargo, parece que se crea una nueva instancia para cada inyección, lo que hace que se deshagan las manipulaciones anteriores. A mi entender, unApplicationScoped El frijol solo debe ser creado una vez. ¿He entendido mal o por qué está sucediendo esto? ¿Es porque están ansiosos?

Aquí hay un ejemplo:

ParentBean.java
package example;

import javax.annotation.PostConstruct;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;

@ManagedBean(eager = true)
@ApplicationScoped
public class ParentBean
{
    static int initCount = 0;

    // ...

    @PostConstruct
    public void init()
    {
        ++initCount; // Will end up being between 1 and 3. Expected always 1.

        // ...
    }
}
Child1Bean.java
package example;

import javax.annotation.PostConstruct;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;

@ManagedBean(eager = true)
@ApplicationScoped
public class Child1Bean
{
    @ManagedProperty("#{parentBean}") ParentBean parentBean;

    public ParentBean getParentBean()
    {
        return parentBean;
    }

    public void setParentBean(ParentBean parentBean)
    {
        this.parentBean = parentBean;
    }

    @PostConstruct
    public void init()
    {
        // manipulate parentBean
    }
}
Child2Bean.java
package example;

import javax.annotation.PostConstruct;
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;

@ManagedBean(eager = true)
@ApplicationScoped
public class Child2Bean
{
    @ManagedProperty("#{parentBean}") ParentBean parentBean;

    public ParentBean getParentBean()
    {
        return parentBean;
    }

    public void setParentBean(ParentBean parentBean)
    {
        this.parentBean = parentBean;
    }

    @PostConstruct
    public void init()
    {
        // manipulate parentBean
    }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta