Szukaj…


Uwagi

Ważny punkt do zapamiętania podczas używania warunku

  • Klasa warunkowa jest określana jako klasa bezpośrednia (nie jako fasolka szparagowa), więc nie może używać @Value właściwości @Value , tzn. Nie można do @Value wstrzykiwać żadnych innych fasoli jarej.
  • Z dokumentów Java - Warunki muszą być zgodne z tymi samymi ograniczeniami, co BeanFactoryPostProcessor i BeanFactoryPostProcessor aby nigdy nie wchodzić w interakcje z instancjami BeanFactoryPostProcessor bean . Ograniczenia, o których tu BeanFactoryPostProcessor to BeanFactoryPostProcessor może wchodzić w interakcje i modyfikować definicje BeanFactoryPostProcessor bean, ale nigdy nie ma instancji BeanFactoryPostProcessor bean. Może to spowodować przedwczesne tworzenie się ziaren, naruszając pojemnik i powodując niezamierzone skutki uboczne.

Zarejestruj fasolę tylko wtedy, gdy określono właściwość lub wartość

Fasolka szparagowa może zostać skonfigurowana w taki sposób, aby rejestrowała się tylko wtedy, gdy ma określoną wartość lub określona właściwość jest spełniona. Aby to zrobić, zaimplementuj Condition.matches aby sprawdzić właściwość / wartość:

public class PropertyCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        return context.getEnvironment().getProperty("propertyName") != null;
        // optionally check the property value
    }
}

W konfiguracji Java użyj powyższej implementacji jako warunku zarejestrowania komponentu bean. Zwróć uwagę na użycie adnotacji @ warunkowej .

@Configuration
public class MyAppConfig {

    @Bean
    @Conditional(PropertyCondition.class)
    public MyBean myBean() {
      return new MyBean();
    }
}

W PropertyCondition można ocenić dowolną liczbę warunków. Jednak zaleca się oddzielne wdrożenie dla każdego warunku, aby zachować luźne powiązanie. Na przykład:

@Configuration
public class MyAppConfig {

    @Bean
    @Conditional({PropertyCondition.class, SomeOtherCondition.class})
    public MyBean myBean() {
      return new MyBean();
    }
}

Adnotacje warunkowe

Z wyjątkiem głównej adnotacji @conditional istnieje zestaw podobnych adnotacji, które będą stosowane w różnych przypadkach.

Warunki klasowe

@ConditionalOnClass i @ConditionalOnMissingClass umożliwiają uwzględnienie konfiguracji na podstawie obecności lub braku określonych klas.

Np. Kiedy OObjectDatabaseTx.class jest dodawany do zależności i nie ma fasoli OrientWebConfigurer , tworzymy konfigurator.

@Bean
@ConditionalOnWebApplication
@ConditionalOnClass(OObjectDatabaseTx.class)
@ConditionalOnMissingBean(OrientWebConfigurer.class)
public OrientWebConfigurer orientWebConfigurer() {
    return new OrientWebConfigurer();
}

Warunki dla fasoli

@ConditionalOnBean i @ConditionalOnMissingBean umożliwiają @ConditionalOnMissingBean fasoli w zależności od obecności lub braku określonych ziaren. Możesz użyć atrybutu value, aby określić fasole według typu, lub name, aby określić fasole według nazwy. Atrybut wyszukiwania pozwala ograniczyć hierarchię ApplicationContext którą należy wziąć pod uwagę podczas wyszukiwania ziaren.

Zobacz powyższy przykład, gdy sprawdzamy, czy nie ma zdefiniowanej fasoli.

Warunki własności

Adnotacja @ConditionalOnProperty umożliwia uwzględnienie konfiguracji na podstawie właściwości Spring Environment. Użyj przedrostka i atrybutów nazwy, aby określić właściwość, którą należy sprawdzić. Domyślnie zostanie dopasowana dowolna właściwość, która istnieje i nie jest równa false . Możesz także tworzyć bardziej zaawansowane kontrole za pomocą havingValue i matchIfMissing .

@ConditionalOnProperty(value='somebean.enabled', matchIfMissing = true, havingValue="yes")
@Bean 
public SomeBean someBean(){
}

Warunki zasobów

Adnotacja @ConditionalOnResource pozwala uwzględnić konfigurację tylko wtedy, gdy obecny jest określony zasób.

@ConditionalOnResource(resources = "classpath:init-db.sql") 

Warunki aplikacji internetowej

@ConditionalOnWebApplication i @ConditionalOnNotWebApplication umożliwiają @ConditionalOnNotWebApplication konfiguracji w zależności od tego, czy aplikacja jest „aplikacją internetową”.

@Configuration
@ConditionalOnWebApplication
public class MyWebMvcAutoConfiguration {...}

Warunki ekspresji SpEL

Adnotacja @ConditionalOnExpression umożliwia uwzględnienie konfiguracji na podstawie wyniku wyrażenia SpEL.

@ConditionalOnExpression("${rest.security.enabled}==false")


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow