Kilka pytań odnośnie Springa

0

Do tej pory programowałem w PHP. Tam w momencie wejścia na stronę odpalał się index.php, w nim było coś na kształt $application->run(), a jak wszystko się wykonało, to obiekty sobie "umierały", skrypt się kończył i sprawa załatwiona.

Od jakiegoś czasu walczę ze Springiem i podczas debugowania zauważyłem, że konstruktor mojego serwisu PostServiceStubImpl jest wywoływany tylko raz. Dosyć mnie to zdziwiło. Co więcej wygląda na to, że jest odpalany poza kontekstem webowym (gdy spróbowałem wyciągnąć swoje posty z sesji, to dostałem No thread-bound request found: Are you referring to request attributes outside of an actual web request).

Z tego (źródło)

Though surprising, since the service above is a singleton, this works well. Spring intelligently injects in a proxy to the actual HttpSession and this proxy knows how to internally delegate to the right session for the request.

też wynika, że w momencie tworzenia obiektu jeszcze jakbym nie miał dostępu do sesji.

Chciałem wpychać listę postów do sesji (chwilowo robie aplikacje bez bazy), żeby je zapamiętywać pomiędzy requestami, ale wychodzi na to, że nie ma takiej konieczności, bo mam do czynienia cały czas z tym samym obiektem oO.

Czy jak odpalam sobie SpringApplication.run(BlogMvcApplication.class, args); to spring wtedy ładuje moje beany i tworzy ich instancję (tak chyba się to nazywa w Springu), a później każdy request korzysta z tego co Spring sobie stworzył do czasu aż nie zatrzymam serwera?

Jak zrobie tak:

public List<Post> findLatest5() {
    System.out.println(this);
    return posts.stream()
            .sorted((a, b) -> b.getDate().compareTo(a.getDate()))
            .collect(Collectors.toList());
}

to odświeżając stronę dostaję za każdym razem ten sam adres

blog.services.PostServiceStubImpl@200da8ac
blog.services.PostServiceStubImpl@200da8ac

Czyli potwierdza to moje przypuszczenia.

Czyli jakby przeciwieństwo PHP, gdzie co request wszystko było tworzone nowe i to dopiero jak ktoś odpalił index.php wchodząc na moją stronę.

Aplikacje w Javie nie mają chyba takiego entry pointa, jak "index.php"?

1

Tbh nie rozumiem po co robisz aplikacje bez bazy, zawsze wydawało mi się to bardziej skomplikowane, pogmatwane niż po prostu włożenie bazy danych. Zrób sobie h2/mysql
A co do pytania to beany są singletonami, takimi nie dokońca w pełnym tego słowa znaczeniu ale na cały application context jest tworzony tylko jeden ( bo singleton polega na tym że masz jeden na classloader)
Co do tego "entry point" to chodzi ci o front controller? Spring-MVC to wersja front controller tego patternu, wszystko przez niego przechodzi.

2

Generalnie tak właśnie jest -> aplikacja po wystartowaniu ma pewne obiekty które żyją dopóki nie zabijesz aplikacji. Na przykład będą to kontrolery i singletony.

0

A to dla mnie nowość. W PHP sobie to żyło na czas requesta i do widzenia. No to się wyjaśniło, dzięki :)

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