1. 程式人生 > 其它 >spring 到底注入介面還是實現類

spring 到底注入介面還是實現類

今天半夜寫程式碼時,腦子一懵把@Repository註解寫在了介面上,導致bean無法完成注入

於是引發了一系列百度,看到了很多說的不錯的答案。

這其實都是spring的內容,可能是半夜腦子不好使,一直沒看出來哪裡的問題。

關於上面的問題的解釋:

@Service註解是標註在實現類上的,因為@Service是把spring容器中的bean進行例項化,也就是等同於new操作,只有實現類是可以進行new例項化的,而介面則不能,所以是加在實現類上的。

問題1:spring 到底注入介面還是實現類?

實現類

在最初學習spring時,我們使用的時配置的方式來實現。

大概是這樣的:

<bean 
id="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)