2013-03-15 16 views
11

ho un problema da risolvere: 1) il nostro progetto sta usando approccio Primavera JavaConfig (in modo che nessun file XML) 2) ho bisogno di creare ambito personalizzato, ad esempio in XML assomiglia a questo :Primavera JavaConfig, fagioli di ambiti personalizzati e annotazioni

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

ho capito con JavaConfig lo farà simile a questa:

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

Correggetemi i f Ho sbagliato con la mia ipotesi.

3) Ho bisogno di annotare la mia classe qualcosa di @Component (portata = "workflow") configurazione di nuovo xml sarebbe simile a questa:

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

Quindi, fondamentalmente la domanda è - dico bene con la mia ipotesi di usare @Component (scope = "workflow") o dovrebbe essere in qualche altro modo?

Grazie

+0

Ho appena ricevuto l'avviso 'metodo @Bean getWorkflowScope è non statico e restituisce un oggetto assegnabile all'interfaccia di Spring BeanFactoryPostProcessor. Ciò si tradurrà in un errore nell'elaborazione di annotazioni come @Autowired, @Resource e @PostConstruct all'interno della dichiarazione del metodo che dichiara la classe @Configuration. Aggiungi il modificatore 'statico' a questo metodo per evitare questi problemi del ciclo di vita del contenitore. Solo FYI, il tuo metodo dovrebbe leggere '@' Bean public ** static ** CustomScopeConfigurer –

risposta

8

è necessario utilizzare l'annotazione @Scope. Come questo:

@Scope("workflow") 

E 'anche possibile creare ambito personalizzato di qualificazione:

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

e usarlo in questo modo:

@Component 
@WorkflowScoped 
class SomeBean 
+0

Da aggiungere a questo, poiché la domanda originale sta usando AWS Simple Workflow che genera quelle classi usando AspectJ, dovresti usare '@ Bean' e' @Scope ("workflow") '/' @ WorkflowScoped' in una classe di configurazione. – mkobit

Problemi correlati