先说一下@ConfigurationProperties注解读取nacos的yml文件顺序
先读取当前项目下的(以你项目的artifactId命名的yml文件 这个文件托管在nacos ,artifactId可能与Data id 的后缀有区别)然后读取全局配置文件
方案
1.通过@ConfigurationProperties注解动态获取nacos配置
2.将配置类添加到这个配置文件中spring.factories,让spring能够扫描到;这里这样做是因为我的配置类最后会打包成jar 引入到目标项目中,如果直接将配置类写在项目中可以忽略这一步;
3.得到配置类的属性
4.对bean的生成做懒加载并添加@RefreshScope动态刷新注解,指定为jdk动态代理;
5.根据配置类的属性判断返回合适的bean(接口类型);
配置类代码
@RefreshScope
@Configuration
@ConfigurationProperties(prefix = "mq")
public class RabbitmqOnOffProperties {
/**
* 是否开启mq使用
*/
private Boolean enable;
public Boolean getEnable() {
return enable;
}
public void setEnable(Boolean enable) {
this.enable = enable;
}
}
另一个配置类 返回bean
@Slf4j
@Configuration
@EnableConfigurationProperties({RabbitMqDirectExchangeConfig.class, RabbitMqTopicExchangeConfig.class})
public class BuildRabbitmqAutoConfiguration {
/**
* 开关配置类 enable=false/null关闭
*/
@Autowired
private RabbitmqOnOffProperties rabbitmqOnOffProperties;
/**
* 使用懒加载及jdk动态代理创建bean
* 可通过proxyMode修改为cglib动态代理 proxyMode = ScopedProxyMode.TARGET_CLASS
* @return MqHandlerInterFace
*/
@Lazy
@Bean
@RefreshScope(proxyMode = ScopedProxyMode.INTERFACES)
public MqHandlerInterFace mqProducerHandler() {
Boolean enable = false;
try {
enable = rabbitmqOnOffProperties.getEnable();
}catch (Exception e){
log.error(e.toString());
e.printStackTrace();
}
MqHandlerInterFace result ;
//当开关true 此时创建mq真正的处理类MqProducerHandler 非true创建默认处理类DefaultMqProducerHandler
if (Boolean.TRUE == enable){
result = new MqProducerHandler();
log.debug("BuildRabbitmqAutoConfiguration.mqProducerHandler==========================创建了mq处理器MqProducerHandler");
}else {
result = new DefaultMqProducerHandler();
log.debug("BuildRabbitmqAutoConfiguration.mqProducerHandler==========================创建了默认mq处理器DefaultMqProducerHandler");
}
return result;
}
@Bean
public RabbitmqConfig rabbitmqConfig() {
return new RabbitmqConfig();
}
}
使用的时候在目标类中 @Autowired 注入MqHandlerInterFace这个类型并调用mqProducerHandler() 方法即可 完美实现开关控制bean生成
引用文章:https://blog.csdn.net/Beijing_L/article/details/116460753