Spring IoC контейнер: сканирование classpath, предоставление области действия для автоопределенных компонентов

Как и в случае с компонентами, управляемыми Spring в целом, по умолчанию и наиболее распространенной областью действия для автоматически обнаруживаемых компонентов является singleton. Однако иногда вам нужна другая область, которая может быть указана в аннотации @Scope. Вы можете указать имя области в аннотации, как показано в следующем примере:

Java

@Scope("prototype")
@Repository
public class MovieFinderImpl implements MovieFinder {
    // ...
}

Kotlin

@Scope("prototype")
@Repository
class MovieFinderImpl : MovieFinder {
    // ...
}

Аннотации @Scope используются только для конкретного класса компонентов (для аннотированных компонентов) или для фабричного метода (для методов @Bean). В отличие от определений bean-компонентов XML, понятие наследования определений bean отсутствует, и иерархии наследования на уровне класса не имеют значения для целей метаданных.

Как и в случае с предварительно созданными аннотациями для областей, вы также можете создавать свои собственные аннотации областей действия, используя подход мета-аннотации Spring: например, пользовательская аннотация, мета-аннотированная с помощью @Scope("prototype"), возможно, также объявляющая пользовательский режим scoped-proxy.

Чтобы предоставить собственную стратегию для разрешения области, а не полагаться на подход, основанный на аннотациях, вы можете реализовать интерфейс ScopeMetadataResolver. Не забудьте включить конструктор по умолчанию без аргументов. Затем вы можете указать полное имя класса при настройке сканера, как показано в следующем примере с аннотацией и определением компонента:

Java

@Configuration
@ComponentScan(basePackages = "org.example", scopeResolver = MyScopeResolver.class)
public class AppConfig {
    // ...
}

Kotlin

@Configuration
@ComponentScan(basePackages = ["org.example"], scopeResolver = MyScopeResolver::class)
class AppConfig {
    // ...
}

<beans>
    <context:component-scan base-package="org.example" scope-resolver="org.example.MyScopeResolver"/>
</beans>

При использовании определенных не-singleton областей может возникнуть необходимость в создании прокси для объектов с областью действия. Для этого в элементе component-scan доступен атрибут scoped-proxy. Три возможных значения: no, interfaces и targetClass. Например, следующая конфигурация приводит к стандартным динамическим прокси JDK:

Java

@Configuration
@ComponentScan(basePackages = "org.example", scopedProxy = ScopedProxyMode.INTERFACES)
public class AppConfig {
    // ...
}

Kotlin

@Configuration
@ComponentScan(basePackages = ["org.example"], scopedProxy = ScopedProxyMode.INTERFACES)
class AppConfig {
    // ...
}

<beans>
    <context:component-scan base-package="org.example" scoped-proxy="interfaces"/>
</beans>


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


Комментарии

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

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

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

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