全注解下的SpringIoc 续4-条件装配bean

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被成功加载了。 好了,今天就先到这里了,眼过千遍不如手过一遍,赶紧去自己尝试一下吧。。。。拜拜

经验分享 程序员 微信小程序 职场和发展