当前位置: 首页 > 知识库问答 >
问题:

通过接口注入服务类?

姬实
2023-03-14
@Service
public class ServiceOne implements InterfaceOne {

}

@Service
public class ServiceTwo implements InterfaceOne {

}
@RestController
@RequestMapping("/test")
public class MyController {
    @Inject
    public MyController(InterfaceOne service) {

    }
}

我不确定DI应该如何与服务类一起工作。基本上,这两个服务类具有相同的接口,我希望能够避免nessesary if的,如果我可以将正确的一个注入到控制器中。一个例子将非常感谢。

抱歉,伙计们,我不太清楚。我还需要弄清楚的是,哪一个服务类需要注入到控制器中,而不需要在那一点上指定具体的实现。所以,我希望有一种方法可以执行某种if语句,并检查应该插入服务的哪个实现。

共有1个答案

微生弘
2023-03-14

处理多个实现时的两种方法:

使用特定的味道,由@qualifier标识

用特定的@qualifier(如@qualifier(“one”)@qualifier(“two”))注释每个实现,并注入特定的味道:

@Autowired
@Qualifier("One")
InterfaceOne implementation;

在这种情况下(当需要1..n实现时),请使用:

@Autowired
List<InterfaceOne> implementations;

如果实现是可选的(0..n),请使用:

@Autowired
Optional<List<InterfaceOne>> implementations;

Edit:关于如何将策略接口与多个实现一起使用的示例:

public interface HelloWorldService {
    String sayHello();
    String getLanguage();
}
@Service
public class HelloWorldServiceEN implements HelloWorldService {
    public String sayHello() { return "Hi there!"; }
    public String getLanguage() { return "en"; }
}

@Service
public class HelloWorldServiceDE implements HelloWorldService {
    public String sayHello() { return "Hallo!"; }
    public String getLanguage() { return "de"; }
}

@Service
public class HelloWorldServiceFR implements HelloWorldService {
    public String sayHello() { return "Salut!"; }
    public String getLanguage() { return "fr"; }
}
@Autowired
private List<HelloWorldService> helloWorldServices;

public void sayHelloInAllLanguages() {
    for (HelloWorldService helloWorldService : helloWorldServices) {
        System.out.println(helloWorldService.sayHello());
    }
}

public void sayHelloInUserLanguage() {
    String userLanguage = Locale.getDefault().getLanguage();
    HelloWorldService helloWorldService = find(userLanguage);
    System.out.println(helloWorldService.sayHello());

}

private HelloWorldService find(String language) {

    // find service in specific language
    Optional<HelloWorldService> service = helloWorldServices.stream().filter(s -> language.equals(s.getLanguage())).findFirst();
    if (service.isPresent()) {
        return service.get();
    }

    // fallback to english, if available
    service = helloWorldServices.stream().filter(s -> language.equals("en")).findFirst();
    if (service.isPresent()) {
        return service.get();
    }

    // fallback to any language
    return helloWorldServices.stream().findFirst().orElseThrow(IllegalStateException::new);
}
 类似资料:
  • 这个问题有点难解释,但我会尽力的。 我有一个项目,我必须制作一个从第三方服务获取数据的UI,并进行反序列化和一些线程管理工作。 现在我的项目结构在视觉工作室的一个解决方案下: 项目A:用户界面 项目B:从第三方服务获取数据的API 项目C:线程管理器API 注:项目B有一个IB接口,C有一个IC接口来帮助依赖注入。项目B和C将在未来被其他团队使用。 项目A同时使用IB和IC接口进行依赖注入。 现在

  • 单点登录 获取从第三方单点登录连接 $app->provider->getLoginUrl(string $redirectUri = '', string $userType = 'admin', string $state = ''); //$redirectUri 回调地址 $userType支持登录的类型 获取登录用户信息 $app->provider->getLoginInfo(st

  • 我试图将一个服务注入到我的操作过滤器中,但我没有在构造函数中注入所需的服务。以下是我所拥有的: 我正在装饰我的控制器,就像这样: Startup.cs

  • 问题内容: 当我尝试使用PHP发送电子邮件时,我一直收到此错误消息: 我的php.ini看起来像这样: 我将笔记本电脑用作服务器。.我在做什么错?谢谢。 问题答案: 您需要在本地运行邮件服务器。如果是Unix,请启用sendmail。如果是Windows,请安装IIs的“简单邮​​件传输服务器”(不确定名称是否正确)组件。

  • 我是Spring Security的新手。我看过很多关于如何通过外部属性文件的注释注入值的文章。我尝试了很多方法,但最终都是用java。lang.IllegalArgumentException:无法解析占位符“val.id”异常。 你能给我一些提示如何处理这个例外吗? 我的java类如下所示: 我的属性文件名为val.properties,位于WEB-INF下,其内容为val.id=xyz 我将