Eager ApplicationScoped verwaltete Beans, die mehrmals erstellt wurden

Ich habe ein paareifrig ApplicationScoped gemanagte Bohnen. Einige von ihnen werden von der US-Regierung in andere injiziertManagedProperty Annotation, die einen Baum von Abhängigkeiten bildet. Jede abhängige Bean bearbeitet nach der Erstellung die übergeordnete Bean.

Es scheint jedoch, dass für jede Injektion eine neue Instanz erstellt wird, wodurch vorherige Manipulationen rückgängig gemacht werden. Meines ErachtensApplicationScoped Bean sollte nur einmal erstellt werden. Habe ich falsch verstanden oder warum passiert das? Liegt es daran, dass sie eifrig sind?

Hier ist ein Beispiel:

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
    }
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage