我已经阅读了通过Java CDI进行的依赖功能,但到目前为止还没有弄清楚如何在运行时注入类。首先让我解释一下情况。假设我有一个带有中央电子邮件服务的JSF Web应用程序。我正在定义一个接口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,该bean应该注入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中了解到,我可以使用注释来注入适当的服务实现,但这意味着我必须重新构建和部署我的类,以防我想更改适当的服务。有没有更好的解决方案可以使用例如一个配置文件,以便在应用程序运行时更改注入?感谢您的预先答复d 最佳答案 在这种情况下,您可以编写自定义的Producer和Qualifier。代替注入EmailService,注入例如“ @Failsafe EmailService”。然后写一个制作人@Produces@Failsafeprivate 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注入这两种选择(直接或通过Instance ),然后决定传播哪一种。@Produces@Failsafeprivate 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/
10-09 02:28