Spring Boot默认启动时会加载bean,如果加载失败,则应用就会启动失败。但是部分场景下,我们希望某个bean只有满足一定的条件下,才允许Spring Boot加载,所以,这里就需要使用@Conditional注解来协助我们达到这样的目的。
@Conditional 注解的使用
@Conditional注解表示Spring Boot加载对应的bean需要这个bean满足一定的条件,不然就不会被加载。
这里我们以数据库配置加载为例,如果数据库密码没有配置,则不加载数据源bean,代码如下:
@Configuration
@Slf4j
public class ConditionalBeanAppConfig {
@Bean(value = "dataSource4")
@Conditional(DataBaseConditional.class)
public DataSource getDataSource(@Value("${database4.password}") String password){
Properties properties = new Properties();
properties.setProperty("driver","com.mysql.jdbc.Driver");
properties.setProperty("url","jdbc:mysql://zzm.zgj.cn:3306/ZzmSpringBootLearn");
properties.setProperty("username","admin");
properties.setProperty("password",password);
DataSource dataSource = null;
try {
dataSource = BasicDataSourceFactory.createDataSource(properties);
}catch (Exception e){
log.warn("创建数据源dataSource4失败:", e);
}
log.warn("创建数据源dataSource4成功:{}",dataSource);
return dataSource;
}
}
可以看到@Conditional注解指定了一个类DataBaseConditional.class,这个类是我们自己创建的,需要实现Condition接口的matches方法,如果matches方法返回true,Spring Boot就会加载该bean,否则就不会加载。类DataBaseConditional.class的代码如下:
public class DataBaseConditional implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment environment = context.getEnvironment();
return environment.containsProperty("database4.password");
}
}
可以看到,我们指定了,如果配置文件中没有配置database4.password,则返回false,即Spring Boot不会加载对应的bean。
接下来我们不配置database4.password
启动应用,看看效果:
可以看到,应用启动成功了,而且日志“创建数据源dataSource4成功”也没有打印出来,说明Spring Boot并没有加载这个bean。
接下载让我们在配置文件中添加如下配置:
database4.password=database4.password
再次启动应用,如下所示:
可以看到,bean被成功加载了。
好了,今天就先到这里了,眼过千遍不如手过一遍,赶紧去自己尝试一下吧。。。。拜拜