Spring @Conditional注解

一个组件带上@Conditional注解或者实现了Condition接口都标识着该组件只在特定条件满足的情况下,才会注册(eligible for registration)。

注意:@Conditional注解不可继承。

如果一个@Configuration类被标注为@Conditional,则该类的所有的@Bean方法, @Import注解,和@ComponentScan注解,都依从于该条件。

示例:

条件类

1
2
3
4
5
6
7
8
9
10
public class MyCondition implements Condition
{
/**
* 这里写自己的逻辑,只有返回true,才会启用配置
*/
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata)
{
return true;
}
}

配置类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.io.Serializable;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;

@Configuration
@Conditional(MyCondition.class)
public class Config
{
@Bean
public Serializable createSerializable()
{
System.out.println("======000");
return "";
}

@Conditional(MyCondition.class)
这句代码可以标注在类上面,表示该类下面的所有@Bean都会启用配置,也可以标注在方法上面,只是对该方法启用配置

除了自己自定义Condition之外,Spring还提供了很多Condition给我们用:

  • @ConditionalOnBean(仅仅在当前上下文中存在某个对象时,才会实例化一个Bean)
  • @ConditionalOnClass(某个class位于类路径上,才会实例化一个Bean)
  • @ConditionalOnExpression(当表达式为true的时候,才会实例化一个Bean)
  • @ConditionalOnMissingBean(仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean)
  • @ConditionalOnMissingClass(某个class类路径上不存在的时候,才会实例化一个Bean)
  • @ConditionalOnNotWebApplication(不是web应用)