2014-04-25 10 views
5

Spring 4 ha due nuove annotazioni @Condition e @ConfigurationConditon per controllare se un bean viene aggiunto al contesto dell'applicazione Spring. JavaDoc non fornisce abbastanza contesto/quadro generale per comprendere i casi d'uso di @ConfigurationCondition.Quando utilizzare Spring @ConfigurationCondition vs @Condition?

Quando utilizzare @ConfigurationCondition rispetto a @Condition?

public interface ConfigurationCondition extends Condition { 

    /** 
    * Returns the {@link ConfigurationPhase} in which the condition should be evaluated. 
    */ 
    ConfigurationPhase getConfigurationPhase(); 

    /** 
    * The various configuration phases where the condition could be evaluated. 
    */ 
    public static enum ConfigurationPhase { 

     /** 
     * The {@link Condition} should be evaluated as a {@code @Configuration} class is 
     * being parsed. 
     * 
     * <p>If the condition does not match at this point the {@code @Configuration} 
     * class will not be added. 
     */ 
     PARSE_CONFIGURATION, 

     /** 
     * The {@link Condition} should be evaluated when adding a regular (non 
     * {@code @Configuration}) bean. The condition will not prevent 
     * {@code @Configuration} classes from being added. 
     * 
     * <p>At the time that the condition is evaluated all {@code @Configuration}s 
     * will have been parsed. 
     */ 
     REGISTER_BEAN 
    } 

} 

risposta

5

ConfigurationCondition è una specializzazione di Condition per @Configuration classi.

Plain Condition va bene per il 99% dei casi di utilizzo, quindi è necessario considerare che prima. La specializzazione riguarda in particolare la determinazione della fase dell'elaborazione delle classi @Configuration e la condizione deve essere valutata.

Ci sono due fasi:

  • PARSE_CONFIGURATION valuta la condizione in cui la classe -annotated @Configuration viene analizzato. Ciò offre la possibilità di escludere completamente la classe di configurazione
  • REGISTER_BEAN valuta la condizione quando un bean da una classe di configurazione è registrato. Ciò non impedisce la classe di configurazione da aggiungere ma consente di saltare una definizione bean se la condizione non corrispondere (come definito dal metodo dell'interfaccia Conditionmatches)

Spring avvio ha un OnBeanCondition che fondamentalmente controlli durante la fase di registrazione se è presente un altro bean. Questo è il cuore di ConditionalOnBean che fondamentalmente fa qualcosa quando un fagiolo è presente

+0

Potresti approfondire il significato delle due diverse fasi. Queste fasi sono diverse dalle fasi del ciclo di vita dell'inizializzazione del bean in cui vengono eseguiti i diversi post processor? – ams

+0

ha aggiornato la mia risposta. –

2

ci sono @ConfigurationCondition o @Condition annotazioni, ma solo @Conditional. Per @Conditional è possibile specificare uno Condition o uno ConfigurationCondition.

@Conditional determina se una classe @Configuration deve essere abilitata o disabilitata in base a una condizione. Siccome lo documentation says l'esempio migliore è l'annotazione @Profile, che determina quali bean vengono caricati o meno in base ai profili scelti.

Le due fasi considerate da ConfigurationCondition sono quelle passate da una classe @Configuration: prima viene analizzata la classe e quindi i bean vengono registrati e creati.

+0

enfasi su una "Condizione O una Condizione di configurazione" – Selwyn

Problemi correlati