我们有以下代码。出现此问题的原因是我们无法使用 Spring Boot 在运行时在 SMSMessage 和 EmailMessage 之间切换。目前,我们需要修改 application.properties 文件中的 spring.profiles.active=sms 条目并重新启动此开关的应用程序。有没有办法利用 Spring 框架的依赖注入 (DI) 来实现运行时 SMSMessage 和 EmailMessage 之间的动态交换,而无需重新启动应用程序? 我们用: springBoot版本=2.7.12 spring版本=5.3.27
应用程序属性: spring.profiles.active=短信
package net.portal;
public interface MessageService {
void sendMessage(String message);
}
@Service
@Profile("!sms")
public class EmailService implements MessageService {
@Override
public void sendMessage(String message) {
// Logic to send an email
System.out.println("Email sent: " + message);
}
}
@Service
@Profile("sms")
public class SMSService implements MessageService {
@Override
public void sendMessage(String message) {
// Logic to send an SMS
System.out.println("SMS sent: " + message);
}
}
@Component
public class MessageSender {
private final MessageService messageService;
@Autowired
public MessageSender(MessageService messageService) {
this.messageService = messageService;
}
public void sendMessage(String message) {
messageService.sendMessage(message);
}
}
// Run the message service
private static ApplicationContext context;
public static void main(String[] args) {
SpringApplication.run(ApplicationLauncher.class, args);
MessageSender sender = context.getBean(MessageSender.class);
sender.sendMessage("Hello, this is frm SMS message now!");
}
ETC.
```
因此,我们的想法是拥有一个外部值来控制您要使用的 bean。
一种解决方案是功能标记。 另一个解决方案是,假设您有一个用户,并且在他们的个人资料上有
当向用户发送该消息时,您知道必须仅通过电子邮件发送该消息,因为他们的偏好如此。
然后你可以使用命名bean。
@Qualifier
和 context.getBean("<bean name>");
或者你可以使用一个映射并让 spring 注入所有的 beans
@Service
@Qualifier("email")
public class EmailService implements MessageService {
...
}
@Service
@Qualifier("sms")
public class SMSService implements MessageService {
....
}
......
@Autowire
private Map<String, MessageService > messageServiceBeansMap;
....
<some other logic here>
var channel = getChannelUsingSomeLogic()
messageServiceBeansMap.getOrDefault(channel, theDefaultChannelBean).sendMessage(..)