Spring JavaConfig, bean настраиваемые области и аннотации
У меня проблема:
1) наш проект использует Spring подход JavaConfig (поэтому нет xml файлов)
2) Мне нужно создать собственную область видимости, пример в xml выглядит следующим образом:
<bean class="org.springframework.beans.factory.config.CustomScopeConfigurer">
<property name="scopes">
<map>
<entry key="workflow">
<bean
class="com.amazonaws.services.simpleworkflow.flow.spring.WorkflowScope" />
</entry>
</map>
</property>
Я понял это с помощью JavaConfig, это будет выглядеть примерно так:
@Bean
public CustomScopeConfigurer customScope () {
CustomScopeConfigurer configurer = new CustomScopeConfigurer ();
Map<String, Object> workflowScope = new HashMap<String, Object>();
workflowScope.put("workflow", new WorkflowScope ());
configurer.setScopes(workflowScope);
return configurer;
}
Исправьте меня, если я ошибаюсь в своем предположении.
3) Мне нужно аннотировать мой класс как @Component (scope = "workflow" )
снова xml-конфигурация будет выглядеть так:
<bean id="activitiesClient" class="aws.flow.sample.MyActivitiesClientImpl" scope="workflow"/>
Итак, в основном вопрос: правильно ли я с моим предположением использовать @Component (scope = "workflow" ), или ожидается, что он будет каким-то другим способом?
Спасибо
Ответы
Ответ 1
Вам нужно использовать аннотацию @Scope
. Вот так:
@Scope("workflow")
Также возможно создать собственный спецификатор области видимости:
@Qualifier
@Scope("workflow")
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface WorkflowScoped {
}
и использовать его следующим образом:
@Component
@WorkflowScoped
class SomeBean
Ответ 2
Я столкнулся с похожей ситуацией в моем проекте, см. здесь.
По сути, вы должны передать экземпляр класса WorkflowScope
в качестве аргумента в методе customScope()
и использовать его; в противном случае это не сработает:
@Bean
public CustomScopeConfigurer customScope(WorkflowScope workflowScope) {
CustomScopeConfigurer configurer = new CustomScopeConfigurer();
Map<String, Object> workflowScope = new HashMap<>();
workflowScope.put("workflow", workflowScope);
configurer.setScopes(workflowScope);
return configurer;
}