日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Spring的BeanFactoryPostProcessor接口示例代碼詳解

瀏覽:24日期:2023-07-22 09:13:37
接口簡介

BeanFactoryPostProcessor 接口是 Spring 初始化 BeanFactory 時(shí)對外暴露的擴(kuò)展點(diǎn),Spring IoC 容器允許 BeanFactoryPostProcessor 在容器實(shí)例化任何 bean 之前讀取 bean 的定義,并可以修改它。

BeanDefinitionRegistryPostProcessor 繼承自 BeanFactoryPostProcessor,比 BeanFactoryPostProcessor 具有更高的優(yōu)先級(jí),主要用來在常規(guī)的 BeanFactoryPostProcessor 檢測開始之前注冊其他 bean 定義。特別是,你可以通過 BeanDefinitionRegistryPostProcessor 來注冊一些常規(guī)的 BeanFactoryPostProcessor,因?yàn)榇藭r(shí)所有常規(guī)的 BeanFactoryPostProcessor 都還沒開始被處理。

Spring的BeanFactoryPostProcessor接口示例代碼詳解

注意點(diǎn):通過BeanDefinitionRegistryPostProcessor 注冊的 BeanDefinitionRegistryPostProcessor 接口的postProcessBeanDefinitionRegistry方法將得不到調(diào)用,具體的原因會(huì)在下面的代碼中解釋。

BeanFactoryPostProcessor 接口調(diào)用機(jī)制

BeanFactoryPostProcessor 接口的調(diào)用在 AbstractApplicationContext#invokeBeanFactoryPostProcessors方法中。

protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());// Detect a LoadTimeWeaver and prepare for weaving, if found in the meantime// (e.g. through an @Bean method registered by ConfigurationClassPostProcessor)if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));}}

進(jìn)入PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors())方法:

