Ricerca…


Osservazioni

Punto importante da notare durante l'utilizzo della condizione

  • La classe condizione viene indicata come classe diretta (non come bean di primavera), quindi non può utilizzare l'iniezione di proprietà @Value , ovvero non è possibile iniettare altri bean a molla al suo interno.
  • Da java docs: le condizioni devono seguire le stesse restrizioni di BeanFactoryPostProcessor e fare attenzione a non interagire mai con le istanze di bean . Le restrizioni qui BeanFactoryPostProcessor sono: A BeanFactoryPostProcessor può interagire con e modificare le definizioni di bean, ma mai istanze bean. Ciò potrebbe causare un'anticipazione dei fagioli prematura, violando il contenitore e causando effetti collaterali indesiderati.

Registra i bean solo quando viene specificata una proprietà o un valore

Un bean spring può essere configurato in modo tale che si registri solo se ha un valore particolare o se viene soddisfatta una proprietà specificata. Per fare ciò, implementa Condition.matches per verificare la proprietà / il valore:

public class PropertyCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return context.getEnvironment().getProperty("propertyName") != null;
        // optionally check the property value
    }
}

Nella configurazione di Java, utilizzare l'implementazione di cui sopra come condizione per registrare il bean. Nota l'uso dell'annotazione Condizionale .

@Configuration
public class MyAppConfig {

    @Bean
    @Conditional(PropertyCondition.class)
    public MyBean myBean() {
      return new MyBean();
    }
}

In PropertyCondition , è possibile valutare qualsiasi numero di condizioni. Tuttavia, si consiglia di separare l'implementazione per ogni condizione per mantenerli accoppiati liberamente. Per esempio:

@Configuration
public class MyAppConfig {

    @Bean
    @Conditional({PropertyCondition.class, SomeOtherCondition.class})
    public MyBean myBean() {
      return new MyBean();
    }
}

Annotazioni di condizione

Eccetto l'annotazione principale @conditional ci sono serie di annotazioni simili da utilizzare per casi diversi.

Condizioni di classe

Le annotazioni @ConditionalOnClass e @ConditionalOnMissingClass consentono di includere la configurazione in base alla presenza o all'assenza di classi specifiche.

Ad esempio, quando OObjectDatabaseTx.class viene aggiunto alle dipendenze e non vi è alcun bean OrientWebConfigurer , viene creato il configuratore.

@Bean
@ConditionalOnWebApplication
@ConditionalOnClass(OObjectDatabaseTx.class)
@ConditionalOnMissingBean(OrientWebConfigurer.class)
public OrientWebConfigurer orientWebConfigurer() {
    return new OrientWebConfigurer();
}

Condizioni di fagioli

Le annotazioni @ConditionalOnBean e @ConditionalOnMissingBean consentono di @ConditionalOnMissingBean un bean in base alla presenza o all'assenza di bean specifici. È possibile utilizzare l'attributo value per specificare i bean in base al tipo o al nome per specificare i bean in base al nome. L'attributo di ricerca consente di limitare la gerarchia di ApplicationContext che deve essere considerata durante la ricerca di bean.

Vedere l'esempio sopra quando controlliamo se non ci sono bean definiti.

Condizioni della proprietà

L'annotazione @ConditionalOnProperty consente di includere la configurazione in base a una proprietà Spring Environment. Utilizzare il prefisso e gli attributi del nome per specificare la proprietà da verificare. Per impostazione predefinita, qualsiasi proprietà esistente e non uguale a false verrà confrontata. È inoltre possibile creare verifiche più avanzate utilizzando gli attributi havingValue e matchIfMissing .

@ConditionalOnProperty(value='somebean.enabled', matchIfMissing = true, havingValue="yes")
@Bean 
public SomeBean someBean(){
}

Condizioni delle risorse

L'annotazione @ConditionalOnResource consente di includere la configurazione solo quando è presente una risorsa specifica.

@ConditionalOnResource(resources = "classpath:init-db.sql") 

Condizioni dell'applicazione Web

Le annotazioni @ConditionalOnWebApplication e @ConditionalOnNotWebApplication consentono di includere la configurazione a seconda che l'applicazione sia una 'applicazione Web'.

@Configuration
@ConditionalOnWebApplication
public class MyWebMvcAutoConfiguration {...}

Condizioni di espressione SpEL

L'annotazione @ConditionalOnExpression consente di includere la configurazione in base al risultato di un'espressione SpEL.

@ConditionalOnExpression("${rest.security.enabled}==false")


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow