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
@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 hierBeanFactoryPostProcessor
sind: EinBeanFactoryPostProcessor
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")