2013-03-15 10 views
11

Mam problem do rozwiązania: 1) nasz projekt korzysta z metody Spring JavaConfig (więc nie ma plików xml) 2) Potrzebuję utworzyć niestandardowy zakres, przykład w formacie xml wygląda tak :Wiosna JavaConfig, niestandardowe zakresy i adnotacje dla fasoli

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

wyobraziłem go z JavaConfig będzie to wygląda mniej więcej tak:

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

Popraw mi, f Myliłem się z moim założeniem.

3) muszę opisywać moją klasę coś jako @Component (zakres = „workflow”) ponownie xml konfiguracja będzie wyglądać następująco:

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

Więc w zasadzie pytanie - mam rację z moim założenie użycia @Component (scope = "workflow") lub oczekuje się, że będzie w jakiś inny sposób?

Dzięki

+0

Właśnie dostałem ostrzeżenie 'metody @Bean getWorkflowScope jest niestatyczny i zwraca obiekt przypisany do interfejsu Springa BeanFactoryPostProcessor. Spowoduje to niepowodzenie w przetwarzaniu adnotacji, takich jak @Aewowised, @Resource i @PostConstruct w deklarującej metodę klasie @Configuration. Dodaj "statyczny" modyfikator do tej metody, aby uniknąć problemów związanych z cyklem życiowym kontenera. Tylko dla FYI, Twoja metoda powinna odczytywać '@' Bean public ** static ** CustomScopeConfigurer –

Odpowiedz

8

Trzeba użyć adnotacji @Scope. Tak:

@Scope("workflow") 

Możliwe jest również, aby utworzyć niestandardowy zakres kwalifikator:

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

i używać go w ten sposób:

@Component 
@WorkflowScoped 
class SomeBean 
+0

Aby dodać do tego, ponieważ oryginalne pytanie używa AWS Simple Workflow który generuje te klasy za pomocą AspectJ, używałbyś '@ Bean' i' @Sope ("workflow") '/' @ WorkflowScoped' w klasie konfiguracji. – mkobit

Powiązane problemy