gpt4 book ai didi

java - Java运行时的依赖注入(inject)

转载 作者:行者123 更新时间:2023-12-01 13:40:43 25 4
gpt4 key购买 nike

我已经通过 Java CDI 阅读了依赖项功能,但到目前为止无法弄清楚如何通过运行时注入(inject)类。让我先解释一下场景。

假设我有一个带有中央电子邮件服务的 JSF Web 应用程序。

我正在定义一个接口(interface)

public interface EmailService {

public String sendEmail(Email email);
}

接下来我有一个使用 Smtp 的 EmailService 的具体实现:

public class SmtpEmailServiceImpl implements EmailService {

@Override
public String sendEmail(Email email) {
// concrete implementation using Smtp
}

}

现在,在我的 Web 应用程序中,我有一个 JSF 支持 bean,它应该注入(inject) EmailService 以便发送电子邮件

public class JSFBackingBean {
// This is the EmailService to be injected
private EmailService emailService;


public String sendEmail(){
emailService.sendEmail(new Email());
}
}

现在假设 Smtp 服务器因维护而关闭。在这种情况下,我想将所有电子邮件存储在数据库中,并稍后在 Smtp 服务器启动并运行时处理它们。在这种情况下,我希望有 EmailService 的第二个实现:

public class DatabaseEmailService implements EmailService {

@Override
public String sendEmail(Email email) {
// concrete implementation writing the email to a database
}

}

现在我从 CDI 了解到,我可以使用注释来注入(inject)正确的服务实现,但这意味着我必须重新构建和部署我的类,以防我想更改适当的服务。有没有更好的解决方案,我可以使用例如配置文件以便在应用程序运行时更改注入(inject)?

感谢您提前的答复预测

最佳答案

在这种情况下,您可以编写自定义的生产者和限定符。不要注入(inject) EmailService,而是注入(inject)“@Failsafe EmailService”。

然后编写一个生产者

@Produces
@Failsafe
private EmailService failsafeEmailService() {
// here you can check if the Mail Server is available and then decide
// to return the "real" Service or the DB-Queue.
}

您还可以让 CDI 注入(inject)两种替代方案(直接或通过实例<>),然后决定传播哪一种,而不是在方法主体内创建/查找服务。

@Produces
@Failsafe
private EmailService failsafeEmailService(MailServiceBean bean, DBQueue queue) {
return (check_if_mail_server_is_running) ? bean : queue
}

(当然DBQueue和Bean都必须实现EmailService)。

关于java - Java运行时的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20814290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com