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.