@lukasw44:
Czasem singleton jest anty-wzorcem, stąd moje pytanie jaki problem chcesz rozwiązać.
Pytasz, który singleton jest najlepszy? Równie dobrze, możesz pytac który młotek jest najlepszy.. w kontekście wkręcania śrubek.
Adnotacje, o które pytasz pojawiają się w kontekście 3 specyfikacji:
- JSR-330 Dependency Injection
- JSR-346 Contexts and Dependency Injection for JavaTM EE 1.1 dla JavaEE 7 (aktualizacja JSR-299: Contexts and Dependency Injection 1.0 dla Java EE 6)
- JSR-318 EJB 3.1
JSR-330: javax.inject.Singleton
JSR-346: javax.enterprise.context.ApplicationScoped
JSR-318: javax.ejb.Singleton
JSR-330 to zbiór javadoców - nie jest w nim zdefiniowana semantyka (znaczenie wyrażenia) adnotacji. Oznacza to, że w zależności od implementacji
specyfikacji zachownaie może być różne :-)
Niektóre implementacje "dependency injection" przeszły testy zgodności z JSR-330 (https://code.google.com/p/atinject/wiki/Injectors),
np. Spring, Google Guice.
javax.ejb.Singleton - singleton w obrębie kontenera EJB: transakcyjny/bezpieczny dla wątków
javax.enterprise.context.ApplicationScoped - singleton powiązany z cyklem życia aplikacji, tj. tworzony raz w ciągu jej życia. Trzeba pamiętać o transakcyjności/wątkach. Podejrzewam, że w kontenerze EJB taki bean nie będzie thread safe.
Ja bym używał javax.ejb.Singleton w przypadku, gdyby mi zależało na transakcyjności / wielu wątkach odwołujących się do beana.
javax.enterprise.context.ApplicationScoped - w pozostałych przypadkach.