Jee6 różne singletony

0

Cześć

Jestem troszkę zmieszany ponieważ w jee6 pojawiło się kilka możliwości tworzenia singletonu, chodzi mi o adnotacje :

  1. javax.inject.Singleton;
  2. javax.ejb.Singleton;
  3. javax.enterprise.context.ApplicationScoped

Mam pewien mętlik w głowie, które z tych rozwiązań jest najlepsze i czym dokładnie się one różnią..

0

A czego potrzebujesz? Ja używam starego sposobu:
http://pl.wikisource.org/wiki/Singleton_%28wzorzec_projektowy%29/kod#Rozwi.C4.85zanie_2_.28tylko_Java_5_i_nowsza.29
i zawsze robi to, czego potrzebuję.

0

A po co Ci singleton? Jaki problem chcesz rozwiązań?

0

Zadałem proste pytanie jakie są różnice pomiędzy tymi trzema rodzajami, otrzymuję odpowiedzi a po co Ci singleton albo jak napisać singleton .....

Nie wiem jak prościej zadać to pytanie ......
Wiem, że można znaleźć wiele anglojęzycznych źródeł, ale liczyłem na to, że ktoś 'łopatologicznie' wytłumaczy i zaznaczy podstawowe różnice

0
  1. singleton uniwersalny - można tego używać w aplikacjach EE, jak i zwykłych "okienkach i konsolach". Generalnie jest to uniwersalna definicja singletona. Obsługiwana przez Springa, Guice, CDI i inne kontenery DI. Jak nie wiesz co wybrać wybierz to.
  2. to jest singleton w aplikacji EJB. By tego używać potrzebujesz kontenera EJB. Ustandaryzowane dla kontenerów EJB.
  3. Zawężenie powyższego do "Aplication Scope" (brak gwarancji , że będzie jeden na JVM):
javadoc napisał(a)

The application scope is active:

  1. during the service() method of any servlet in the web application, during the doFilter() method of any servlet filter and when the container calls any ServletContextListener, HttpSessionListener, AsyncListener or ServletRequestListener,
  2. during any Java EE web service invocation,
  3. during any remote method invocation of any EJB, during any asynchronous method invocation of any EJB, during any call to an EJB timeout method and during message delivery to any EJB message-driven bean,
  4. during any message delivery to a MessageListener for a JMS topic or queue obtained from the Java EE component environment, and
  5. when the disposer method or @PreDestroy callback of any bean with any normal scope other than @ApplicationScoped is called.

W przypadku aplikacji stojących na serwerze jako EAR nie ma różnicy pomiędzy 1 i 2.

0

@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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1