Spring之IOC底層原理詳解
IoC底層核心原理
IoC核心接口
組件掃描器
- 開發(fā)過程中,需要根據(jù)需求加載必要的bean,排除指定bean
設(shè)定組件掃描加載過濾器
- 名稱:@ComponentScan
- 類型:類注解
- 位置:類定義上方
- 作用:設(shè)置spring配置加載類掃描規(guī)則
- 范例:
@ComponentScan( value="com.itheima", //設(shè)置基礎(chǔ)掃描路徑 excludeFilters = //設(shè)置過濾規(guī)則,當(dāng)前為排除過濾 @ComponentScan.Filter( //設(shè)置過濾器 type= FilterType.ANNOTATION, //設(shè)置過濾方式為按照注解進(jìn)行過濾 classes=Repository.class) //設(shè)置具體的過濾項(xiàng),過濾所有@Repository修飾的bean )
? includeFilters:設(shè)置包含性過濾器
? excludeFilters:設(shè)置排除性過濾器
? type:設(shè)置過濾器類型
自定義組件過濾器
- 名稱:TypeFilter
- 類型:接口
- 作用:自定義類型過濾器
- 范例:
public class MyTypeFilter implements TypeFilter { public boolean match(MetadataReader mr, MetadataReaderFactory mrf) throws IOException { ClassMetadata cm = metadataReader.getClassMetadata(); tring className = cm.getClassName(); if(className.equals("com.NanMu.dao.impl.BookDaoImpl")){ return false; } return false; } }
組件掃描加載過濾器
- 過濾策略
- ANNOTATION 注記
- ASSIGNABLE_TYPE 可分配類型
- ASPECTJ
- REGEX
- CUSTOM
- 應(yīng)用場景
- 數(shù)據(jù)層接口測試環(huán)境
- 業(yè)務(wù)層接口測試環(huán)境
- 各種運(yùn)行環(huán)境設(shè)置
自定義導(dǎo)入器
- bean只有通過配置才可以進(jìn)入spring容器,被spring加載并控制
- 配置bean的方式如下:
- XML文件中使用標(biāo)簽配置
- 使用@Component及衍生注解配置
- 企業(yè)開發(fā)過程中,通常需要配置大量的bean,需要一種快速高效配置大量bean的方式
ImportSelector
- 名稱: ImportSelector
- 類型:接口
- 作用:自定義bean導(dǎo)入器
- 范例:
public class MyImportSelector implements ImportSelector { public String[] selectImports(AnnotationMetadata icm) { return new String[]{"com.itheima.dao.impl.AccountDaoImpl"}; } }
@Configuration @ComponentScan("com.itheima") @Import(MyImportSelector.class) public class SpringConfig { }
不寫衍生注解就可以配置一個導(dǎo)入器類用于對象中
自定義注冊器
- 名稱:ImportBeanDefinitionRegistrar
- 類型:接口
- 作用:自定義bean定義注冊器
- 范例:
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar { public void registerBeanDefinitions(AnnotationMetadata icm, BeanDefinitionRegistry r) { ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(r, false); TypeFilter tf = new TypeFilter() { public boolean match(MetadataReader mr, MetadataReaderFactory mrf) throws IOException { return true; } }; scanner.addIncludeFilter(tf);//包含 //scanner.addExcludeFilter(tf); scanner.scan("com.itheima"); } }
@Configuration @ComponentScan("com.itheima") //4.自定義注冊器 //@Import(MyImportBeanDefinitionRegistrar.class) public class SpringConfig { }
bean初始化過程解析
bean初始化過程解析
- BeanFactoryPostProcessor
- 作用:定義了在bean工廠對象創(chuàng)建后,bean對象創(chuàng)建前執(zhí)行的動作,用于對工廠進(jìn)行創(chuàng)建后業(yè)務(wù)處理
- 運(yùn)行時機(jī):當(dāng)前操作用于對工廠進(jìn)行處理,僅運(yùn)行一次
- BeanPostProcessor
- 作用:定義了所有bean初始化前后進(jìn)行的統(tǒng)一動作,用于對bean進(jìn)行創(chuàng)建前業(yè)務(wù)處理與創(chuàng)建后業(yè)務(wù)處理
- 運(yùn)行時機(jī):當(dāng)前操作伴隨著每個bean的創(chuàng)建過程,每次創(chuàng)建bean均運(yùn)行該操作
- InitializingBean
- 作用:定義了每個bean的初始化前進(jìn)行的動作,屬于非統(tǒng)一性動作,用于對bean進(jìn)行創(chuàng)建前業(yè)務(wù)處理
- 運(yùn)行時機(jī):當(dāng)前操作伴隨著任意一個bean的創(chuàng)建過程,保障其個性化業(yè)務(wù)處理
- 注意:上述操作均需要被spring容器加載放可運(yùn)行
bean初始化過程解析
繁瑣的bean初始化過程處理
- FactoryBean
- 對單一的bean的初始化過程進(jìn)行封裝,達(dá)到簡化配置的目的
FactoryBean與BeanFactory區(qū)別
- FactoryBean:封裝單個bean的創(chuàng)建過程
- BeanFactory:Spring容器頂層接口,定義了bean相關(guān)的獲取操作
以上就是Spring之IOC底層原理的詳細(xì)內(nèi)容,更多關(guān)于Spring之IOC底層的資料請關(guān)注腳本之家其它相關(guān)文章,請大家多多支持我們腳本之家!
相關(guān)文章
Gradle的SpringBoot項(xiàng)目構(gòu)建圖解
這篇文章主要介紹了Gradle的SpringBoot項(xiàng)目構(gòu)建圖解,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01如何利用java中String類的substring()字符串截取最后一個字符
Java中的String是不可變的類型,因此substring()方法并不會改變原字符串,而是返回了一個新的字符串,這篇文章主要介紹了如何利用java中String類的substring()字符串截取最后一個字符,需要的朋友可以參考下2023-11-11詳解Elasticsearch如何把一個索引變?yōu)橹蛔x
這篇文章主要為大家介紹了詳解Elasticsearch如何把一個索引變?yōu)橹蛔x示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Java Apollo是如何實(shí)現(xiàn)配置更新的
這篇文章主要介紹了Java Apollo是如何實(shí)現(xiàn)配置更新的,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下2021-03-03JAVA對象中使用?static?和?String?基礎(chǔ)探究
這篇文章主要介紹了JAVA對象中使用static和String基礎(chǔ)探究,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09SpringBoot返回統(tǒng)一的JSON標(biāo)準(zhǔn)格式實(shí)現(xiàn)步驟
這篇文章主要介紹了SpringBoot返回統(tǒng)一的JSON標(biāo)準(zhǔn)格式,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-08-08SpringBoot項(xiàng)目設(shè)置斷點(diǎn)debug調(diào)試無效忽略web.xml問題的解決
這篇文章主要介紹了SpringBoot項(xiàng)目設(shè)置斷點(diǎn)debug調(diào)試無效忽略web.xml問題的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Java如何向Word模板中插入Base64圖片和數(shù)據(jù)信息
這篇文章主要介紹了Java如何向Word模板中插入Base64圖片和數(shù)據(jù)信息問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07