В Spring Framework область видимости (scope) бина определяет его жизненный цикл и контекст, в котором он существует. Spring предоставляет несколько стандартных областей видимости, каждая из которых подходит для разных сценариев использования. Давайте рассмотрим каждую из них.
Singleton — это область видимости по умолчанию в Spring. Бин с этой областью видимости создается один раз за время жизни контекста приложения, и один и тот же экземпляр возвращается при каждом запросе этого бина.
@Component
@Scope("singleton")
public class SingletonBean {
public SingletonBean() {
System.out.println("SingletonBean создан");
}
}
Prototype — это область видимости, при которой каждый запрос к бину создает новый экземпляр.
@Component
@Scope("prototype")
public class PrototypeBean {
public PrototypeBean() {
System.out.println("PrototypeBean создан");
}
}
Request — это область видимости, при которой бин создается для каждого HTTP-запроса. Эта область видимости используется в веб-приложениях.
@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class RequestBean {
public RequestBean() {
System.out.println("RequestBean создан");
}
}
Session — это область видимости, при которой бин создается для каждой HTTP-сессии. Эта область видимости также используется в веб-приложениях.
@Component
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class SessionBean {
public SessionBean() {
System.out.println("SessionBean создан");
}
}
Application — это область видимости, при которой бин создается один раз на все приложение. Это похоже на Singleton, но бин доступен в контексте ServletContext.
@Component
@Scope(value = WebApplicationContext.SCOPE_APPLICATION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class ApplicationBean {
public ApplicationBean() {
System.out.println("ApplicationBean создан");
}
}
WebSocket — это область видимости, при которой бин создается для каждого WebSocket-сеанса. Эта область видимости используется в приложениях, работающих с WebSocket.
@Component
@Scope(value = "websocket", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class WebSocketBean {
public WebSocketBean() {
System.out.println("WebSocketBean создан");
}
}
Spring также позволяет создавать пользовательские области видимости, если стандартные не подходят для ваших нужд. Для этого нужно реализовать интерфейс Scope
и зарегистрировать его в контексте.
public class CustomScope implements Scope {
@Override
public Object get(String name, ObjectFactory<?> objectFactory) {
// Логика получения бина
}
@Override
public Object remove(String name) {
// Логика удаления бина
}
@Override
public void registerDestructionCallback(String name, Runnable callback) {
// Логика регистрации callback
}
@Override
public Object resolveContextualObject(String key) {
// Логика разрешения контекстного объекта
}
@Override
public String getConversationId() {
// Логика получения идентификатора контекста
}
}
Выбор области видимости зависит от требований вашего приложения. Правильное использование областей видимости помогает управлять жизненным циклом бинов и оптимизировать использование ресурсов.