Spring Bean Scope | 5 Major Types of Scope in Spring
Bądź na bieżąco z najnowszymi trendami technologicznymi
Join DataFlair on Telegram!!
Cel
W poprzednim artykule poznaliśmy definicję Spring Bean. Dzisiaj zapoznamy się z zakresem Spring Bean. Ponadto, omówimy różne rodzaje zakresów w Spring Bean. Każdy z zakresów zostanie zdefiniowany na przykładach roboczych przy użyciu Eclipse IDE. Dodatkowo dowiemy się, kiedy używać singletonu i prototypu zakresu w Spring Framework.
Zacznijmy więc od Spring Bean Scope.
Spring Bean Scope | 5 Major Types of Scope in Spring
Spring Bean Scope
Jak wiadomo zakres Spring bean definiuje cykl życia i widoczność beana w kontekstach, w których jest on używany. Podczas definiowania fasoli <bean> masz możliwość zadeklarowania zakresu tej konkretnej fasoli Spring.
Poznajmy zalety Spring Framework i ograniczenia
Typy zakresu w Spring Bean
Springham posiada pięć typów zakresu, które obsługuje. Są to następujące typy:
a. Singleton Scope w Spring
Jeśli zakres Spring Bean jest singleton to kontener Spring IoC definiuje tylko jedną instancję obiektu. Ta instancja jest przechowywana w pamięci podręcznej fasoli singletonowej. Również wszystkie żądania dla tej nazwy zwrócą tę samą instancję, która jest buforowana. Wraz z tym, wszelkie modyfikacje dokonane w tej instancji zostaną odzwierciedlone we wszystkich odwołaniach do fasoli Spring.
Utwórzmy encję Osoba w następujący sposób:
public class Person { private String name; // standard constructor, getters and setters}
Spring Beans z zakresem singleton:
@Bean@Scope("singleton")public Person personSingleton() { return new Person();}
Czy znasz najnowszy trend Job Roles and Salary w Spring Framework
Możesz również zobaczyć dwa obiekty odwołujące się do tych samych beanów z tymi samymi wartościami:
private static final String NAME = "Sam";@Testpublic void givenSingletonScope_whenSetName_thenEqualNames() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("scopes.xml"); Person personSingletonA = (Person) applicationContext.getBean("personSingleton"); Person personSingletonB = (Person) applicationContext.getBean("personSingleton"); personSingletonA.setName(NAME); Assert.assertEquals(NAME, personSingletonB.getName()); ((AbstractApplicationContext) applicationContext).close();}
Zakresy.xml jest następujący:
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean class="org.example.scopes.Person" scope="singleton"/></beans>
b. Prototype Scope in Spring
To spowoduje, że definicja beana będzie miała dowolną ilość instancji obiektów. Będzie to zwracać różne instancje za każdym razem, gdy żądanie przyjdzie z kontenera IoC.
Przeczytaj o Spring Java Based Configuration – How to Configure Spring Beans
Prototyp jest ustawiony na adnotację @Scope w definicji beana:
@Bean@Scope("prototype")public Person personPrototype() { return new Person();}
Zobaczysz ten sam test, który jest wykonywany dla zakresu Spring Singleton, który jest dwoma obiektami żądającymi tej samej nazwy beana:
private static final String NAME = "Sam";private static final String NAME_OTHER = "Hari";@Testpublic void givenPrototypeScope_whenSetNames_thenDifferentNames() { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("scopes.xml"); Person personPrototypeA = (Person) applicationContext.getBean("personPrototype"); Person personPrototypeB = (Person) applicationContext.getBean("personPrototype"); personPrototypeA.setName(NAME); personPrototypeB.setName(NAME_OTHER); Assert.assertEquals(NAME, personPrototypeA.getName()); Assert.assertEquals(NAME_OTHER, personPrototypeB.getName()); ((AbstractApplicationContext) applicationContext).close();}
Zakres.xml jest zdefiniowany jako:
<bean class="org.example.scopes.Person" scope="prototype"/>
c. Zakres żądania w Spring
To żądanie będzie zakresem definicji beana do żądania HTPP. Jest to możliwe tylko w kontekście web-aware Spring Application. Zdefiniujesz bean z zakresem żądania pod adnotacją @Scope:
@Bean@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)public HelloMessageGenerator requestMessage() { return new HelloMessageGenerator();}
Atrybut proxyMode jest potrzebny, ponieważ podczas instancjonowania kontekstu aplikacji webowej, nie ma aktywnego żądania. Spring Framework utworzy proxy dla wstrzyknięcia jako zależność.
Następnie należy zdefiniować kontroler, który ma odniesienie do requestMessage bean. W tym celu musisz uzyskać dostęp do tego samego żądania więcej niż raz, aby przetestować zakresy specyficzne dla sieci.
@Controllerpublic class ScopesController { @Resource(name = "requestMessage") HelloMessageGenerator requestMessage; @RequestMapping("/scopes") public String getScopes(Model model) { requestMessage.setMessage("Good morning!"); model.addAttribute("requestMessage", requestMessage.getMessage()); return "scopesExample"; }}
d. Zakres sesji w Springu
W ten sam sposób można zdefiniować fasolę w ramach zakresu sesji jako:
@Bean@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)public HelloMessageGenerator sessionMessage() { return new HelloMessageGenerator();}
W ten sam sposób definiuje się kontroler z referencją do beana sessionMessage. W tym celu należy uruchomić dwa żądania tak, aby pokazać, że wartość pola komunikatu jest taka sama dla sesji.
Zobacz Spring Transaction Management – Types and Methods
@Controllerpublic class ScopesController { @Resource(name = "sessionMessage") HelloMessageGenerator sessionMessage; @RequestMapping("/scopes") public String getScopes(Model model) { sessionMessage.setMessage("Hello there!"); model.addAttribute("sessionMessage", sessionMessage.getMessage()); return "scopesExample"; }}
e. Global Session Scope in Spring
Ten typ określa zakres definicji beana do globalnej sesji HTTP i jest ważny tylko dla web-aware Application context of Spring. Ten typ jest używany w aplikacjach kontenera portletów, gdzie każdy portlet posiada swoją sesję. Teraz zobaczysz fasolę z zakresem globalSession pod adnotacją @Scope:
@Bean@Scope(value = WebApplicationContext.SCOPE_GLOBAL_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)public HelloMessageGenerator globalSessionMessage() {return new HelloMessageGenerator();}
Więc, to było wszystko o Spring Bean Scope Tutorial. Mamy nadzieję, że spodobało Ci się nasze wyjaśnienie.
Podsumowanie
W tej sesji zobaczyliśmy, czym jest Spring Bean Scope i jak definiować zakresy fasoli. Dodatkowo, omówiliśmy różne typy zakresów w Spring Bean. Zobaczyliśmy również każdy z typów zakresów zdefiniowanych oddzielnie z przykładami przy użyciu Eclipse IDE. Ponadto, jeśli masz jakieś pytania dotyczące Spring Bean Zakres, nie krępuj się zapytać w sekcji komentarzy.
Powiązany temat- Integracja MVC z Spring
Dla odniesienia