Mybatis分頁插件PageHelper的分頁原理剖析
前言
先說下大致的流程:PageHelper作為一個啟動器,那么就和其他啟動器加載一樣,先讀取spring.factories文件里面配置的類,轉(zhuǎn)成Bean加載本系統(tǒng)中
然后執(zhí)行他的前置后置處理方法,完成初始化,最后當(dāng)我們執(zhí)行目標(biāo)方法時(shí),通過攔截器對目標(biāo)方法進(jìn)行攔截,以達(dá)到拓展的目的。
一、加載啟動器里面的Bean
1、PageHelper的spring.factories
2、里面就包含一個PageHelperAutoConfiguration類這是一個配置類,看下有哪些內(nèi)容
在方法org.springframework.core.io.support.SpringFactoriesLoader#loadSpringFactories里面會去加載其他Jar下面的spring.factories文件,然后把文件下配置的類掃描添加到Map里面去。
3、那么spring是在哪里把jar包下面的spring.factories掃描進(jìn)去的
其他starter的spring.factories加載也是如此
4、加載完之后需要把這個Bean注冊到Spring容器中
因?yàn)槭且粋€Configuration,所以基本注冊成Bean都是在ConfigurationClassPostProcessor里面完成
最終會: org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader#registerBeanDefinitionForImportedConfigurationClass 方法里面把PageHelperAutoConfiguration注冊到Spring容器中
下面看下PageHelperAutoConfiguration有什么作用
二、實(shí)例化PageHelperAutoConfiguration
該方法在實(shí)例化Bean的時(shí)候,調(diào)用BeanPostProcessorsBefore回調(diào)方法會觸發(fā)下面的方法
往sql攔截器鏈中添加攔截器
三、使用
先看下分頁查詢的代碼
其中有個setLocalPage,就是利用ThreadLocal,設(shè)置變量值
public abstract class PageMethod { protected static final ThreadLocal<Page> LOCAL_PAGE = new ThreadLocal<Page>(); protected static boolean DEFAULT_COUNT = true; /** * 設(shè)置 Page 參數(shù) * * @param page */ protected static void setLocalPage(Page page) { LOCAL_PAGE.set(page); } }
最終在執(zhí)行sql查詢的時(shí)候,會觸發(fā)到攔截器
看下這個攔截器做了什么?
主要是判斷是否需要分頁,是否需要count操作,等等,最后返回List
到此這篇關(guān)于Mybatis分頁插件PageHelper的分頁原理剖析的文章就介紹到這了,更多相關(guān)PageHelper的分頁原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中Set與List的關(guān)系與區(qū)別介紹
這篇文章主要介紹了Java中Set與List的關(guān)系與區(qū)別介紹,本文總結(jié)它們兩個接口都是繼承自Collection、它們之間的存儲方式不一樣,需要的朋友可以參考下2015-03-03Java操作MinIO實(shí)現(xiàn)文件的上傳和刪除
本文主要介紹如何將本地Java項(xiàng)目resources目錄下的一個PNG圖片上傳到MinIO,然后將上傳的圖片刪除,文中有詳細(xì)的流程步驟和示例代碼,需要的朋友可以參考下2023-06-06Mybatis中傳遞多個參數(shù)的4種方法總結(jié)
這篇文章主要給大家介紹了關(guān)于Mybatis中傳遞多個參數(shù)的4種方法,并且介紹了關(guān)于使用Mapper接口時(shí)參數(shù)傳遞方式,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-04-04Java 文件上傳與路徑處理之Paths.get()、resolve()、transferTo()的用法詳解
本文詳細(xì)解析了如何使用Java的Paths.get()、resolve()和Spring的transferTo()方法處理文件上傳功能,并給出了完整的代碼示例,感興趣的朋友跟隨小編一起看看吧2024-10-10Spring如何重寫內(nèi)置Bean(Controller、Service等)
本文介紹了在Spring Boot工程中處理外部JAR包中Controller方法重寫的需求,通過PostProcessor方式和自定義注解@ExcludeBean兩種方法,解決了在不修改源代碼的情況下重寫接口的問題2025-01-01使用spring+maven不同環(huán)境讀取配置方式
這篇文章主要介紹了使用spring+maven不同環(huán)境讀取配置方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08k8s部署springboot實(shí)現(xiàn)前后端分離項(xiàng)目
本文主要介紹了k8s部署springboot實(shí)現(xiàn)前后端分離項(xiàng)目,主要包括配置文件、鏡像構(gòu)建和容器編排等方面,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01