spring
Voorwaardelijke bonenregistratie in het voorjaar
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 metBeanFactoryPostProcessor
. De beperkingenBeanFactoryPostProcessor
hier wordt verwezen, zijn ABeanFactoryPostProcessor
kan deBeanFactoryPostProcessor
beïnvloeden en wijzigen, maar nooitBeanFactoryPostProcessor
. 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")