Managed bean chamar outro

Boa noite, GUJ. Gostaria da ajuda de vocês para me orientar até a luz pois estou perdido.

Estou a criar um chat com JSF, estou implementando o padrão observer para o caso das mensagens. Tenho uma classe Usuario e seu respectivo bean, UsuarioBean. Também possui uma classe Painel onde manipula todo o evento das mensagens através do padrão observer junto com as interfaces.

Eu preciso criar um BEAN para essa classe Painel chamando o UsuarioBean? Estou confuso e creio não estar explicando muito bem.

Agradeço a atenção.

Aqui mostra como chamar um MB dentro de outro: Aplicação Web Completa Tomcat JSF Primefaces JPA Hibernate.

você pode usar a anotação @ManagedProperty caso esteja usando JSF 2.0:

@ManagedProperty(value = "#{alunoBean}")
private AlunoBean alunoBean;

Opa, bom dia da uma pesquisada no CDI e nas formas de trabalhar com injeção de dependência, tem muito recurso você pode anotar um bean com o escopo dependente com isso ele sempre assume o escopo de quem chamou, por exemplo se vc tiver um managed bean principal com escopo de sessao ou conversation, e chamar um outro como dependente ele vai sempre utilizar o bean dependente, sempre que precisar.
Você vai estar injetando um bean em outro.

Obrigado pela ajuda, estou em passos lentos mas já consegui algum resultado e me surgiram novas dúvidas.

Há algum problema o ManagedBean implementar a interface de observador ( Padrão Observer )?

Gostaria de algumas opniões, se possível é claro, sobre a forma que estou implementando. Estou confuso e não consegui evoluir.

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:p="http://primefaces.org/ui"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:f="http://java.sun.com/jsf/core"      >
    <h:head>
        <link href="#{facesContext.externalContext.requestContextPath}/estilo.css" 
              rel="stylesheet" type="text/css" />  
        <title>Chat JSF</title>
    </h:head>

    <h:body>

        <p:layout id="layout" fullPage="true" styleClass="layout" size="100">

			<p:layoutUnit id="layoutUnitUsuariosOnline" position="west">
				<h:panelGroup id="painelUsuariosOnline" styleClass="painelBorda">
                    Usuários online:
                    <h:form>
                        <h:outputText value="#{Main.painelMensagem.listarObservadores}"/>
                    </h:form>

			    </h:panelGroup>
			</p:layoutUnit>
			
			<p:layoutUnit id="layoutUnitChatMensagens" position="center">
		        <h:panelGroup id="painelChatMensagens">
		        
                    <h:form>                    
                        <h:outputText value="#{ Main.painelMensagem.mensagem }"/>                     
                    </h:form>
        
		        </h:panelGroup>
			</p:layoutUnit>
			
			<p:layoutUnit id="layoutUnitEnviarMensagens" position="south" size="100">  
		        <h:panelGroup id="painelEnviarMensagens">
		        
		            <h:form>
		            
		                <h:panelGrid columns="2">
		                
			                <h:column rendered="#{Main.usuarioBean.usuario.apelido == null}" >
			                
			                    <h:inputText value="#{Main.usuarioBean.usuario.apelido }" id="apelido"/>
	                            <h:commandButton value="Entrar !"/>
	                            
	                        </h:column>

			                <h:column rendered="#{Main.usuarioBean.usuario.apelido != null}">    
			                
			                    <h:outputText value="#{ Main.usuarioBean.usuario.apelido }"/>                     
				                <h:inputText value="#{ Main.painelMensagem.mensagem }" id="mensagem"/>
		                        <h:commandButton value="Enviar !"/>
		                        
		                    </h:column>
		                    
		                </h:panelGrid>	
		                	         
		            </h:form>
		            
		        </h:panelGroup> 
	        </p:layoutUnit>  
	            
	    </p:layout>  
            
    </h:body>
</html>
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;

import com.marcelodeandrade.observer.PainelMensagem;
import com.marcelodeandrade.usuario.UsuarioBean;

@ManagedBean(name = "Main")
@ApplicationScoped
public class Main {

	@ManagedProperty(value = "#{UsuarioBean}")
	private UsuarioBean usuarioBean;
	
	private PainelMensagem painelMensagem;
	
	public PainelMensagem getPainelMensagem() {
		return painelMensagem;
	}

	public void setPainelMensagem(PainelMensagem painelMensagem) {
		this.painelMensagem = painelMensagem;
	}

	public UsuarioBean getUsuarioBean() {
		return usuarioBean;
	}

	public void setUsuarioBean(UsuarioBean usuarioBean) {
		this.usuarioBean = usuarioBean;
	}
	
	public Main(){
		
		this.usuarioBean = new UsuarioBean();
		this.painelMensagem = new PainelMensagem();
		painelMensagem.adicionarObservador(this.usuarioBean);
		
/*		Usuario u1 = new Usuario();
		Usuario u2 = new Usuario();
			
		painelMensagem.adicionarObservador(u1);
		painelMensagem.adicionarObservador(u2);
		
		painelMensagem.setMensagem("Olaaa");

		painelMensagem.removerObservador(u1);
		
		painelMensagem.setMensagem("xau u1");*/
	}
}
package com.marcelodeandrade.usuario;

import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;

import com.marcelodeandrade.observer.Observador;

@ManagedBean(name = "UsuarioBean")
@ApplicationScoped
public class UsuarioBean implements Observador{

		private Usuario usuario;

		public UsuarioBean(){
			this.usuario = new Usuario();	
		}

		public Usuario getUsuario() {
			return usuario;
		}

		public void setUsuario(Usuario usuario) {
			this.usuario = usuario;
		}

		@Override
		public void atualizarMensagem(String mensagem) {
			System.out.println("Painel: " + mensagem);
			
		}

}
package com.marcelodeandrade.usuario;

import com.marcelodeandrade.observer.Observador;

public class Usuario implements Observador {

	private String apelido;

	public String getApelido() {
		return apelido;
	}

	public void setApelido(String apelido) {
		this.apelido = apelido;
	}

	@Override
	public void atualizarMensagem(String mensagem) {
		System.out.println("Painel: " + mensagem);
		
	}

}
package com.marcelodeandrade.observer;

import java.util.ArrayList;
import java.util.List;

import com.marcelodeandrade.usuario.Usuario;
import com.marcelodeandrade.usuario.UsuarioBean;

public class PainelMensagem implements Mensagem {

	private String mensagem;
	private List<Observador> observadores;
	
	public PainelMensagem(){
		this.observadores = new ArrayList<Observador>();
	}
	
	public String getMensagem() {
		return mensagem;
	}

	public void setMensagem(String mensagem) {
		this.mensagem = mensagem;
		notificarObservadores();
	}

	@Override
	public void adicionarObservador(UsuarioBean usuarioBean) {
		this.observadores.add(usuarioBean);
	}

	@Override
	public void removerObservador(UsuarioBean usuarioBean) {
		this.observadores.remove(usuarioBean);		
	}

	@Override
	public void notificarObservadores() {
		for( Observador observador : this.observadores){
			observador.atualizarMensagem(this.mensagem);
		}
	}
	
	public List<Observador> getListarObservadores(){
		return observadores;
	}
	
}
package com.marcelodeandrade.observer;

import com.marcelodeandrade.usuario.Usuario;
import com.marcelodeandrade.usuario.UsuarioBean;

public interface Mensagem {
	
	public void adicionarObservador(UsuarioBean usuarioBean);
	
	public void removerObservador(UsuarioBean usuarioBean);
	
	public void notificarObservadores();

}
package com.marcelodeandrade.observer;

public interface Observador {
	
	public void atualizarMensagem(String mensagem);

}