springboot通过nacos配置文件动态刷新bean

先说一下@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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值