spring 到底注入介面還是實現類
今天半夜寫程式碼時,腦子一懵把@Repository註解寫在了介面上,導致bean無法完成注入。
於是引發了一系列百度,看到了很多說的不錯的答案。
這其實都是spring的內容,可能是半夜腦子不好使,一直沒看出來哪裡的問題。
關於上面的問題的解釋:
@Service
註解是標註在實現類上的,因為@Service
是把spring
容器中的bean
進行例項化,也就是等同於new
操作,只有實現類
是可以進行new
例項化的,而介面
則不能,所以是加在實現類
上的。
問題1:spring 到底注入介面還是實現類?
實現類
在最初學習spring時,我們使用的時配置的方式來實現。
大概是這樣的:
<beanid="userService" class="com.xn2001.UserServiceImpl"> <property name="name" value="小小"/> </bean>
在java類時獲取工廠
// 建立Spring的工廠 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); // 通過工廠獲得類: // 下面相當於UserService userService = new UserServiceImpl();UserService userService = (UserService) applicationContext.getBean("userService");
這裡實際上getBean會返回一個父類object,然後我們再強轉為子類介面 UserService,所以我們裡面填寫的是介面的名稱。
問題2:用@Autowired的時候,到底是寫介面的名字還是實現類的名字呢?
我們應該寫介面。
@Autowired,Spring會按 byType的方式尋找介面的實現類,將其注入。存在多個實現類,應該指定名字,可以通過 byName 注入的方式。可以使用 @Resource 或 @Qualifier 註解。
例如:
@Service("menuService1") public class MenuServiceImpl implements IMenuService @Service("menuService2") public class MenuServiceImpl implements IMenuService @Autowired @Qualifier("menuService1") private IMenuService menuService; @Autowired @Qualifier("menuService2") private IMenuService menuService;
來自網友的回答 :這個其實是建立了實現類的物件但引用了介面型別,即"InjectionDao injectionDao = new InjectionDaoImpl()", 這個其實是Java多型性(向上轉型)的一種應用。在實現類處加@Repository註解,意思就是new InjectionDaoImpl(), 而在InjectionServiceImpl中定義屬性InjectionDAO injectionDAO就是將new出來的這個InjectionDaoImpl物件向上轉型為InjectionDao型別。
來源:spring 到底注入介面還是實現類? - 雲+社群 - 騰訊雲 (tencent.com)