Spring基础篇:Spring的“条件装配”需要怎么操作

96 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第22天,点击查看活动详情


问题引出

这一篇文章,讲了一下如何编写“模块装配”,使得一组bean能被一个注解管理:Spring基础篇:Spring的自定义“模块装配”的步骤 - 掘金 (juejin.cn)

这里会产生一个问题,如果说这一组bean中,有某个类是不需要被管理的呢?简单来说就是:我还是想通过“模块装配”的方式管理一堆bean,但其中有一个bean是需要被排除的。

哈~这个时候就有人和我想的一样了,既然这个bean要被排除了!那当初不要把它加进“模块装配”不就好了!嗯嗯有道理(当然不是)。请看下面这个例子:

我用模块装配的一组bean,同时这组bean中有我写的工具类,这个工具类只是在我代码开发调试的过程起到作用了,一旦到生产环境了,就不需要这个bean了。这就需要用到“条件装配了”。

条件装配的实现步骤

有两个注解的方式可以实现条件装配,我们先了解一下:

  • @Profile注解
  • @Conditional注解

这两个注解的放的位置都是放在这个:在特定条件下,不需要装入“模块装配”的bean上。

@Profille
bean

// or

@Conditional
bean

@Profile如何实现条件装配

假设一个配置类中有一个bean负责的是数据库源。我们可以在发开时选择dev环境的数据库,在部署的时候选择beta环境的数据库,只需要在对应的类上加上@Profile注解,注解中的value值填上相应的标识字符串即可。

@Configuration
public class AssemblyConfig {
    @Bean
    @Profile("dev")
    public DataSource DevDataSource(){
        //...基本配置
        return new DataSource();
    }
    
    @Bean
    @Profile("beta")
    public DataSource BetaDataSource(){
        //...基本配置
        return new DataSource();
    }
}

配置完毕后,我们可以加上vm-options在IDEA中测试,在JAR包运行时也加上相应的命令即可。 -Dspring.profiles.active=dev选择dev环境。

image.png

@Conditional如何实现条件装配

使用@Conditional可以实现更细的条件装配,可手动编写配置的条件。这里分两个步骤快速了解一下。

  1. 在对应的类上加上@Conditional注解。

但是现在@Conditional()里面需要我们填入条件内容,编写类实现Condition接口。

@Bean
@Conditional()
public Dog dog(){
    return new Dog();
}
  1. 实现Condition接口编写条件。

这里会让我们重写matches方法,它的核心是方法体的内容判断,如果是true则上面的Dog就会满足条件被装配;如果返回的是false则不会装配Dog

public class ExistCondition implements Condition {
    @Override
    public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
        return false;
    }
}
  1. 把条件的类放入@Condition()中即可
@Conditional(ExistCondition.class)