Pessoal, atualmente utilizo um Singleton para gerar os logs da minha aplicação. Nesse singleton defino alguns handlers para gerar logs não só de erros, mas de algumas ações dos usuários.
Lendo um pouco na internet, descobri que Singleton não é a melhor maneira de fazer isso e que seria melhor utilizar injeção de dependência.
Como isso funcionaria ? Eu criaria uma classe com @ApplicationScope e passaria pra todo construtor o objeto definido por essa classe ?
Alguém tem uma solução elegante ? Um exemplo ?
Valeu.
Singleton não é ruim não. O Singleton apenas não é usado da forma correta.
Uma classe ApplicationScoped, de certa forma, é um Singleton. Se você ler a especificação EJB 3.1, que saiu do forno a pouco tempo, entrou justamente uma anotação @Singleton, onde provê uma única instância da classe para cada instancia de VM. Ou seja, o mesmo comportamento do ApplicationScoped.
A diferença é que no VRaptor ApplicationScoped é inicializado quando a aplicação inicializa. Já no EJB inicializa somente quando é injetado em outra classe ou quando anotado com @Startup.
De qualquer forma, cuidado com isso. Gerar logs de forma “singleton” pode dar locks e até mesmo objetos do usuário alterados em threads diferentes, o que pode causar problemas bem desagradáveis.