@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语句,并检查应该插入服务的哪个实现。
处理多个实现时的两种方法:
使用特定的味道,由@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 我将