Spring em Seam, Parte 2: Quando há colisão entre stateless e stateful – Etapa 05
por: Dan Allen
Singletons Stateful
Como uma alternativa para injetar um proxy de componente na propriedade de um singleton Spring, podemos procurar o componente Seam a partir do container Seam e associar o resultado a uma variável local. Para evitar interações diretas com o container Seam, podemos adicionar um método estático de busca para a classe do componente que vai até o container Seam e obtém a instância do componente pelo nome. A Listagem 10 exibe a declaração do método estático de busca e um exemplo do seu uso no bean tournamentManager.
Listagem 10. Procurando um componente Seam usando um singleton stateful
public class TournamentSearchCriteria {
...
public static TournamentSearchCriteria instance() {
return (TournamentSearchCriteria) Component.getInstance("tournamentSearchCriteria");
}
}
public class TournamentManagerImpl implements TournamentManager {
...
public List<Tournament> findTournaments() {
TournamentSearchCriteria criteria = TournamentSearchCriteria.instance();
...
}
}
A técnica usada aqui é conhecida como um stateful singleton. Mais que um singleton sendo instanciado uma vez e compartilhado ao longo da aplicação inteira, ele é instanciado uma vez e limitado para o escopo stateful. Isso significa que existe uma instância em cada escopo particular, mas podem existir muitas instâncias ao longo de toda a aplicação. Por exemplo, se o componente stateful possui um escopo de sessão, então pode existir uma instância por sessão de usuário. O singleton stateful permite que você evite os problemas associados a múltiplas threads discutidos anteriormente. Além disso, como o resultado é associado a uma variável local, não existe a possibilidade de impedância de escopo. O único ponto negativo é que o método de instância estático depende que o container Seam esteja disponível, o pode fazer com que os testes sejam mais complicados e desafiadores. No entanto, podemos projetar uma configuração do sistema de forma que possamos ter um retorno sobre possíveis falhas ainda no ambiente de testes.
Aprendendo a Compartilhar
Neste ponto da série, acredito que você já tenha uma boa idéia a respeito de como injetar componentes Seam no container Spring e como evitar impedância de escopo e problemas de segurança em thread quando misturamos singletons e componentes stateful. O componente Seam que é mais freqüentemente doado nesta forma é o contexto de persistência gerenciado do Seam. Neste caso, Seam oferece a maior integração possível com a tag <seam:instance>. Na parte final (terceira) desta série, veremos como permitir que o Spring se beneficie a partir do gerenciamento do contexto de persistência automático do Seam e como ele pode duplamente beneficiar nosso processo de desenvolvimento.