【@Conditional】@Conditional註解使用方法

舉例

通過Condition可以自定義注入bean的條件,如:注入一個MyService的bean,前提條件是JdbcTemplate這個bean要注入成功,代碼如下:

  1. 條件類
public class JdbcTemplateCondition implements Condition {
    @Override
    public boolean matches(ConditionContext contextm AnnotatedTypeMetadata metadata) {
        try {
            context.getClassLoader().loadClass("org.springframework.jdbc.core.JdbcTemplate");
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}
  1. 準備注入MyService,加前提條件
@Conditional(JdbcTemplateCondition.class)
public MyService myService() {...}

以上代碼的意思是隻有當JdbcTemplateCondition類的條件成立時纔會創建MyService這個bean。也就是說MyService bean創建的條件是Classpath裏有JdbcTemplate,否則這個bean的聲明就會被忽略。

補充

條件化註解 配置生效條件
@ConditionalOnBean 配置了某個指定的類
@ConditionalOnMissBean 沒有配置特定的類
@ConditionalOnClass Classpath裏有指定的類
@ConditionalOnMissClass Classpath裏缺少指定的類
@ConditionalOnExpression 給定的Spring Expression Language(SpEl)表達式計算結果爲true
@ConditionalOnJava Java的版本匹配特定值或者一個範圍值
@ConditionalOnJndi 參數中給定的JNDI位置必須存在一個,如果沒有給參數,則要有JDNI InitialContext
@ConditionalOnProperty 指定的配置屬性要有一個明確的值
@ConditionalOnResource Classpath裏有指定的資源
@ConditionalOnWebApplication 這是一個web應用程序
@ConditionalOnNotWebApplication 這不是一個web應用程序

springboot實例

@Configuration
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({Register.class, DataSourcePoolMetadataProvidersConfiguration.class})
public class DataSourceAutoConfiguration {...}

DataSourceAutoConfiguration添加了@Configuration註解,它從其他配置類裏導入了一些額外的配置,還自己定義了一些bean。最重要的是,DataSourceAutoConfiguration上添加了@ConditionalOnClass註解,要求Classpath裏必須有DataSource和EmbeddedDatabaseType。如果它們不存在,條件就不成立,DataSourceAutoConfiguration提供的配置都會被忽略掉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章