2013-03-15 3 views
11

У меня проблема: 1) наш проект использует Spring JavaConfig (так что нет xml-файлов) 2) Мне нужно создать собственную область видимости, пример в xml выглядит так: :Spring JavaConfig, пользовательские области и аннотации bean

<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; 
} 

Поправьте меня, я f Я ошибаюсь в своем предположении.

3) Мне нужно, чтобы комментировать мой класс что-то как @Component (ТЗ = «рабочий процесс») снова XML конфигурация будет выглядеть следующим образом:

<bean id="activitiesClient" class="aws.flow.sample.MyActivitiesClientImpl" scope="workflow"/> 

Так в основном вопрос - я прав с моим предположение использовать @Component (scope = "workflow") или ожидается, что он будет каким-то другим способом?

Благодаря

+0

Я только что получил предупреждение '@Bean метод getWorkflowScope является нестатический и возвращает объект, назначаемый интерфейсу BeanFactoryPostProcessor Spring. Это приведет к сбою обработки аннотаций, таких как @Autowired, @Resource и @PostConstruct в классе объявления @Configuration. Добавьте «статический» модификатор к этому методу, чтобы избежать проблем с жизненным циклом контейнера. «Просто FYI, ваш метод должен читать' @ 'Bean public ** static ** CustomScopeConfigurer –

ответ

8

Вы должны использовать аннотацию @Scope. Как это:

@Scope("workflow") 

Также можно создавать собственные квалификатор области:

@Qualifier 
@Scope("workflow") 
@Target({ ElementType.TYPE, ElementType.METHOD }) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface WorkflowScoped { 
} 

и использовать его таким образом:

@Component 
@WorkflowScoped 
class SomeBean 
+0

Чтобы добавить это, поскольку исходный вопрос использует AWS Simple Workflow который генерирует эти классы с использованием AspectJ, вы должны использовать '@ Bean' и' @Scope ("workflow") '/' @ WorkflowScoped' в классе конфигурации. – mkobit

Смежные вопросы