Recherche…


Remarques

Point important à noter lors de l'utilisation de la condition

  • La classe de condition est appelée classe directe (pas comme haricot printanier), elle ne peut donc pas utiliser l'injection de propriété @Value , c'est-à-dire qu'aucun autre haricot de printemps ne peut y être injecté.
  • À partir de documents Java - Les conditions doivent respecter les mêmes restrictions que BeanFactoryPostProcessor et veiller à ne jamais interagir avec les instances du bean . Les restrictions mentionnées ici sont les suivantes: Un BeanFactoryPostProcessor peut interagir avec et modifier les définitions de bean, mais jamais les instances de bean. Cela pourrait provoquer une instanciation prématurée du haricot, violer le contenant et entraîner des effets secondaires imprévus.

Enregistrer les haricots uniquement lorsqu'une propriété ou une valeur est spécifiée

Un haricot de printemps peut être configuré de manière à ce qu'il ne soit enregistré que s'il possède une valeur particulière ou si une propriété spécifiée est remplie. Pour ce faire, implémentez Condition.matches pour vérifier la propriété / valeur:

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

Dans la configuration Java, utilisez l'implémentation ci-dessus comme condition pour enregistrer le bean. Notez l'utilisation de l'annotation @Conditional .

@Configuration
public class MyAppConfig {

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

Dans PropertyCondition , vous pouvez évaluer n'importe quel nombre de conditions. Cependant, il est conseillé de séparer la mise en œuvre pour chaque condition afin de ne pas les coupler librement. Par exemple:

@Configuration
public class MyAppConfig {

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

Annotations de condition

À l' @conditional annotation @conditional principale, des annotations similaires peuvent être utilisées pour différents cas.

Conditions de classe

Les annotations @ConditionalOnClass et @ConditionalOnMissingClass permettent d'inclure la configuration en fonction de la présence ou de l'absence de classes spécifiques.

Par exemple, lorsque OObjectDatabaseTx.class est ajouté aux dépendances et qu'il n'y a pas de bean OrientWebConfigurer nous créons le configurateur.

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

Conditions de haricots

Les annotations @ConditionalOnBean et @ConditionalOnMissingBean permettent d' @ConditionalOnMissingBean un bean en fonction de la présence ou de l'absence de beans spécifiques. Vous pouvez utiliser l'attribut value pour spécifier les beans par type ou name pour spécifier les beans par nom. L'attribut de recherche vous permet de limiter la hiérarchie ApplicationContext prendre en compte lors de la recherche de beans.

Voir l'exemple ci-dessus lorsque nous vérifions s'il n'y a pas de bean défini.

Conditions de propriété

L'annotation @ConditionalOnProperty permet d'inclure la configuration en fonction d'une propriété Spring Environment. Utilisez les attributs prefix et name pour spécifier la propriété à vérifier. Par défaut, toute propriété qui existe et n'est pas égale à false sera mise en correspondance. Vous pouvez également créer des vérifications plus avancées à l'aide des havingValue et matchIfMissing .

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

Conditions de ressources

L'annotation @ConditionalOnResource permet d'inclure la configuration uniquement lorsqu'une ressource spécifique est présente.

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

Conditions d'application Web

Les annotations @ConditionalOnWebApplication et @ConditionalOnNotWebApplication permettent d'inclure la configuration selon que l'application est une "application Web".

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

Conditions d'expression de SpEL

L'annotation @ConditionalOnExpression permet d'inclure la configuration en fonction du résultat d'une expression SpEL.

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


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow