如果一個接口有2個以上不同的實現類, 那么如何Autowire一個指定的實現
1:首先,UserService接口有兩個實現類 UserService1和 UserService2
UserService接口
?
?
2:以下是UserService接口的兩個實現類UserService1和UserService2,請注意@service注解的使用方式,這里給每個實現類標注了不同的名稱,方便在@Resource注入時區別注入
UserService接口實現類UserService1
?
UserService接口實現類UserService2
?
?
比如一個接口有兩個實現類,這時候再按@Autowired的方式去引用, 在同時存在兩個實現類的情況下會報錯,?這是由于 @Autowired?的特性決定的: @Autowired?的注入方式是?byType 注入,?當要注入的類型在容器中存在多個時,Spring是不知道要引入哪個實現類的,所以會報錯。
那么在同一類型擁有多個實現類的時候,如何注入呢?這種場景下,只能通過 byName 注入的方式。可以使用 @Resource?或 @Qualifier?注解。
?@Resource?默認是按照 byName?的方式注入的,?如果通過?byName?的方式匹配不到,再按?byType?的方式去匹配。
?
下面是幾種注入方式
1. 通過 @Autowired 和 @Qualifier 配合注入
?
?
?
2:使用@Resource注入,根據@Service指定的名稱區分
(flag1是UserService1實現類?@Service("flag1")注解指定的)
?
3. 使用@Resource注入,根據默認類名區分
userService1是UserService1實現類的類名
?
總結:
1、@Autowired?是通過?byType?的方式去注入的,?使用該注解,要求接口只能有一個實現類。
2、@Resource?可以通過?byName?和?byType的方式注入,?默認先按?byName的方式進行匹配,如果匹配不到,再按?byType的方式進行匹配。
3、@Qualifier?注解配合@Autowired?一起使用。
4、@Resource和@Autowired都是做bean的注入時使用,其實@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要導入,但是Spring支持該注解的注入。