Spring的@Autowired加到接口上但獲取的是實現類

問題: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對象

  1. 容器沒有該類型的對象:報錯
  2. 容器中有該類型的唯一bean對象,就將該唯一bean對象賦值給該屬性
  3. 容器中有多個【兩個及以上】該類型的唯一bean對象,
    它會再根據該屬性名去容器中找,
    看看容器中的哪個bean對象的id值和該屬性名一致,
    如果有,就將容器中該對象賦值給該屬性,如果沒有報錯。

然後通過多態的向上轉型就賦值成功。等價於之前手動賦值

UserService userService = new UserServiceImpl();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章