1. Java 基礎層面
接口(Interface) 只是方法的定義/規范,里面沒有真正的邏輯。
例如:
public interface IBookService {boolean save(Book book); }
👉 這里只說明了:我要有一個
save
方法,但“怎么保存”沒有寫。實現類(Implementation) 才是具體干活的地方:
@Service public class BookServiceImpl implements IBookService {@Overridepublic boolean save(Book book) {// 真正調用 Mapper/DAO 去執行 INSERT 語句return baseMapper.insert(book) > 0;} }
如果只有接口沒有實現類,那么調用 bookService.save(book)
時就會找不到“怎么執行”的邏輯,運行時會報錯。
2. 在 MyBatis-Plus 里
MyBatis-Plus 已經幫我們準備好了一套通用實現邏輯:
接口:
IService<T>
(定義了常見 CRUD 方法)實現類:
ServiceImpl<M,T>
(幫你實現了大部分方法)
所以我們才會寫:
public interface IBookService extends IService<Book> {}
@Service
public class BookServiceImpl extends ServiceImpl<BookDao, Book>implements IBookService {}
這樣你就獲得了很多現成的方法:
bookService.save(book)
bookService.updateById(book)
bookService.removeById(id)
bookService.page(page)
……
👉 如果你只寫 IBookService
,沒有對應的 BookServiceImpl
,Spring 容器里就不會有一個真正的 Bean 去執行這些方法,你的 @Autowired
注入就會失敗(報 NoSuchBeanDefinitionException
)。
3. 為什么不直接用接口?
接口是規范,解耦:上層代碼依賴接口而不是實現,方便以后換不同實現。
有了接口,你可以有多個實現類,比如:
BookServiceImpl
→ 使用 MyBatis-Plus 訪問數據庫BookServiceCacheImpl
→ 帶緩存邏輯BookServiceMockImpl
→ 測試用的假實現
這樣 Controller 層代碼完全不用改,只要注入不同實現即可。
4. 總結
接口 = 定義功能(做什么)
實現類 = 實現功能(怎么做)
在 Spring/MP 項目里,接口讓你分層清晰、依賴解耦;實現類讓系統真正能運行。
👉 所以:
IBookService
是抽象的“業務契約”,
BookServiceImpl
是具體的“業務實現”,
兩者配合才能在 Spring 項目中工作。