在一个类字段

时间:2016-02-19 16:01:45

标签: java spring spring-boot

与此question类似,但我有这种情况。假设我有一个AccountService接口和两个实现:DefaultAccountServiceImplSpecializedAccountServiceImpl,(类似于前一个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
        ...
    }
}

3 个答案:

答案 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。