Spring IoC контейнер: использование пользовательской области применения бинов
После того, как вы напишете и протестируете одну или несколько пользовательских реализаций Scope, вам необходимо сообщить контейнеру Spring о ваших новых областях. Следующий метод является основным методом регистрации нового Scope в контейнере Spring:
Java
void registerScope(String scopeName, Scope scope);
Kotlin
fun registerScope(scopeName: String, scope: Scope)
Этот метод объявлен в интерфейсе ConfigurableBeanFactory, который доступен через свойство BeanFactory в большинстве конкретных реализаций ApplicationContext, которые поставляются с Spring.
Первый аргумент метода registerScope(..) - это уникальное имя, связанное с областью действия. Примерами таких имен в самом контейнере Spring являются singleton и prototype. Второй аргумент метода registerScope(..) - это фактический экземпляр пользовательской реализации Scope, которую вы хотите зарегистрировать и использовать.
Предположим, что вы пишете свою собственную реализацию Scope, а затем регистрируете ее, как показано в следующем примере.
В следующем примере используется SimpleThreadScope, который включен в Spring, но не зарегистрирован по умолчанию. Инструкции будут такими же для ваших собственных реализаций Scope.
Java
Scope threadScope = new SimpleThreadScope();
beanFactory.registerScope("thread", threadScope);
Kotlin
val threadScope = SimpleThreadScope()
beanFactory.registerScope("thread", threadScope)
Затем вы можете создать определения bean-компонентов, которые соответствуют правилам области видимости вашего пользовательского Scope:
<bean id="..." class="..." scope="thread">
С пользовательской реализацией Scope вы не ограничены программной регистрацией области. Вы также можете декларативно выполнить регистрацию Scope, используя класс CustomScopeConfigurer, как показано в следующем примере:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
https://www.springframework.org/schema/aop/spring-aop.xsd">
<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
<property name="scopes">
<map>
<entry key="thread">
<bean class="org.springframework.context.support.SimpleThreadScope"/>
</entry>
</map>
</property>
</bean>
<bean id="thing2" class="x.y.Thing2" scope="thread">
<property name="name" value="Rick"/>
<aop:scoped-proxy/>
</bean>
<bean id="thing1" class="x.y.Thing1">
<property name="thing2" ref="thing2"/>
</bean>
</beans>
Когда вы помещаете <aop:scoped-proxy/> в реализацию FactoryBean, это область действия самого фабричного компонента, а не объект, возвращаемый из getObject().
Читайте также:
- Spring IoC контейнер: области применения бинов
- Spring IoC контейнер: области применения бинов, синглтон
- Spring IoC контейнер: области применения бинов, прототип (prototype)
- Spring IoC контейнер: области применения бинов - Request, Session, Application и WebSocket
- Spring IoC контейнер: области применения бинов, бины с областями применения как зависимости
- Spring IoC контейнер: пользовательские области применения бинов
Комментарии
Отправить комментарий