spring
Registro condicional de frijol en primavera.
Buscar..
Observaciones
Punto importante a tener en cuenta al usar la condición
- La clase de condición se denomina clase directa (no frijol de primavera), por lo que no puede usar la inyección de la propiedad
@Value
, es decir, no se pueden inyectar otros frijoles de primavera dentro de ella. - Desde documentos java: las condiciones deben seguir las mismas restricciones que
BeanFactoryPostProcessor
y tener cuidado de nunca interactuar con las instancias de bean . Las restricciones a las que se hace referencia aquí son ABeanFactoryPostProcessor
puede interactuar con y modificar definiciones de bean, pero nunca instancias de bean. Hacerlo puede provocar una instanciación prematura del frijol, violar el contenedor y causar efectos secundarios no deseados.
Registrar beans solo cuando se especifica una propiedad o valor
Un grano de primavera se puede configurar de tal manera que se registrará sólo si tiene un valor particular o un determinado inmueble se cumple. Para hacerlo, implemente Condition.matches
para verificar la propiedad / valor:
public class PropertyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return context.getEnvironment().getProperty("propertyName") != null;
// optionally check the property value
}
}
En la configuración de Java, use la implementación anterior como condición para registrar el bean. Tenga en cuenta el uso de la anotación @Conditional .
@Configuration
public class MyAppConfig {
@Bean
@Conditional(PropertyCondition.class)
public MyBean myBean() {
return new MyBean();
}
}
En PropertyCondition
, se puede evaluar cualquier número de condiciones. Sin embargo, se recomienda separar la implementación de cada condición para mantenerlas acopladas de manera flexible. Por ejemplo:
@Configuration
public class MyAppConfig {
@Bean
@Conditional({PropertyCondition.class, SomeOtherCondition.class})
public MyBean myBean() {
return new MyBean();
}
}
Anotaciones de condición
Excepto en la anotación principal de @conditional
hay un conjunto de anotaciones similares para usar en diferentes casos.
Condiciones de clase
Las anotaciones @ConditionalOnClass
y @ConditionalOnMissingClass
permiten que la configuración se incluya en función de la presencia o ausencia de clases específicas.
Por ejemplo, cuando OObjectDatabaseTx.class
se agrega a las dependencias y no hay ningún bean OrientWebConfigurer
, creamos el configurador.
@Bean
@ConditionalOnWebApplication
@ConditionalOnClass(OObjectDatabaseTx.class)
@ConditionalOnMissingBean(OrientWebConfigurer.class)
public OrientWebConfigurer orientWebConfigurer() {
return new OrientWebConfigurer();
}
Condiciones de frijol
Las anotaciones @ConditionalOnBean
y @ConditionalOnMissingBean
permiten @ConditionalOnMissingBean
un bean en función de la presencia o ausencia de beans específicos. Puede usar el atributo de valor para especificar beans por tipo, o nombre para especificar beans por nombre. El atributo de búsqueda le permite limitar la jerarquía de ApplicationContext
que debe considerarse al buscar beans.
Vea el ejemplo anterior cuando verificamos si no hay un bean definido.
Condiciones de propiedad
La anotación @ConditionalOnProperty
permite que la configuración se incluya en base a una propiedad de Spring Environment. Use los atributos de prefijo y nombre para especificar la propiedad que debe verificarse. Por defecto, cualquier propiedad que exista y que no sea igual a false
coincidirá. También puede crear verificaciones más avanzadas utilizando los atributos havingValue
y matchIfMissing
.
@ConditionalOnProperty(value='somebean.enabled', matchIfMissing = true, havingValue="yes")
@Bean
public SomeBean someBean(){
}
Condiciones de recursos
La anotación @ConditionalOnResource
permite que la configuración se incluya solo cuando un recurso específico está presente.
@ConditionalOnResource(resources = "classpath:init-db.sql")
Condiciones de la aplicación web
Las anotaciones @ConditionalOnWebApplication
y @ConditionalOnNotWebApplication
permiten que se incluya la configuración dependiendo de si la aplicación es una 'aplicación web'.
@Configuration
@ConditionalOnWebApplication
public class MyWebMvcAutoConfiguration {...}
Condiciones de expresión SpEL
La anotación @ConditionalOnExpression
permite incluir la configuración en función del resultado de una expresión SpEL.
@ConditionalOnExpression("${rest.security.enabled}==false")