spring                
            Bedingte Bean-Registrierung im Frühjahr
        
        
            
    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 @ValueEigenschaftseinspritzung nicht verwendet werden,@Valuees können keine anderen Spring Beans in die@Valueinjiziert werden.
-  Aus java docs - Bedingungen müssen den gleichen Einschränkungen wie BeanFactoryPostProcessorfolgen und darauf achten, dass sie niemals mit Bean-Instanzen interagieren . Die Einschränkungen, auf die hierBeanFactoryPostProcessorsind: EinBeanFactoryPostProcessorkann 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")