Design Patterns J2EE - Service Locator
----------------------------------------
Nome
--------------
Service Locator
Outros nomes
--------------
EJBHomeFactory (n�o � exatamente outro nome, mas ambos se assemelham em alguns aspectos)
Contexto
--------------
Antes de um cliente utilizar um EJB, � preciso que ele encontre
ou ent�o crie uma nova inst�ncia do bean.
Problema
--------------
Utilizar um EJB implica em alguns passos:
- cria��o de um InitialContext JNDI, que representa os mapeamentos entre
nome l�gico e nome da classe do bean
- lookup da interface home, que controla o ciclo de vida do componente
- cria��o ou recupera��o do EJB
- finalmente, a utiliza��o dos seus servi�os
Al�m de incrementar a complexidade do c�digo cliente, estas atividades s�o necess�rias para todos os clientes que utilizarem um mesmo bean, o que gera um alto n�vel de repeti��o de c�digo. Por exemplo, se um EJB � acessado por helper classes, por uma aplica��o console, por um Session Facade e at� por outros beans, as tarefas apontadas acima ser�o repetidas em todos os tipos de clientes.
Solu��o
--------------
Criar uma classe (ServiceLocator) que transpare�a do cliente e concentre
toda a complexidade JNDI.
Consequ�ncias
--------------
+ Melhora de performance, j� que mecanismos de cache podem ser implementados
no ServiceLocator, para evitar lookups desnecess�rios
+ Reduz a complexidade do c�digo cliente
+ Facilita a manuten��o, por n�o pulverizar o mesmo trecho de c�digo em v�rios
pontos da aplica��o
+ Tira do cliente toda depend�ncia ao mecanismo de lookup
Estrat�gias
--------------
/**
* ServiceLocator que implementa um cache de interfaces home
* @author alegomes
*/
class ServiceLocator {
/** * Contexto JNDI cuja instacia��o ser� reduzida, j� que o custo
* deste tipo de opera��o � alto. */
private InitialContext jndiContext;
/** * Cache de interfaces home, para reduzir o numero de lookups */
private Hashtable homeCache;
/**
* Este ServiceLocator ser� um Singleton
*/
private static ServiceLocator instance;
/**
* Cria��o
*/
public ServiceLocator()
{
homeCache = new Hashtable();
jndiContext = new InitialContext();
//Obs: excess�es omitidas
}
/**
* Recupera a instancia do Singleton
*/
public ServiceLocator getLocator()
{
return instance;
}
/**
* Recupera uma interface home.
* O lookup do bean s� � feito se n�o houver nenhuma * refer�ncia sua no cache
*/
public EJBHome getService(String jndiName)
{
if (!homeCache.containsKey(jndiName))
{
//� a primeira vez que este bean � solicitado. //Vamos coloc�-lo no cache.
Object ref = jndiContext.lookup(jndiName)
EJBHome home = (EJBHome)PortableRemoteObject.narrow(ref, EJBHome.class);
homeCache.put(jndiName, home);
}
return homeCache.get(jndiName);
}
}
}
Do lado cliente, para um bean ser utilizado, basta utilizarmos:
ServiceLocator.getLocator().getService("meuEJBPreferido");
Observa��es
--------------
1 - Este c�digo est� longe de ser a solu��o �tima. N�o � o objetivo.
2 - Uma outra estrat�gia � implementar o ServiceLocator como Stateful Session Bean.
3 - O ServiceLocator pode ser utilizado para a recupera��o de qualquer tipo de
servi�o que esteja dispon�vel na estrutura JNDI:
- QueueConnectionFactory - Queue
- TopicConnectionFactory - Topic
- DataSource
- URL
- EJBLocalHome
Pr�ximo design pattern J2EE: ValueListHandler
Bons patterns !!!
Alexandre Gomes
Sou Jedi, Sou Java!
================================================================================
[dicas-list] circula diariamente com pequenas dicas sobre a plataforma Java e �
mais um servi�o da Sociedade de Usu�rios Java - http://www.soujava.org.br
*** SouJava - Fortalecendo a Comunidade Java Brasileira! ***
- Para contribuir com uma dica, envie um e-mail para [EMAIL PROTECTED]
- Participe de outras listas de discuss�o sobre a linguagem Java.
Saiba mais em http://www.soujava.org.br/lista.htm
--------------------------------------------------------------------------------
- Para assinar este boletim: mailto:[EMAIL PROTECTED]
- Para cancelar sua assinatura: mailto:[EMAIL PROTECTED]
- Dicas anteriores: http://www.mail-archive.com/dicas-list%40soujava.org.br
- Para discutir sobre as dicas, acesse o Mundo OO (http://www.mundooo.com.br)
