W Spring framework, możemy tworzyć beany w 6 wbudowanych zakresach spring bean scopes, a także możemy zdefiniować własny zakres beanów. Z tych sześciu zakresów, cztery są dostępne tylko wtedy, gdy używasz web-aware ApplicationContext
singleton
i prototype
zakresy są dostępne w każdym typie kontenerów IOC.
Table of Contents1. Spring Bean Scope Types 1.1. singleton scope 1.2. prototype scope 1.3. request scope 1.4. session scope 1.5. application scope 1.6. websocket scope2. Custom thread scope3. Summary
Spring Bean Scopes Type
W Spring, zakres może być zdefiniowany za pomocą adnotacji spring bean @Scope. Wymieńmy szybko wszystkie sześć wbudowanych zakresów beanów dostępnych do użycia w kontekście aplikacji wiosennej. Te same zakresy odnoszą się również do zakresu beanów Spring Boot.
Scope | Description |
---|---|
singleton (domyślnie) |
Jedna instancja obiektu bean na kontener Spring IoC |
prototype |
Opposite to singleton, tworzy nową instancję za każdym razem, gdy fasola jest żądana. |
request |
Pojedyncza instancja będzie tworzona i dostępna podczas całego cyklu życia żądania HTTP.
Tylko ważne w web-aware Spring |
session |
Pojedyncza instancja zostanie utworzona i będzie dostępna podczas pełnego cyklu życia sesji HTTP.
Ważne tylko w web-aware Spring |
application |
Pojedyncza instancja zostanie utworzona i będzie dostępna podczas pełnego cyklu życia ServletContext .
Tylko ważne w web-aware Spring |
websocket |
Pojedyncza instancja zostanie utworzona i będzie dostępna podczas pełnego cyklu życia WebSocket .
Tylko ważne w web-aware Spring |
1.1. singleton scope
singleton
jest domyślnym zakresem beana w kontenerze Spring. Mówi on kontenerowi, aby tworzył i zarządzał tylko jedną instancją klasy bean, na kontener. Ta pojedyncza instancja jest przechowywana w pamięci podręcznej takich singletonowych fasolek, a wszystkie kolejne żądania i odwołania do tej nazwanej fasolki zwracają zbuforowaną instancję.
Przykładowy singleton scope bean przy użyciu konfiguracji Java –
Przykładowy singleton scope bean przy użyciu konfiguracji XML –
1.2. prototyp scope
prototype
scope skutkuje tworzeniem nowej instancji beana za każdym razem, gdy kod aplikacji zgłasza żądanie dotyczące beana.
Powinieneś wiedzieć, że metody cyklu życia fasoli destrukcyjnej nie są wywoływane prototype
scoped bean, wywoływane są tylko metody wywołania zwrotnego inicjalizacji. Tak więc jako deweloper, jesteś odpowiedzialny za wyczyszczenie instancji fasoli o domenie prototypowej i wszelkich zasobów, które przechowują.
Przykład konfiguracji java dla zakresu prototypu beana –
@Component@Scope("prototype")public class BeanClass {}
Przykład konfiguracji XML dla zakresu prototypu beana –
<bean class="com.howtodoinjava.BeanClass" scope="prototype" />
prototype
dla wszystkich stateful beanów i zakresu singleton
dla stateless beanów.RequestContextListener
lub RequestContextFilter
.1.3. zakres żądania
W zakresie request
kontener tworzy nową instancję dla każdego żądania HTTP. Jeśli więc serwer obsługuje 50 żądań, to kontener może posiadać co najwyżej 50 indywidualnych instancji klasy bean. Jakakolwiek zmiana stanu jednej instancji, nie będzie widoczna dla innych instancji. Instancje te są niszczone zaraz po zakończeniu żądania.
Przykład konfiguracji java zakresu request bean –
@Component@Scope("request")public class BeanClass {}//or@Component@RequestScopepublic class BeanClass {}
Przykład konfiguracji XML zakresu request bean –
<bean class="com.howtodoinjava.BeanClass" scope="request" />
Read More: Jak działają serwery WWW?
1.4. zakres sesji
W session
zakresie, kontener tworzy nową instancję dla każdej sesji HTTP. Jeśli więc serwer ma 20 aktywnych sesji, to kontener może mieć co najwyżej 20 indywidualnych instancji klasy bean. Wszystkie żądania HTTP w czasie trwania pojedynczej sesji będą miały dostęp do tej samej pojedynczej instancji beana w tym zakresie sesji.
Każda zmiana stanu jednej instancji, nie będzie widoczna dla innych instancji. Instancje te są niszczone, gdy tylko sesja zostanie zniszczona/ zakończona na serwerze.
Przykład konfiguracji java zakresu session bean –
@Component@Scope("session")public class BeanClass {}//or@Component@SessionScopepublic class BeanClass {}
Przykład konfiguracji XML zakresu session bean –
<bean class="com.howtodoinjava.BeanClass" scope="session" />
1.5. zakres aplikacji
W application
zakresie, kontener tworzy jedną instancję na runtime aplikacji internetowej. Jest on prawie podobny do singleton
scope, z dwoma tylko różnicami tj.
-
application
scoped bean jest singletonem naServletContext
, podczas gdysingleton
scoped bean jest singletonem naApplicationContext
. Należy pamiętać, że może istnieć wiele kontekstów aplikacji dla pojedynczej aplikacji. -
application
scoped bean jest widoczny jako atrybutServletContext
.
Java config przykład zakresu beana aplikacji –
@Component@Scope("application")public class BeanClass {}//or@Component@ApplicationScopepublic class BeanClass {}
XML config przykład zakresu beana aplikacji –
<bean class="com.howtodoinjava.BeanClass" scope="application" />
1.6. zakres websocket
Protokół WebSocket umożliwia dwukierunkową komunikację pomiędzy klientem a zdalnym hostem, który wyraził zgodę na komunikację z klientem. Protokół WebSocket zapewnia pojedyncze połączenie TCP dla ruchu w obu kierunkach. Jest to szczególnie przydatne w aplikacjach wieloużytkownikowych z jednoczesną edycją oraz w grach wieloużytkownikowych.
W tego typu aplikacjach internetowych protokół HTTP jest używany tylko do początkowego uścisku dłoni. Serwer może odpowiedzieć statusem HTTP 101 (przełączenie protokołów), jeśli zgadza się na żądanie handshake. Jeśli handshake się powiedzie, gniazdo TCP pozostaje otwarte i zarówno klient jak i serwer mogą używać go do wysyłania wiadomości do siebie nawzajem.
Przykład konfiguracji java z zakresu bean websocket –
@Component@Scope("websocket")public class BeanClass {}
Przykład konfiguracji XML z zakresu bean websocket –
<bean class="com.howtodoinjava.BeanClass" scope="websocket" />
Proszę zauważyć, że websocket
scoped beans są zazwyczaj singletonami i żyją dłużej niż jakakolwiek indywidualna sesja WebSocket.
Niestandardowy zakres wątku
Spring zapewnia również nie-domyślny thread
zakres używając klasy SimpleThreadScope
. Aby użyć tego zakresu, musisz zarejestrować go w kontenerze za pomocą klasy CustomScopeConfigurer
.
Każde żądanie dla fasoli zwróci tę samą instancję w tym samym wątku.
Przykład konfiguracji java zakresu wątku bean –
@Component@Scope("thread")public class BeanClass {}
Przykład konfiguracji XML zakresu wątku bean –
<bean class="com.howtodoinjava.BeanClass" scope="thread" />
Podsumowanie
Spring udostępnił sześć zakresów spring bean i instancje mają różny czas życia w każdym zakresie. Jako deweloper musimy mądrze wybrać zakres dowolnego beana zarządzanego przez kontener. Ponadto, musimy podejmować mądre decyzje, gdy fasolki o różnych zakresach odwołują się do siebie nawzajem.
Postaraj się zapamiętać wszystkie powyższe informacje, aby odpowiedzieć na każde pytanie na rozmowie kwalifikacyjnej dotyczące zakresu Spring Bean.
Happy Learning !!