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")