Spring IoC контейнер: Java конфигурация, указание Scope бинов

Spring включает аннотацию @Scope, так что вы можете указать область действия компонента с помощью нее.

Использование аннотации @Scope

Вы можете указать, что ваши bean-компоненты, определенные с аннотацией @Bean, должны иметь определенную область действия. Вы можете использовать любую из стандартных областей, указанных в посте области действия bean.

Область по умолчанию - singleton, но вы можете переопределить это с помощью аннотации @Scope, как показано в следующем примере:

Java

@Configuration
public class MyConfiguration {

    @Bean
    @Scope("prototype")
    public Encryptor encryptor() {
        // ...
    }
}

Kotlin

@Configuration
class MyConfiguration {

    @Bean
    @Scope("prototype")
    fun encryptor(): Encryptor {
        // ...
    }
}

@Scope и scoped-proxy

Spring предлагает удобный способ работы с зависимостями в пределах области с помощью прокси-объектов. Самый простой способ создать такой прокси при использовании конфигурации XML - это элемент <aop:scoped-proxy/>. Конфигурирование ваших bean-компонентов в Java с аннотацией @Scope предлагает эквивалентную поддержку с атрибутом proxyMode. По умолчанию прокси отсутствует (ScopedProxyMode.NO), но вы можете указать ScopedProxyMode.TARGET_CLASS или ScopedProxyMode.INTERFACES.

Если вы перенесете пример прокси-сервера с областью действия из справочной документации XML на наш @Bean с использованием Java, это будет похоже на следующее:

Java

// bean-объект в HTTP Session-области, 
// предоставляемый в качестве прокси
@Bean
@SessionScope
public UserPreferences userPreferences() {
    return new UserPreferences();
}

@Bean
public Service userService() {
    UserService service = new SimpleUserService();
    // ссылка на проксируемый компонент userPreferences
    service.setUserPreferences(userPreferences());
    return service;
}

Kotlin

// bean-объект в HTTP Session-области, 
// предоставляемый в качестве прокси
@Bean
@SessionScope
fun userPreferences() = UserPreferences()

@Bean
fun userService(): Service {
    return SimpleUserService().apply {
        // ссылка на проксируемый компонент userPreferences
        setUserPreferences(userPreferences()
    }
}


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки