问题是我们无法在运行时使用 Spring-Boot 在 SMSMessage 和 EmailMessage 之间切换

问题描述 投票:0回答:1

我们有以下代码。出现此问题的原因是我们无法使用 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.
```
java spring spring-boot
1个回答
0
投票

因此,我们的想法是拥有一个外部值来控制您要使用的 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(..)
© www.soinside.com 2019 - 2024. All rights reserved.