spring
Enregistrement de haricot conditionnel au printemps
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: UnBeanFactoryPostProcessor
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")