Suche…


Bemerkungen

Wichtiger Punkt, der bei der Verwendung der Bedingung zu beachten ist

  • Die Bedingungsklasse wird als direkte Klasse (nicht als Spring Bean bezeichnet), daher kann die @Value Eigenschaftseinspritzung nicht verwendet werden, @Value es können keine anderen Spring Beans in die @Value injiziert werden.
  • Aus java docs - Bedingungen müssen den gleichen Einschränkungen wie BeanFactoryPostProcessor folgen und darauf achten, dass sie niemals mit Bean-Instanzen interagieren . Die Einschränkungen, auf die hier BeanFactoryPostProcessor sind: Ein BeanFactoryPostProcessor kann mit Bean-Definitionen interagieren und diese modifizieren, aber niemals Bean-Instanzen. Andernfalls kann es zu einer vorzeitigen Instantiierung der Bohnen kommen, die den Container verletzt und unerwünschte Nebenwirkungen verursacht.

Registrieren Sie Beans nur, wenn eine Eigenschaft oder ein Wert angegeben wird

Ein Spring-Bean kann so konfiguriert werden, dass es sich nur dann registriert , wenn es einen bestimmten Wert hat oder eine bestimmte Eigenschaft erfüllt ist. Implementieren Sie dazu Condition.matches , um die Eigenschaft / den Wert zu überprüfen:

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

Verwenden Sie in der Java-Konfiguration die obige Implementierung als Bedingung, um das Bean zu registrieren. Beachten Sie die Verwendung der Annotation @Conditional .

@Configuration
public class MyAppConfig {

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

In PropertyCondition können beliebig viele Bedingungen ausgewertet werden. Es wird jedoch empfohlen, die Implementierung für jede Bedingung zu trennen, um sie lose miteinander verbunden zu halten. Zum Beispiel:

@Configuration
public class MyAppConfig {

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

Bedingungskommentare

Mit Ausnahme der @conditional annotation @conditional gibt es eine Reihe ähnlicher Anmerkungen, die für verschiedene Fälle verwendet werden sollen.

Klassenbedingungen

Mit den Annotationen @ConditionalOnClass und @ConditionalOnMissingClass kann die Konfiguration basierend auf dem Vorhandensein oder Fehlen bestimmter Klassen eingeschlossen werden.

Wenn zum Beispiel OObjectDatabaseTx.class zu Abhängigkeiten hinzugefügt wird und es keine OrientWebConfigurer Bean gibt, erstellen wir den Konfigurator.

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

Bohnenbedingungen

Die Annotationen @ConditionalOnBean und @ConditionalOnMissingBean ermöglichen die @ConditionalOnMissingBean einer Bean basierend auf dem Vorhandensein oder Fehlen bestimmter Beans. Sie können das value-Attribut verwenden, um Beans nach Typ anzugeben, oder name, um Beans nach Namen anzugeben. Mit dem Suchattribut können Sie die ApplicationContext Hierarchie einschränken, die bei der Suche nach Beans berücksichtigt werden sollte.

Sehen Sie sich das Beispiel oben an, wenn wir prüfen, ob keine Bean definiert ist.

Eigentumsbedingungen

Mit der Annotation @ConditionalOnProperty kann die Konfiguration basierend auf einer Spring Environment-Eigenschaft aufgenommen werden. Verwenden Sie die Präfix- und Namensattribute, um die zu überprüfende Eigenschaft anzugeben. Standardmäßig wird jede Eigenschaft, die existiert und nicht gleich false ist, abgeglichen. Sie können auch erweiterte Prüfungen mithilfe der Attribute havingValue und matchIfMissing .

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

Ressourcenbedingungen

Mit der Annotation @ConditionalOnResource kann die Konfiguration nur eingeschlossen werden, wenn eine bestimmte Ressource vorhanden ist.

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

Webanwendungsbedingungen

Die Annotationen @ConditionalOnWebApplication und @ConditionalOnNotWebApplication ermöglichen die @ConditionalOnNotWebApplication Konfiguration abhängig davon, ob es sich bei der Anwendung um eine "Webanwendung" handelt.

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

SpEL-Ausdrucksbedingungen

Mit der Annotation @ConditionalOnExpression können Sie die Konfiguration basierend auf dem Ergebnis eines SpEL-Ausdrucks einschließen.

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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow