¿Cómo se proporciona la instancia de bean @RequestScoped al bean @SessionScoped en tiempo de ejecución aquí?

Estoy leyendo este ejemplo enJBoss donde un@RequestScoped frijol retrocediendoJSF page se utiliza para pasar la información de credenciales del usuario que luego se guarda en un@sessionScoped bean. Aquí está el ejemplo tomado deJBoss docs.

@Named @RequestScoped
public class Credentials {
    private String username;
    private String password;
    @NotNull @Length(min=3, max=25)
    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
    @NotNull @Length(min=6, max=20)
    public String getPassword() { return password; }
    public void setPassword(String password) { this.password = password; }
}

Formulario JSF:

<h:form>
   <h:panelGrid columns="2" rendered="#{!login.loggedIn}">
      <f:validateBean>
         <h:outputLabel for="username">Username:</h:outputLabel>
         <h:inputText id="username" value="#{credentials.username}"/>
         <h:outputLabel for="password">Password:</h:outputLabel>
         <h:inputSecret id="password" value="#{credentials.password}"/>
      </f:validateBean>
   </h:panelGrid>
   <h:commandButton value="Login" action="#{login.login}" rendered="#{!login.loggedIn}"/>
   <h:commandButton value="Logout" action="#{login.logout}" rendered="#{login.loggedIn}"/>
</h:form>

Entidad de usuario:

@Entity
public class User {
   private @NotNull @Length(min=3, max=25) @Id String username;
   private @NotNull @Length(min=6, max=20) String password;
   public String getUsername() { return username; }
   public void setUsername(String username) { this.username = username; }
   public String setPassword(String password) { this.password = password; }
}

Frijol SessionScoped

@SessionScoped @Named
    public class Login implements Serializable {

   @Inject Credentials credentials;
   @Inject @UserDatabase EntityManager userDatabase;
   private User user;
   public void login() {
      List<User> results = userDatabase.createQuery(
         "select u from User u where u.username = :username and u.password = :password")
         .setParameter("username", credentials.getUsername())
         .setParameter("password", credentials.getPassword())
         .getResultList();
      if (!results.isEmpty()) {
         user = results.get(0);
      }
      else {
         // perhaps add code here to report a failed login
      }
   }

   public void logout() {
      user = null;
   }

   public boolean isLoggedIn() {
      return user != null;
   }

   @Produces @LoggedIn User getCurrentUser() {
 return user;
   }
}

Mis preguntas son

1) El@RequestScoped frijol se inyecta en@SessionScoped frijol. ¿Cuál es la garantía de que la información de credenciales establecida en una instancia deRequestScoped es lo mismo que se inyecta en@SessionScopedfrijol. por qué no un diferente@RequestScoped del grupo se inyecta o incluso una nueva instancia?

2) por que se da el frijol@SessionScoped pero no@Stateful. supongo@Stateful Trabajaré aquí.

3) cómo es el ciclo de vida de@sessionScoped frijol gestionado? Es entonces cuando se destruye? Si navego a un lugar diferenteJSF página en la que si extraigo la información comocurrentUser.userName, ¿recuperaré la misma información que configuré en mi primerJSF página utilizada para iniciar sesión. (Paso 1 arriba)

4) Si no especifico@RequestScoped, entonces el bean Credentials obtiene el@Dependent alcance que es el alcance definitivo. Se menciona en eldocs que establecer cualquier variable de instancia de un@Dependent se pierde de inmediato. Pero no entiendo por qué? De hecho, esto me lleva a la pregunta de qué uso de@Dependent alcance será?

Gracias

EDITAR Gracias kolossus por una respuesta detallada y excelente. Necesito un poco más de aclaraciones sobre algunos de sus puntos para una mejor comprensión.

Para un bean @requestScoped, hay un grupo de instancias disponibles que se entregan a los clientes. Ahora si tengo dos clientes accediendo a un JSF que está respaldado por un@RequestScoped bean, cada cliente puede trabajar en una instancia de@RequestScoped frijol de la piscina. De hecho, ambos clientes no trabajan realmente en la instancia directa, sino una referencia indirecta a esa instancia única que es el proxy aquí. Los clientes realizan todas las llamadas a métodos o transacciones utilizando este proxy. Entonces, ¿cuánto tiempo tiene el proxy esta referencia indirecta? Es decir, en mi ejemplo anterior, las variables de instancia de@RequestScoped frijol (Credentials) se establecen en JSF. pero el hecho real es que, esta configuración de variables de instancia le sucede a una instancia de @RequestScoped bean indirectamente a través del proxy. Pero cuando esta instancia se inyecta enSessionScoped bean, ¿es el proxy el que se inyecta? Desde el ciclo de vida deSessionScoped es para una sesión establecida entre el cliente y la aplicación, el proxy también vive durante esta vida. ¿Eso significa esto?single instance of @RequestScoped bean está obligado aSessionScoped y el ciclo de vida de@RequestScoped la instancia de bean o su proxy está determinada por el ciclo de vida deSessionScoped ¿frijol?

Respuestas a la pregunta(1)

Su respuesta a la pregunta