舉例
通過Condition可以自定義注入bean的條件,如:注入一個MyService的bean,前提條件是JdbcTemplate這個bean要注入成功,代碼如下:
- 條件類
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;
}
}
}
- 準備注入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提供的配置都會被忽略掉。