前提:?已經集成好 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,實現不同的功能