spring
Registrazione del fagiolo condizionale in primavera
Ricerca…
Osservazioni
Punto importante da notare durante l'utilizzo della condizione
- La classe condizione viene indicata come classe diretta (non come bean di primavera), quindi non può utilizzare l'iniezione di proprietà
@Value
, ovvero non è possibile iniettare altri bean a molla al suo interno. - Da java docs: le condizioni devono seguire le stesse restrizioni di
BeanFactoryPostProcessor
e fare attenzione a non interagire mai con le istanze di bean . Le restrizioni quiBeanFactoryPostProcessor
sono: ABeanFactoryPostProcessor
può interagire con e modificare le definizioni di bean, ma mai istanze bean. Ciò potrebbe causare un'anticipazione dei fagioli prematura, violando il contenitore e causando effetti collaterali indesiderati.
Registra i bean solo quando viene specificata una proprietà o un valore
Un bean spring può essere configurato in modo tale che si registri solo se ha un valore particolare o se viene soddisfatta una proprietà specificata. Per fare ciò, implementa Condition.matches
per verificare la proprietà / il valore:
public class PropertyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return context.getEnvironment().getProperty("propertyName") != null;
// optionally check the property value
}
}
Nella configurazione di Java, utilizzare l'implementazione di cui sopra come condizione per registrare il bean. Nota l'uso dell'annotazione Condizionale .
@Configuration
public class MyAppConfig {
@Bean
@Conditional(PropertyCondition.class)
public MyBean myBean() {
return new MyBean();
}
}
In PropertyCondition
, è possibile valutare qualsiasi numero di condizioni. Tuttavia, si consiglia di separare l'implementazione per ogni condizione per mantenerli accoppiati liberamente. Per esempio:
@Configuration
public class MyAppConfig {
@Bean
@Conditional({PropertyCondition.class, SomeOtherCondition.class})
public MyBean myBean() {
return new MyBean();
}
}
Annotazioni di condizione
Eccetto l'annotazione principale @conditional
ci sono serie di annotazioni simili da utilizzare per casi diversi.
Condizioni di classe
Le annotazioni @ConditionalOnClass
e @ConditionalOnMissingClass
consentono di includere la configurazione in base alla presenza o all'assenza di classi specifiche.
Ad esempio, quando OObjectDatabaseTx.class
viene aggiunto alle dipendenze e non vi è alcun bean OrientWebConfigurer
, viene creato il configuratore.
@Bean
@ConditionalOnWebApplication
@ConditionalOnClass(OObjectDatabaseTx.class)
@ConditionalOnMissingBean(OrientWebConfigurer.class)
public OrientWebConfigurer orientWebConfigurer() {
return new OrientWebConfigurer();
}
Condizioni di fagioli
Le annotazioni @ConditionalOnBean
e @ConditionalOnMissingBean
consentono di @ConditionalOnMissingBean
un bean in base alla presenza o all'assenza di bean specifici. È possibile utilizzare l'attributo value per specificare i bean in base al tipo o al nome per specificare i bean in base al nome. L'attributo di ricerca consente di limitare la gerarchia di ApplicationContext
che deve essere considerata durante la ricerca di bean.
Vedere l'esempio sopra quando controlliamo se non ci sono bean definiti.
Condizioni della proprietà
L'annotazione @ConditionalOnProperty
consente di includere la configurazione in base a una proprietà Spring Environment. Utilizzare il prefisso e gli attributi del nome per specificare la proprietà da verificare. Per impostazione predefinita, qualsiasi proprietà esistente e non uguale a false
verrà confrontata. È inoltre possibile creare verifiche più avanzate utilizzando gli attributi havingValue
e matchIfMissing
.
@ConditionalOnProperty(value='somebean.enabled', matchIfMissing = true, havingValue="yes")
@Bean
public SomeBean someBean(){
}
Condizioni delle risorse
L'annotazione @ConditionalOnResource
consente di includere la configurazione solo quando è presente una risorsa specifica.
@ConditionalOnResource(resources = "classpath:init-db.sql")
Condizioni dell'applicazione Web
Le annotazioni @ConditionalOnWebApplication
e @ConditionalOnNotWebApplication
consentono di includere la configurazione a seconda che l'applicazione sia una 'applicazione Web'.
@Configuration
@ConditionalOnWebApplication
public class MyWebMvcAutoConfiguration {...}
Condizioni di espressione SpEL
L'annotazione @ConditionalOnExpression
consente di includere la configurazione in base al risultato di un'espressione SpEL.
@ConditionalOnExpression("${rest.security.enabled}==false")