前提: 已经集成好 springboot / cloud 与nacos的环境
1 nacos中配置文件参数
message:
#sender: emailMessageSender
sender: smsMessageSender
2 接口和两个实现类
public interface MessageSender {
String sendMessage(String message, String recipient);
}
import org.springframework.stereotype.Service;
@Service("emailMessageSender")
public class EmailMessageSender implements MessageSender {
@Override
public 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 {
@Override
public 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 {
@Autowired
private ApplicationContext applicationContext;
@Value("${message.sender}")
private String messageSenderBeanName;
@Bean
@RefreshScope
public MessageSender messageSender() {
// 根据Nacos配置动态获取对应的Bean
try {
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 {
@Autowired
private MessageSender messageSender;
@RequestMapping("/sendNotification")
public String sendNotification(String message, String recipient)
{
String s = messageSender.sendMessage(message, recipient);
return s;
}
}
5 测试,修改nacos的配置文件,就可以动态调用不同的bean,实现不同的功能