spring 4中引入了@Conditional
注解,可以让spring在满足特定条件时才将一个类注册到spring容器中,具体的条件由org.springframework.context.annotation.Condition
接口来描述,该接口的定义如下
@FunctionalInterface
public interface Condition {
boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2);
}
让我们先写一个自定义的Condition来试一下。假设我希望如果当前classpath中如果包含了mysql-connector的类的话,条件就成立,我可以定义这么一个类
public class MysqlCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
try{
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
return false;
}
return true;
}
}
这就是一个自定义的Condition。接下来,如果我希望如果当前classpath中如果包含了mysql-connector的类的话,我就向spring中注入一个String字符串
import com.example.springbootstart.conditions.MysqlCondition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ConditionalConfig {
@Conditional(MysqlCondition.class)
@Bean
public String hello(){
return "hello, i am here";
}
}
以上是spring基于java的配置。如果MysqlCondition
条件成立,则注入一个String类型的bean,name=hello
。
这就是spring@Conditional
的简单用法,由于所谓的Condition是通过一个接口来描述的,所以开发人员可以定义各种各样的condition。spring还内置了一些比较常用的Condition
Conditions | 描述 |
---|---|
@ConditionalOnBean / @ConditionalOnMissingBean | 是否存在某个类型或name的bean |
@ConditionalOnClass / @ConditionalOnMissingClass | 当前classpath是否存在某个类型 |
@ConditionalOnResource | 当前classpath是否存在某个资源文件 |
@ConditionalOnProperty | 当前jvm是否包含某个系统属性为某个值 |
@ConditionalOnWebApplication | 当前spring context是否是web应用程序 |
如果不自定义上面的@ConditionalOnClass
,可以直接使用@ConditionalOnClass(name = {"com.mysql.jdbc.Driver"})
来达到同样的目的
@Configuration
public class ConditionalConfig {
// @Conditional(MysqlCondition.class)
@ConditionalOnClass(name = {"com.mysql.jdbc.Driver"})
@Bean
public String hello() {
return "hello, i am here";
}
}