Zoeken…


Opmerkingen

Belangrijk punt om op te merken tijdens het gebruik van de staat

  • De conditieklasse wordt aangeduid als directe klasse (niet als @Value ), dus deze kan de injectie met de eigenschap @Value niet gebruiken. Er kunnen dus geen andere @Value in worden geïnjecteerd.
  • Van Java-docs - Voorwaarden moeten dezelfde beperkingen volgen als BeanFactoryPostProcessor en zorg ervoor dat u nooit interactie hebt met BeanFactoryPostProcessor . De beperkingen BeanFactoryPostProcessor hier wordt verwezen, zijn A BeanFactoryPostProcessor kan de BeanFactoryPostProcessor beïnvloeden en wijzigen, maar nooit BeanFactoryPostProcessor . Als u dit wel doet, kan dit leiden tot voortijdige instantiatie van de bonen, het schenden van de container en onbedoelde bijwerkingen veroorzaken.

Registreer bonen alleen wanneer een eigenschap of waarde is opgegeven

Een spring bean kan zodanig worden geconfigureerd dat deze alleen wordt geregistreerd als deze een bepaalde waarde heeft of als aan een bepaalde eigenschap wordt voldaan. Voer hiertoe Condition.matches om de eigenschap / waarde te controleren:

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

Gebruik in Java-configuratie de bovenstaande implementatie als voorwaarde om de bean te registreren. Let op het gebruik van @Conditional annotation.

@Configuration
public class MyAppConfig {

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

In PropertyCondition kan een willekeurig aantal voorwaarden worden geëvalueerd. Het wordt echter geadviseerd om de implementatie voor elke voorwaarde te scheiden om ze losjes gekoppeld te houden. Bijvoorbeeld:

@Configuration
public class MyAppConfig {

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

Annotaties van de staat

Behalve main @conditional annotation zijn er vergelijkbare annotaties die voor verschillende gevallen kunnen worden gebruikt.

Klasse voorwaarden

Met de annotaties @ConditionalOnClass en @ConditionalOnMissingClass kan configuratie worden opgenomen op basis van de aanwezigheid of afwezigheid van specifieke klassen.

Wanneer bijvoorbeeld OObjectDatabaseTx.class wordt toegevoegd aan afhankelijkheden en er geen OrientWebConfigurer bean is, maken we de configurator.

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

Boon voorwaarden

Met de annotaties @ConditionalOnBean en @ConditionalOnMissingBean kan een boon worden opgenomen op basis van de aanwezigheid of afwezigheid van specifieke bonen. U kunt het waardekenmerk gebruiken om bonen op type te specificeren, of naam om bonen op naam te specificeren. Met het zoekkenmerk kunt u de ApplicationContext hiërarchie beperken waarmee rekening moet worden gehouden bij het zoeken naar bonen.

Zie het bovenstaande voorbeeld wanneer we controleren of er geen gedefinieerde boon is.

Eigendomsvoorwaarden

Met de annotatie @ConditionalOnProperty kan configuratie worden opgenomen op basis van een eigenschap Spring Environment. Gebruik het voorvoegsel en de naamkenmerken om de eigenschap aan te geven die moet worden gecontroleerd. Standaard wordt elke eigenschap die bestaat en niet gelijk is aan false , gematcht. U kunt ook geavanceerdere controles maken met behulp van de havingValue en matchIfMissing .

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

Bronvoorwaarden

Met de annotatie @ConditionalOnResource kan configuratie alleen worden opgenomen wanneer een specifieke resource aanwezig is.

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

Voorwaarden voor webapplicaties

Met de annotaties @ConditionalOnWebApplication en @ConditionalOnNotWebApplication kan configuratie worden opgenomen, afhankelijk van of de applicatie een 'webapplicatie' is.

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

SpEL expressie voorwaarden

Met de annotatie @ConditionalOnExpression kan configuratie worden opgenomen op basis van het resultaat van een SpEL-expressie.

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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow