O co chodzi z beanami @Remote @Local @Stateless i @Stateful

0

Witajcie,

Próbuję ogarnąć te całe JEE. Chcę zrobić blog (proszę nie mówić tu o WordPressie czy czymś podobnym, wiem, że istnieją, to w celach nauki JEE taki projekt). Z tego co ogarnąłem to muszę użyć beanów @Entity do ORM z bazy danych, ale są też beany do logiki np. uwierzytelniania. Nurtuje mnie też Dependency Injection. Czyli, że serwer wstrzykuje instancje jakiegoś beana do klasy, której ten bean jest zależnością. Za każdym razem tworzony jest nowy obiekt czy ten sam do każdej klasy której jest zależnością jest wstrzykiwany? Wiem, to co pisze to dla Was jest jakiś "brainfuck", ale jak zaczynałem z C++ było podobnie :) (czy nadal jest? :D).

1

Z tego co ogarnąłem to muszę użyć beanów @Entity do ORM z bazy danych

Nic nie musisz, ale byloby to wskazane.

Za każdym razem tworzony jest nowy obiekt czy ten sam do każdej klasy której jest zależnością jest wstrzykiwany?

To zależy od ciebie: https://docs.oracle.com/javaee/6/tutorial/doc/gjbbk.html

Beany Remote olej bo ci sie nie przydadzą.

Zalecam dowolny tutorial JEE bo o tym o co pytasz napisano całe książki i nikt ci tego nie streści w poście na forum...

1

a najlepiej naucz się Springa, bo JEE jest stare i w ogóle śmierdzi :D

2

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

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