在平时的业务开发中,经常会用到动态注入的情况,比如某些场景需要引入自己定义的一些配置,或者使用 jar 包自带的一些 bean,在 SpringBoot 中就会经常看到这些,@ConditionalOnMissingBean、@ConditionalOnBean等等,这些在 SpringBoot用的非常广泛,自动注入会经常看到。
本文重点在于讲解它们的父注解@Conditional,上面说到的,都是@Conditional 的派生子注解,使用此注解可以标注到类上面,也可以标注到方法上面。
使用@Conditional注解,首先需要自定义自己的条件类,实现org.springframework.context.annotation.Condition 接口,通过返回的结果来判断是否需要动态注入,看下面的代码:
public class MyCondition implements Condition {
/**
* 当系统内配置了指定变量后才会生效
*/
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String systemName = Global.getConfig("app.system.name");
if (StringUtils.isBlank(systemName) || !StringUtils.equals("TEST.001", systemName)) {
return false;
}
return true;
}
}
定好了条件类之后,再来看在业务上的应用。
标注再类上面使用:
@Conditional({MyCondition.class})
@Configuration
public class DataSourceConfig {
}
标注在方法上面使用:
@Conditional({MyCondition.class})
@Bean
public DataSource dataSource () {
return null;
}
这里需要注意的是,使用@Conditional注解时,一定要放到@Bean 的前面,否则就起不到动态注入的效果进了。
其实,了解了@Conditional注解的使用,其下面的派生子注解就可以很好的理解了,具体本文不过多赘述。