Witam na forum :)
Tak w skrócie, sposoby dostępu:
@No-interface-view
używasz jak chcesz wywołać metodę klasy EJB z tego samego modułu (moduł to np. paczka war, ejb-jar)
@Local
jak wyżej + pozwala wywołać metodę EJB klasy znajdującej się w innym module ale w tej samej paczce EAR
@Remote
jak wyżej + pozwala wywołać metodę klasy EJB znajdującej się w innym module nawet jeśli nie jest w tej samej paczce EAR, na innej JVM a nawet na innej maszynie fizycznej (więc argumenty i wynik są serializowane)
Cykle życia:
@javax.ejb.Singleton
- nie trzeba tłumaczyć
@Stateless
- przy każdym wywołaniu metody klasy stateless wybierany jest z puli nowy obiekt, czyli stateless nie trzyma stanu pomiędzy kolejnymi wywołaniami, po wywołaniu metody obiekt wraca do puli. Np. jak masz dwa kolejne wywołania:
statelessejb.method1(...);
statelessejb.method2(...);//to wywołanie może trafić do innego obiektu z puli niż powyższe
@Stateful
- Cykl życia zobacz sobie na diagramie z punktu 4.6.1 w specyfikacji. W przeciwieństwie do @Stateless
, trzyma stan aż do zniszczenia, np.:
statefulejb.init(...);
statefulejb.method1(...); //wywołujemy metodę na zainicjalizowanym obiekcie
Jeśli chodzi o wstrzykiwanie @Stateful
to zobacz kodzik z punktu 3.4.7.1:
@EJB Cart cart1;
@EJB Cart cart2;
...
if (cart1.equals(cart1)) { // this test must return true
...
}
...
if (cart1.equals(cart2)) { // this test must return false
...
}
W JEE7 klasom EJB @Stateful
można przypisać konteksty CDI (te które podlinkował @Shalom), wtedy lepiej patrzeć na taką klasę jak na klasę CDI, ale z dodaną z transakcyjnością i propagacją użytkownika ("Principal")
- nie używaj zasięgów z javax.faces.bean
- polecam zrobić ze dwa przykłady z java.lang.reflect.Proxy