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 A BeanFactoryPostProcessor 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")


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow