問題:Spring的@Autowired加到接口上但獲取的是實現類?
/* 類 @Controller註解,會在spring容器中實例化對象 */
@Controller
public class UserContoller{
@Autowired // 先按類型找,然後按id爲屬性名去找
private UserService userService;
//爲什麼他會拿到userServiceImpl?
// @Autowired會幫你按UserService的類型去容器中找唯一bean對象
// 1、容器沒有該類型的對象:報錯
// 2、容器中有該類型的唯一bean對象,就將該唯一bean對象賦值給該屬性
///3、容器中有多個【兩個及以上】該類型的唯一bean對象,
// 它會再根據該屬性名去容器中找,
// 看看容器中的哪個bean對象的id值和該屬性名一致,
// 如果有,就將容器中該對象賦值給該屬性,如果沒有報錯。
}
/* 接口 */
public interface UserService{}
/* 類 @Service註解,會在spring容器中實例化對象 */
@Service
public class UserServiceImpl implements UserService{}
爲什麼他會拿到userServiceImpl?
@Autowired先按類型找,然後再按id爲屬性名去找
他會幫你按UserService的類型去容器中找唯一bean對象
- 容器沒有該類型的對象:報錯
- 容器中有該類型的唯一bean對象,就將該唯一bean對象賦值給該屬性
- 容器中有多個【兩個及以上】該類型的唯一bean對象,
它會再根據該屬性名去容器中找,
看看容器中的哪個bean對象的id值和該屬性名一致,
如果有,就將容器中該對象賦值給該屬性,如果沒有報錯。
然後通過多態的向上轉型就賦值成功。等價於之前手動賦值
UserService userService = new UserServiceImpl();