Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Spring: Spring, @Lookup, prototype bean, singleton bean, dependency injection

Что делает аннотация @Lookup в Spring?

Вопрос проверяет понимание аннотации @Lookup в Spring, которая используется для внедрения прототипных бинов в синглтон-бины, чтобы избежать проблем с состоянием.

Короткий ответ

Аннотация @Lookup в Spring позволяет синглтон-бину получать новый экземпляр прототип-бина при каждом вызове метода. Это решает проблему, когда синглтон содержит состояние прототипа, которое должно быть уникальным для каждого использования. Spring создаёт подкласс, переопределяющий аннотированный метод, чтобы возвращать новый бин из контекста. Это полезно, когда прототип-бин имеет состояние, которое не должно разделяться между вызовами.

Длинный ответ

В Spring Framework аннотация @Lookup решает классическую проблему внедрения зависимостей: как синглтон-бин (который создаётся один раз) может каждый раз получать новый экземпляр прототип-бина (который создаётся при каждом запросе). Без @Lookup, если прототип-бин внедряется в синглтон через конструктор или поле, он будет инжектирован только один раз при создании синглтона, и синглтон будет всегда использовать один и тот же экземпляр, теряя преимущество прототипа.

Как работает @Lookup

Spring использует механизм CGLIB для создания подкласса того класса, где объявлен метод с @Lookup. При вызове этого метода Spring перехватывает его и возвращает новый бин из контекста приложения. Метод может быть абстрактным или иметь пустую реализацию — Spring предоставит реализацию.

Пример использования

Предположим, у нас есть прототип-бин PrototypeService, который содержит состояние (например, идентификатор сессии), и синглтон SingletonService, который должен использовать новый экземпляр PrototypeService при каждом вызове.

// Прототип-бин с областью видимости prototype
@Component
@Scope("prototype")
public class PrototypeService {
    private String sessionId;
    
    public PrototypeService() {
        this.sessionId = UUID.randomUUID().toString();
    }
    
    public String getSessionId() {
        return sessionId;
    }
}

// Синглтон-бин, использующий @Lookup
@Component
public class SingletonService {
    
    // Аннотированный метод: Spring обеспечит получение нового PrototypeService
    @Lookup
    public PrototypeService getPrototypeService() {
        return null; // Реализация будет предоставлена Spring
    }
    
    public void process() {
        PrototypeService ps = getPrototypeService();
        System.out.println("Используется PrototypeService с ID: " + ps.getSessionId());
        // При следующем вызове getPrototypeService() будет возвращён новый экземпляр
    }
}

Где применяется

  • Когда прототип-бин имеет состояние (например, данные пользовательской сессии, временные объекты).
  • В сценариях, где требуется ленивое создание бинов (бин создаётся только при вызове метода).
  • Для избежания циклических зависимостей, когда один синглтон зависит от другого, который тоже должен быть прототипом.

Вывод: Используйте @Lookup в Spring, когда синглтон-компонент должен каждый раз работать с новым экземпляром прототип-бина, особенно если этот прототип содержит изменяемое состояние, которое не должно разделяться между вызовами. Это чистое решение, которое сохраняет преимущества Spring DI без ручного доступа к ApplicationContext.

Уровень

  • Рейтинг:

    3

  • Сложность:

    6

Навыки

  • Spring

    Spring

Ключевые слова

#Spring

#@Lookup

#prototype bean

#singleton bean

#dependency injection

Подпишись на Java Developer в телеграм