日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

大家知道,在Springboot+Spring Data Jpa的項目里,dao層只需要繼承JpaRepository接口,就可以實現(xiàn)MyBatis中@Repository+mApper的效果,不需要任何多余的配置,就可以將dao層注入bean。類似于這樣:

public interface BookRepository extends JpaRepository<Book, Long>

這樣一句話,就可以實現(xiàn)很多的增刪改查效果,例如findAll(),findById()等等,可以說是非常的簡單高效。

那么很多剛開始用Spring Data Jpa的同學(xué)就會很不理解,為什么這樣一句話,就可以實現(xiàn)那么多的功能呢,不添加一個@Repository,心里總有些不踏實的感覺。

那么我們來看一下,Spring Data Jpa是怎么做到的。

一、JpaRepository的繼承結(jié)構(gòu)

首先我們來看看JpaRepository的繼承結(jié)構(gòu)。很容易看到JpaRepository的定義:

public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T>

可以看到JpaRepository繼承了兩個接口,一個
PagingAndSortingRepository和一個QueryByExampleExecutor。

這兩個接口的定義分別是:

public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID>

public interface QueryByExampleExecutor<T>

CrudRepository的定義為

public interface CrudRepository<T, ID> extends Repository<T, ID>

可以看到,最終的繼承結(jié)果繼承到了Repository里面。

而這一系列的繼承,就為我們提供了

save(S entity);

saveAll(Iterable<S> entities);

findById(ID id);

existsById(ID id);

findAll();

findAllById(Iterable<ID> ids);

count();

deleteById(ID id);

delete(T entity);

deleteAll(Iterable<? extends T> entities);

deleteAll();

findOne(Example<S> example);

findAll(Example<S> example);

findAll(Example<S> example, Sort sort);

findAll(Example<S> example, Pageable pageable);

count(Example<S> example);

exists(Example<S> example);

findAll(Sort sort);

findAll(Pageable pageable);

等很多的功能。

 

二、JpaRepository為什么不需要@Repository注解

經(jīng)過簡單的Debug,我們就可以輕松定位到Spring注入bean的位置,是在
org.springframework.context.annotation包里面的


ClassPathScanningCandidateComponentProvider類中的

scanCandidateComponents方法里面,其中關(guān)鍵的代碼在下面標(biāo)藍的

isCandidateComponent(metadataReader)判斷里面。

 

而這個函數(shù)會將目標(biāo)接口及其父接口一層層地往上對比,如果與該類自身的

includeFilters中的某個filter比中,則會返回true,意味著該實現(xiàn)將會作為bean被Spring管理起來,從而可以直接用@Autowired引用。

那么我們先來看看includeFilters里面到底有些什么東西,查詢代碼可以看到,該類在初始化的時候,添加了Component和ManagedBean。很顯然,這與我們的Repository還是毫無關(guān)系的。事實上也是如此,在Spring啟動時,第一遍掃描并沒有把我們的BookRepository注入bean。

直到
org.springframework.data.repository.config包中的


RepositoryConfigurationDelegate執(zhí)行的時候,才會開始掃描,而這個類執(zhí)行的時候,會啟動一個繼承了ClassPathScanningCandidateComponentProvider類的RepositoryComponentProvider。

而在這個類里面,我們可以看到Repository最終被加載到了includeFilters里面。

 

此時,再掃描對應(yīng)的包的時候,繼承自Repository的所有dao層類,就被會注入成bean,供人們調(diào)用了。

分享到:
標(biāo)簽:Spring Data Jpa
用戶無頭像

網(wǎng)友整理

注冊時間:

網(wǎng)站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨大挑戰(zhàn)2018-06-03

數(shù)獨一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運動步數(shù)有氧達人2018-06-03

記錄運動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定