SpringBoot - @ConditionalOnMissingBean注解使用详解
@ConditionalOnMissingBean作用在@Bean定义上,也就是说在容器加载它作用的Bean时,检查容器中是否存在目标类型(@ConditionalOnMissingBean注解的value值)的Bean了,如果存在则跳过Bean的默认加载动作,如果不存在则加载该Bean完成注册。
·
写在前面
@ConditionalOnMissingBean是用于修饰Bean的一个注解,在项目启动时开始自动化配置注册生成Bean,当某个类型的Bean被注册之后,如果再注册相同类型的Bean就会失败,该注解会保证Spring容器中只有一个Bean类型的实例,当注册多个相同类型的Bean时,会出现异常。当一个接口有多个实现类时,如果只希望它有一个实现类,那就在其他的各个实现类上加上这个注解。
@ConditionalOnMissingBean作用在@Bean定义上,也就是说在容器加载它作用的Bean时,检查容器中是否存在目标类型(@ConditionalOnMissingBean注解的value值)的Bean了,如果存在则跳过Bean的默认加载动作,如果不存在则加载该Bean完成注册。
对比说明
@ConditionalOnBean有则注入;@ConditionalOnMissBean没有则注入;@Conditional条件满足则注入。
使用约束
- @ConditionalOnMissingBean注解只作用在@Bean定义的方法上
- 建议仅仅在自动配置类中使用此注解,虽然放在其他类中也不会报错
- 该注解仅能匹配已经被当前应用上下文管控的Bean定义
- 若候选Bean是被其他配置类创建的,需要使用@AutoConfigureBefore 或@AutoConfigureOrder进行配置类先后注入顺序的控制,确保这个条件在其后运行
- Condition相关的处理是在包扫描的时候执行的,因此Bean的添加顺序和包扫描的顺序有关,而包扫描的顺序依赖包名和类名的字符排序,同时和maven的pom文件中包引入的顺序也有关系,先引入的包先被扫描到,所以在实际的项目中,我们可以修改类路径或者调整包引入顺序来调整Bean的添加顺序
代码示例
package com.hadoopx.drools.config;
import com.hadoopx.drools.KieSchedule;
import com.hadoopx.drools.KieTemplate;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import java.util.Objects;
import static com.hadoopx.drools.common.Constants.LISTENER_CLOSE;
/**
* @author ROKCY
* 第③步. 定义自动配置类
*/
// 配置类
@Configuration
// 开启属性文件绑定功能
@EnableConfigurationProperties(DroolsProperties.class)
public class DroolsConfig {
@Bean
@ConditionalOnMissingBean(name = "kieTemplate")
public KieTemplate kieTemplate(DroolsProperties droolsProperties) {
KieTemplate kieTemplate = new KieTemplate();
kieTemplate.setPath(droolsProperties.getPath());
kieTemplate.setMode(droolsProperties.getMode());
String autoUpdate = droolsProperties.getAutoUpdate();
if (Objects.equals(LISTENER_CLOSE, autoUpdate)) {
// 关闭自动更新
kieTemplate.setUpdate(999999L);
} else {
// 启用自动更新
kieTemplate.setUpdate(droolsProperties.getUpdate());
}
kieTemplate.setListener(droolsProperties.getListener());
kieTemplate.setVerify(droolsProperties.getVerify());
return kieTemplate;
}
@Bean
@ConditionalOnMissingBean(name = "kieSchedule")
public KieSchedule kieSchedule(KieTemplate kieTemplate) {
KieSchedule kieSchedule = new KieSchedule(kieTemplate);
kieSchedule.execute();
return kieSchedule;
}
}
更多推荐
已为社区贡献20条内容
所有评论(0)