spring
Warunkowa rejestracja fasoli na wiosnę
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
iBeanFactoryPostProcessor
aby nigdy nie wchodzić w interakcje z instancjamiBeanFactoryPostProcessor
bean . Ograniczenia, o których tuBeanFactoryPostProcessor
toBeanFactoryPostProcessor
może wchodzić w interakcje i modyfikować definicjeBeanFactoryPostProcessor
bean, ale nigdy nie ma instancjiBeanFactoryPostProcessor
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")