与此question类似,但我有这种情况。假设我有一个AccountService
接口和两个实现:DefaultAccountServiceImpl
和SpecializedAccountServiceImpl
,(类似于前一个question中的类)。实现在一个类中,但对于不同的方法具有不同的bean实现。说:
@RestController
@RequestMapping("/account")
public class AccountManagerRestController {
@Autowired
private AccountService service;
@RequestMapping(value = "/register", method = RequestMethod.POST)
HttpEntity<?> registerAccount(@RequestBody AccountRegisterRequestBody input) {
// here the `service` is DefaultAccountServiceImpl
...
}
@RequestMapping(value = "/register/specialized", method = RequestMethod.POST)
HttpEntity<?> registerSpecializedAccount(@RequestBody AccountRegisterRequestBody input) {
// here the `service` is SpecializedAccountServiceImpl
...
}
}
答案 0 :(得分:6)
使用@Qualifier("beanName")
@Autowired @Qualifier("service1")
private AccountService service1;
@Autowired @Qualifier("service2")
private AccountService service2;
答案 1 :(得分:0)
我真的不明白其中的区别。在这种情况下,您只需创建两个不同的bean,然后使用不同的@Qualifier
注释它们。
如果你没有得到它,那么你可以通过以下方式实现它:
@RestController
@RequestMapping("/account")
public class AccountManagerRestController {
@Autowired
@Qualifier("DefaultAccountServiceImpl")
private AccountService serviceDAS;
@Autowired
@Qualifier("SpecializedAccountServiceImpl")
private AccountService serviceSAS;
@RequestMapping(value = "/register", method = RequestMethod.POST)
HttpEntity<?> registerAccount(@RequestBody AccountRegisterRequestBody input) {
/* Use ServiceDAS Here */
...
}
@RequestMapping(value = "/register/specialized", method = RequestMethod.POST)
HttpEntity<?> registerSpecializedAccount(@RequestBody AccountRegisterRequestBody input) {
/* Use ServiceSAS Here */
...
}
}
或者,您可以使用一个@Resource
注释替换两个注释,如下所示:
@Resource(name = "DefaultAccountServiceImpl")
private AccountService serviceDAS;
@Resource(name = "SpecializedAccountServiceImpl")
private AccountService serviceSAS;
我更喜欢这种方法,因为我不必使用两个注释。
答案 2 :(得分:0)
对于一些实现,例如1或2,使用@Qualifier表示法就足够了,但在实现将随着时间的推移而增长的实例中,更具可扩展性的解决方案将是利用工厂模式。
因此,只有工厂类负责根据传入的实现参数获取实现。因此, 服务1的实现可以通过传入&#34; SERVICE1&#34;作为工厂类的字符串,它将以这种方式返回服务1。