public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) { // 用于存放已經(jīng)處理過的Bean名字Set<String> processedBeans = new HashSet<>(); // 一般會(huì)進(jìn)入這個(gè)判斷if (beanFactory instanceof BeanDefinitionRegistry) {BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory; // 所謂的regularPostProcessors就是指實(shí)現(xiàn)BeanFactoryPostProcessor接口的BeanList<BeanFactoryPostProcessor> regularPostProcessors = new ArrayList<>(); // 所謂的registryProcessors就是指實(shí)現(xiàn)BeanDefinitionRegistryPostProcessor接口的BeanList<BeanDefinitionRegistryPostProcessor> registryProcessors = new ArrayList<>(); // 這邊遍歷的是通過ApplicationContext接口注冊的BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor接口 // 需要和BeanFactory中BeanDefinitionMap中的BeanFactoryPostProcessor接口區(qū)分開for (BeanFactoryPostProcessor postProcessor : beanFactoryPostProcessors) {if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {BeanDefinitionRegistryPostProcessor registryProcessor =(BeanDefinitionRegistryPostProcessor) postProcessor; //如果是BeanDefinitionRegistryPostProcessor,則先進(jìn)行postProcessBeanDefinitionRegistry處理,這個(gè)方法一般進(jìn)行BeanDefinition注冊,從這邊可以看出BeanDefinitionRegistryPostProcessor接口的方法先調(diào)用,所以優(yōu)先級(jí)高于BeanFactoryPostProcessor // 通過這個(gè)代碼可以看出,通過ApplicationContext直接注冊的BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor并不支持Order接口,而是根據(jù)注冊的順序執(zhí)行registryProcessor.postProcessBeanDefinitionRegistry(registry); // 保存這個(gè)BeanDefinitionRegistryPostProcessor,因?yàn)檫€要執(zhí)行這個(gè)類的BeanFactoryPostProcessor方法;registryProcessors.add(registryProcessor);}else { // 保存,后面還要執(zhí)行這個(gè)類的BeanFactoryPostProcessor方法;regularPostProcessors.add(postProcessor);}}List<BeanDefinitionRegistryPostProcessor> currentRegistryProcessors = new ArrayList<>(); // 這邊獲取的是BeanFactory中的BeanDefinitionRegistryPostProcessorString[] postProcessorNames =beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);for (String ppName : postProcessorNames) { //先處理PriorityOrdered標(biāo)注的BeanDefinitionRegistryPostProcessorif (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class)); //將其標(biāo)記為已經(jīng)處理,防止重復(fù)處理processedBeans.add(ppName);}} // 將其排序,以便按順序處理sortPostProcessors(currentRegistryProcessors, beanFactory); // 將其保存,以便處理這個(gè)類的BeanFactoryPostProcessor方法registryProcessors.addAll(currentRegistryProcessors); // 執(zhí)行BeanDefinitionRegistryPostProcessor接口方法invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry); // 清除,以便開始處理@Order標(biāo)注的注解currentRegistryProcessors.clear(); // 注意:這邊重新獲取BeanDefinitionRegistryPostProcessor是有深意的,因?yàn)樯厦嬖谔幚鞞PriorityOrdered標(biāo)注的BeanDefinitionRegistryPostProcessor時(shí)可能又注入了新的BeanDefinitionRegistryPostProcessor。postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);for (String ppName : postProcessorNames) { // 判斷是否處理過,防止重復(fù)處理,下面的邏輯和上面相同, 不介紹了if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));processedBeans.add(ppName);}}sortPostProcessors(currentRegistryProcessors, beanFactory);registryProcessors.addAll(currentRegistryProcessors);invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);currentRegistryProcessors.clear(); // 處理不標(biāo)注注解的BeanDefinitionRegistryPostProcessorboolean reiterate = true;while (reiterate) {reiterate = false;postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);for (String ppName : postProcessorNames) {if (!processedBeans.contains(ppName)) {currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));processedBeans.add(ppName);reiterate = true;}}sortPostProcessors(currentRegistryProcessors, beanFactory);registryProcessors.addAll(currentRegistryProcessors);invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);currentRegistryProcessors.clear();}// 調(diào)用postProcessBeanFactory 方法,所以BeanDefinitionRegistryPostProcessor中的postProcessBeanFactory方法的優(yōu)先級(jí)要高。invokeBeanFactoryPostProcessors(registryProcessors, beanFactory);invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);}else {// Invoke factory processors registered with the context instance.invokeBeanFactoryPostProcessors(beanFactoryPostProcessors, beanFactory);}// 開始處理BeanFactoryPostProcessor接口String[] postProcessorNames =beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);// 也是按照@PriorityOrdered @Ordered 和普通的方式進(jìn)行處理List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();List<String> orderedPostProcessorNames = new ArrayList<>();List<String> nonOrderedPostProcessorNames = new ArrayList<>();for (String ppName : postProcessorNames) { // 可能已經(jīng)處理過if (processedBeans.contains(ppName)) {// skip - already processed in first phase above}else if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));}else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {orderedPostProcessorNames.add(ppName);}else {nonOrderedPostProcessorNames.add(ppName);}} // 先執(zhí)行@PriorityOrdered標(biāo)注的接口sortPostProcessors(priorityOrderedPostProcessors, beanFactory);invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory); // 處理@Order標(biāo)注的類List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>(orderedPostProcessorNames.size());for (String postProcessorName : orderedPostProcessorNames) { // 這邊通過名字重新拿了Bean,應(yīng)該是怕上面的處理改變了BeanorderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));}sortPostProcessors(orderedPostProcessors, beanFactory);invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);// 最后調(diào)用普通的BeanFactoryPostProcessorList<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>(nonOrderedPostProcessorNames.size());for (String postProcessorName : nonOrderedPostProcessorNames) {nonOrderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));}invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);// Clear cached merged bean definitions since the post-processors might have// modified the original metadata, e.g. replacing placeholders in values...beanFactory.clearMetadataCache();}簡單總結(jié)

上面的方法看起來很長很復(fù)雜,但其實(shí)干的事情并不多,就調(diào)用了BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor接口的實(shí)現(xiàn)。這邊再簡單總結(jié)下具體的過程:

step1:執(zhí)行通過ApplicationContext#addBeanFactoryPostProcessor()方法注冊的BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor。

具體過程如下:假如通過ApplicationContext注冊了一個(gè)BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor,那么會(huì)先執(zhí)行BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法,但是BeanDefinitionRegistryPostProcessor的postProcessBeanFactory方法和BeanFactoryPostProcessor的postProcessBeanFactory方法暫時(shí)都不會(huì)在這步執(zhí)行。

另外需要注意的是:通過ApplicationContext注冊的BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor都不支持@PriorityOrdered和@Ordered順序處理,而是按照我們添加的順序處理

step2:處理BeanFactory中的BeanDefinitionRegistryPostProcessor,處理的順序是先處理@PriorityOrdered標(biāo)注的,再處理@Ordered標(biāo)注的,最后處理普通的BeanDefinitionRegistryPostProcessor。到這邊,所有BeanDefinitionRegistryPostProcessor接口的postProcessBeanDefinitionRegistry方法都已經(jīng)調(diào)用完畢,下面就開始處理BeanFactoryPostProcessor的postProcessBeanFactory方法。

step3:調(diào)用BeanDefinitionRegistryPostProcessor實(shí)現(xiàn)的postProcessBeanFactory方法(因?yàn)锽eanDefinitionRegistryPostProcessor是BeanFactoryPostProcessor的子接口)

