前提: 已经集成好 springboot / cloud 与nacos的环境
1 nacos中配置文件参数
message:#sender: emailMessageSendersender: smsMessageSender
2 接口和两个实现类
public interface MessageSender {String sendMessage(String message, String recipient);
}import org.springframework.stereotype.Service;
@Service("emailMessageSender")
public class EmailMessageSender implements MessageSender {@Overridepublic String sendMessage(String message, String recipient) {StringBuilder append = new StringBuilder().append("邮件发送成功,收信人:").append(recipient).append(",邮件内容:").append(message);return append.toString();// 实际的邮件发送逻辑...}
}import org.springframework.stereotype.Service;
@Service("smsMessageSender")
public class SmsMessageSender implements MessageSender {@Overridepublic String sendMessage(String message, String recipient) {StringBuilder append = new StringBuilder().append("短信发送成功,短信内容:").append(message).append(",接收人:").append(recipient);return append.toString();// 实际的短信发送逻辑...}
}
3 动态bean切换配置,注意@RefreshScope,有两处
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@RefreshScope
public class MessageSenderConfig {@Autowiredprivate ApplicationContext applicationContext;@Value("${message.sender}")private String messageSenderBeanName;@Bean@RefreshScopepublic MessageSender messageSender() {// 根据Nacos配置动态获取对应的Beantry {return (MessageSender) applicationContext.getBean(messageSenderBeanName);} catch (BeansException e) {throw new RuntimeException("未找到对应的处理器");}}
}
4 controller层调用
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/notification")
public class Controller_Notification {@Autowiredprivate MessageSender messageSender;@RequestMapping("/sendNotification")public String sendNotification(String message, String recipient){String s = messageSender.sendMessage(message, recipient);return s;}}
5 测试,修改nacos的配置文件,就可以动态调用不同的bean,实现不同的功能