问题引出
这一篇文章,讲了一下如何编写“模块装配”,使得一组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
环境。
@Conditional
如何实现条件装配
使用@Conditional
可以实现更细的条件装配,可手动编写配置的条件。这里分两个步骤快速了解一下。
- 在对应的类上加上
@Conditional
注解。
但是现在@Conditional()
里面需要我们填入条件内容,编写类实现Condition
接口。
@Bean
@Conditional()
public Dog dog(){
return new Dog();
}
- 实现
Condition
接口编写条件。
这里会让我们重写matches
方法,它的核心是方法体的内容判断,如果是true
则上面的Dog
就会满足条件被装配;如果返回的是false
则不会装配Dog
public class ExistCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return false;
}
}
- 把条件的类放入
@Condition()
中即可
@Conditional(ExistCondition.class)