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


版权声明:本文为u010430099原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。