iT邦幫忙

0

關於SpringMVC的介面基本問題

  • 分享至 

  • xImage

參考Spring網路教學後寫的程式,關於Service、Dao的部分有點問題想請教一下。
以處理問題這個功能為例(含增刪查改),如下撰寫了相關程式(其中2個package):

Service:QuestService(介面)、QuestServiceImpl(實作介面的類)
Dao:QuestDao(介面)、QuestDaoImpl(實作介面的類)

以其中QuestServiceImpl的新增問題的下方程式碼為例,
①想請問為什麼QuestDao介面可以成功直接使用實作類別的功能?
(QuestDao介面不是沒有實作嗎,為何不是設計成QuestDaoImpl.newQuestion(quest)?
如果介面可以直接呼叫同個package的實作類功能的話,當有兩個以上的實作類,系統不就不知道要選哪個了嗎?)

②另外想請問實務開發程式時,有必要建那麼多介面嗎? 謝謝

@Service
@Transactional
public class QuestServiceImpl implements QuestService {
	
@Autowired
QuestDao questDao;
@Override
public void newQuestion(Quest quest) { //新增問題
	questDao.newQuestion(quest);
}
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
喵凹咿唉思嗯
iT邦研究生 5 級 ‧ 2022-02-17 11:06:21
最佳解答

這邊Spring的問題好像比較沒人回答

①想請問為什麼QuestDao介面可以成功直接使用實作類別的功能?
(QuestDao介面不是沒有實作嗎,為何不是設計成QuestDaoImpl.newQuestion(quest)?
如果介面可以直接呼叫同個package的實作類功能的話,當有兩個以上的實作類,系統不就不知道要選哪個了嗎?)

你這邊如果想問的是為什麼在Autowired之後
這下面不需要指定成
QuestDao questDao = new QuestDaoImpl();
然後再透過它去呼叫newQuestion的話, 這其實就是Spring Autowired神奇的地方

在兩個以上實作的時候, 可以透過Qualifier來指定或是透過Primary來設定預設載入的Component, 在實作兩個以上, 又沒有指定的情況下, 系統無法判斷會直接報錯

講得更詳細一點, 當你指定了Service/Component/Controller/Repository時, 在Spring載入時就會把這些Component完成產生物件並依預設/指定的名稱存起來, 後面用到時就會直接取得

這部份實際把你的程式改一下, 建一個Constructor應該就會看到他怎麼運作了, 至於背後的原理解釋起來就有點複雜了, 想瞭解的話建議直接去找找對岸的教學文, 有蠻詳細的說明

②另外想請問實務開發程式時,有必要建那麼多介面嗎? 謝謝

我個人是看情況啦.. , 不過如果是接手維護程式的話, 通常會盡量照既有的程式框架走

0
Kai-Sheng's Blog
iT邦新手 5 級 ‧ 2022-05-02 14:56:38

如果介面可以直接呼叫同個package的實作類功能的話,當有兩個以上的實作類,系統不就不知道要選哪個了嗎?)

可以參考 The Spring @Qualifier Annotation

②另外想請問實務開發程式時,有必要建那麼多介面嗎? 謝謝

正常來說不會建立這麼多的 interface,可以參考我發表過的文章。
https://kaisheng714.github.io/articles/anti-pattern-of-java-interface-impl-style

0
tw123
iT邦新手 5 級 ‧ 2023-03-27 10:57:30

6

我要發表回答

立即登入回答