spring
Villkorlig böneregistrering under våren
Sök…
Anmärkningar
Viktigt att notera vid användning av villkor
- Tillståndsklassen kallas direkt klass (inte som vårböna) så den kan inte använda egenskapen
@Value
injektion, dvs inga andra vårbönor kan injiceras i den. - Från java-dokument - Villkoren måste följa samma begränsningar som
BeanFactoryPostProcessor
och se till att aldrig interagera med bönorinstanser . De begränsningar som refereras här är ABeanFactoryPostProcessor
kan interagera med och ändra böndefinitioner, men aldrig bönefordon. Om du gör det kan det orsaka för tidig instans av bönor, kränka behållaren och orsaka oavsiktliga biverkningar.
Registrera bönor endast när en egenskap eller värde anges
En fjäderböna kan konfigureras så att den bara registreras om den har ett visst värde eller om en specifik egenskap uppfylls. För att göra det, implementera Condition.matches
att kontrollera egenskapen / värdet:
public class PropertyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return context.getEnvironment().getProperty("propertyName") != null;
// optionally check the property value
}
}
I Java-konfigurering använder du implementeringen ovan som ett villkor för att registrera bönan. Notera användningen av @ Villkorlig kommentar.
@Configuration
public class MyAppConfig {
@Bean
@Conditional(PropertyCondition.class)
public MyBean myBean() {
return new MyBean();
}
}
I PropertyCondition
kan valfritt antal villkor utvärderas. Det rekommenderas dock att separera implementeringen för varje villkor för att hålla dem löst kopplade. Till exempel:
@Configuration
public class MyAppConfig {
@Bean
@Conditional({PropertyCondition.class, SomeOtherCondition.class})
public MyBean myBean() {
return new MyBean();
}
}
Villkorsanteckningar
Förutom den huvudsakliga @conditional
anteckningen finns det en uppsättning av liknande kommentarer som ska användas för olika fall.
Klassvillkor
@ConditionalOnClass
och @ConditionalOnMissingClass
gör det möjligt att inkludera konfiguration baserat på närvaro eller frånvaro av specifika klasser.
Till exempel när OObjectDatabaseTx.class
läggs till beroenden och det inte finns någon OrientWebConfigurer
böna skapar vi konfiguratorn.
@Bean
@ConditionalOnWebApplication
@ConditionalOnClass(OObjectDatabaseTx.class)
@ConditionalOnMissingBean(OrientWebConfigurer.class)
public OrientWebConfigurer orientWebConfigurer() {
return new OrientWebConfigurer();
}
Bönevillkor
@ConditionalOnBean
och @ConditionalOnMissingBean
möjligt att inkludera en böna baserad på närvaro eller frånvaro av specifika bönor. Du kan använda värdet attribut för att ange bönor efter typ, eller namn för att ange bönor efter namn. Sökattributet låter dig begränsa ApplicationContext
hierarkin som bör beaktas när du söker efter bönor.
Se exemplet ovan när vi kontrollerar om det inte finns någon definierad böna.
Fastighetsvillkor
@ConditionalOnProperty
anteckningen gör att konfigurationen kan inkluderas baserat på en vårmiljöegenskap. Använd prefix- och namnattribut för att ange den egenskap som ska kontrolleras. Som standard matchas alla egenskaper som finns och som inte är lika med false
. Du kan också skapa mer avancerade kontroller med havingValue
och matchIfMissing
.
@ConditionalOnProperty(value='somebean.enabled', matchIfMissing = true, havingValue="yes")
@Bean
public SomeBean someBean(){
}
Resursvillkor
@ConditionalOnResource
anteckningen gör att konfiguration endast kan inkluderas när en specifik resurs finns.
@ConditionalOnResource(resources = "classpath:init-db.sql")
Villkor för webbapplikation
@ConditionalOnWebApplication
och @ConditionalOnNotWebApplication
kommentarer gör att konfigurationen kan inkluderas beroende på om applikationen är en "webbapplikation".
@Configuration
@ConditionalOnWebApplication
public class MyWebMvcAutoConfiguration {...}
SpEL-uttrycksvillkor
@ConditionalOnExpression
anteckningen gör att konfigurationen kan inkluderas baserat på resultatet av ett SpEL-uttryck.
@ConditionalOnExpression("${rest.security.enabled}==false")