step4:調(diào)用通過ApplicationContext#addBeanFactoryPostProcessor()注冊的“單純”的BeanFactoryPostProcessor

step5:調(diào)用BeanFactory中的BeanFactoryPostProcessor,調(diào)用順序也是按照@PriorityOrdered和@Ordered順序處理,沒有這兩個(gè)注解的最后處理。

好了,到這邊BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor接口就已經(jīng)處理完了。后面我們會(huì)拿ConfigurationClassPostProcessor 這個(gè)特殊的BeanDefinitionRegistryPostProcessor做列子講下具體流程,這邊只是介紹BeanFactoryPostProcessor的調(diào)用機(jī)制。

到此這篇關(guān)于Spring的BeanFactoryPostProcessor接口的文章就介紹到這了,更多相關(guān)Spring BeanFactoryPostProcessor接口內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
狂野欧美性猛交xxxx| 欧美一区二区三区免费看| 欧美激情日韩| 精品一区二区三区中文字幕视频 | 亚洲精品动态| 欧美一级网站| 久久精品国产99国产精品| 丰满少妇一区| 久久中文字幕av| 日韩精品一级二级| 热久久久久久| 成人在线黄色| 欧美日韩国产综合网| 亚洲精品在线二区| 国产精品www.| 日韩高清中文字幕一区二区| 五月精品视频| 日韩高清不卡一区| 国产在线看片免费视频在线观看| 日韩国产欧美| 亚洲欧美日韩国产一区| 亚洲精品一级| 久久一区精品| 九九久久婷婷| 国产欧美日韩| 欧美女激情福利| 国产亚洲高清在线观看| 色婷婷色综合| 最新国产精品视频| 国产一区二区三区不卡视频网站 | 久久免费精品| 香蕉人人精品| 国产日韩欧美| 亚洲91精品| 欧美影院视频| 成人在线丰满少妇av| 亚洲少妇诱惑| 蜜桃精品视频| 日韩制服丝袜先锋影音| 97欧美在线视频| 一区二区三区四区在线观看国产日韩| 免费看一区二区三区| 亚洲欧美日本视频在线观看| 久久久国产精品入口麻豆| 91久久中文| 国产精品久久久久蜜臀| 亚洲精品少妇| 激情六月综合| 麻豆国产91在线播放| 视频在线观看一区二区三区| 日本不良网站在线观看| 国产毛片精品久久| 在线视频精品| 裤袜国产欧美精品一区| 日本aⅴ亚洲精品中文乱码| 99久久婷婷| 精品国产91| 日韩av三区| 丝袜美腿一区二区三区| 日韩毛片在线| 国产一区日韩| 欧美一区免费| 亚洲欧美日韩精品一区二区 | 久久麻豆视频| 日本成人在线视频网站| 欧美一区二区三区高清视频 | 中文字幕日韩亚洲| 婷婷成人综合| 裤袜国产欧美精品一区| 国产精选一区| 午夜久久av| 蜜臀av在线播放一区二区三区| 日本欧美不卡| 欧美成人a交片免费看| 欧美激情aⅴ一区二区三区 | 蜜桃久久精品一区二区| 亚洲a在线视频| 亚洲黄色网址| 国产精品13p| 97欧美在线视频| 国产一区二区三区不卡视频网站| 国产精区一区二区| 国产探花一区| 国产乱码精品一区二区亚洲| 日韩有吗在线观看| 亚洲欧美专区| 日本亚洲视频| 蜜桃91丨九色丨蝌蚪91桃色| 三级欧美在线一区| 日韩一区欧美二区| 日韩中文字幕亚洲一区二区va在线| 免费av一区二区三区四区| 亚洲成人va| 久久久久99| 在线日韩中文| 激情五月色综合国产精品| 欧美成人久久| 国产精品日本| 蜜臀精品久久久久久蜜臀| 在线精品一区| 日韩av一区二区三区四区| 欧美在线91| 国产精区一区二区| 粉嫩av一区二区三区四区五区 | zzzwww在线看片免费| 狠狠躁少妇一区二区三区| 人人精品亚洲| 亚洲精品97| 午夜久久av| 国产精品一区三区在线观看| 欧美91在线| а√天堂8资源中文在线| 日韩a一区二区| 视频福利一区| 久久亚洲二区| 久久狠狠久久| 麻豆视频在线观看免费网站黄| 秋霞影视一区二区三区| 好看的亚洲午夜视频在线| 中文不卡在线| 国产精品探花在线观看| 国产精品毛片久久| 国精品一区二区| 亚洲日韩中文字幕一区| 国产欧美另类| 97精品国产福利一区二区三区| 欧美亚洲精品在线| 免费日本视频一区| 精品资源在线| 亚洲少妇在线| 免费日韩成人| 亚洲手机视频| 日韩精品电影一区亚洲| 久久女人天堂| 欧美国产91| 国产日韩欧美中文在线| 91偷拍一区二区三区精品| 国产精品普通话对白| 国产精品一区二区99| 日韩一区自拍| 日韩欧美中文字幕一区二区三区| 精品国产午夜| 亚洲免费黄色| 久久av网站| 在线亚洲国产精品网站| 国产精成人品2018| 狠狠爱成人网| 精品久久影院| 蜜桃视频免费观看一区| 欧美好骚综合网| 日本一区二区三区视频在线看| 理论片午夜视频在线观看| 亚洲精品影视| 婷婷激情一区| 国产精品一区二区三区四区在线观看| 久久九九电影| 国产日韩高清一区二区三区在线| 日韩激情一区| 欧美一级网站| 伊人成人在线视频| 国产精品99在线观看| 亚州av日韩av| 激情欧美日韩一区| 精品无人区麻豆乱码久久久| 免费观看在线综合色| 久久久久网站| 久久精品五月| 日韩精品久久久久久| 亚洲精品国产偷自在线观看| 成人在线免费观看网站| 日韩精品1区2区3区| 午夜精品亚洲| 福利片在线一区二区 | 日韩在线麻豆| 亚洲精华国产欧美| 一本大道色婷婷在线| 欧美成人一二区| 91精品国产自产精品男人的天堂 | 国产日产精品_国产精品毛片 | 五月精品视频| 天堂√8在线中文| 麻豆国产精品一区二区三区| 青青国产91久久久久久| 蜜桃视频在线观看一区| 欧美另类综合| 亚洲风情在线资源| 久久99国产精品视频| 国产欧美69| 欧美精品中文| 日韩国产一二三区| 亚洲精品九九| 亚洲视频二区| 日韩影院在线观看| 麻豆久久精品| 亚洲综合精品四区| 欧美专区在线| 蜜桃视频在线观看一区| 久热re这里精品视频在线6| 99亚洲视频| 久久国产66|