481 字
约 1 分钟
20
Nacos 如何动态加载 Bean?

Nacos 如何动态加载 Bean?

在实际项目中,我们有时候希望:

不重启服务,只修改 Nacos 配置,就能切换 Spring 中 Bean 的实现。

例如系统告警支持两种方式:

  • 短信告警
  • 邮件告警

我们希望在 Nacos 中修改配置,就能动态切换告警方式。

一、基本思路

假设定义一个统一的告警接口,然后提供两个实现:

SmsAlarmHelper

负责短信告警。

MailAlarmHelper

负责邮件告警。

Spring 在创建 Bean 时,根据 Nacos 中的配置决定使用哪个实现。

例如:

alarm.type=sms

使用短信告警。

修改为:

alarm.type=mail

则切换成邮件告警。


二、关键是 @RefreshScope

普通 Bean 创建之后,会一直存在于 Spring 容器中。

即使 Nacos 配置发生变化,原来的 Bean 也不会自动重新创建。

这时候就需要 Spring Cloud 提供的:

@RefreshScope

它的作用可以简单理解为:

当配置中心发生变化时,让相关 Bean 重新加载最新配置。

所以整个过程就是:

Nacos 配置修改 → 服务监听到配置变化 → RefreshScope 刷新 → Bean 重新创建 → 使用新的实现类。


三、最终效果

一开始 Nacos 配置为:

alarm.type=sms

系统使用短信告警。

然后直接在 Nacos 后台改成:

alarm.type=mail

不需要重新启动项目。

再次调用业务时,Spring 容器中的实现已经切换成邮件告警。

这就是利用 Nacos + RefreshScope 实现动态加载 Bean。

四、总结

Nacos 本身负责的是动态配置。

真正负责 Bean 刷新的,是 Spring Cloud 的 @RefreshScope。

所以记住一句话:

Nacos 负责通知配置变了,RefreshScope 负责让 Bean 使用新的配置重新加载。

Nacos 如何动态加载 Bean?
https://clxhxhhr.top/posts/2935/
作者
clxstart
发布于
2026-09-20
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。