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

您的位置:首頁技術文章
文章詳情頁

淺談Spring中幾個PostProcessor的區別與聯系

瀏覽:25日期:2023-12-01 13:12:09
目錄Spring幾個PostProcessor的區別首先明確 Bean 的生命周期:查看 IOC 容器創建時的調用流程spring-postProcessor的執行時機BeanPostProcessor:postProcessAfterInitialization調用時機:InstantiationAwareBeanPostProcessor總結: 執行順序Spring幾個PostProcessor的區別首先明確 Bean 的生命周期: 首先注冊 Bean 的定義信息; 然后創建 Bean 的實例; 最后初始化 Bean ,放入容器中。

按照執行的順序,可以分為以下幾個步驟:

BeanDefinitionRegistryPostProcessor 是在注冊 Bean 定義信息前后調用;

BeanFactoryPostProcessor 是在創建 Bean 前后調用;

BeanPostProcessor 是在初始化 Bean 前后調用;

其中 BeanDefinitionRegistryPostProcessor 是 BeanFactoryPostProcessor 的子類,所以可以使用前者代替后者實現功能。

查看 IOC 容器創建時的調用流程

refresh 方法的代碼如下:

// Allows post-processing of the bean factory in context subclasses.postProcessBeanFactory(beanFactory);// Invoke factory processors registered as beans in the context.invokeBeanFactoryPostProcessors(beanFactory);// Register bean processors that intercept bean creation.registerBeanPostProcessors(beanFactory);// Initialize message source for this context.initMessageSource();// Initialize event multicaster for this context.initApplicationEventMulticaster();// Initialize other special beans in specific context subclasses.onRefresh();// Check for listener beans and register them.registerListeners();// Instantiate all remaining (non-lazy-init) singletons.finishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.finishRefresh();

其中的 invokeBeanFactoryPostProcessors 就執行了注冊定義信息和創建 Bean 的方法;而 finishBeanFactoryInitialization 執行了初始化 Bean 的方法。

具體的執行順序大家可以自行打斷點調試,由于涉及的源碼過多,這里不再展示。

spring-postProcessor的執行時機

spring bean 的生命周期粗糙的分為以下步驟。

實例化(創建一個屬性都為空的對象)---------》屬性填充(populateBean,下文中這個步驟我都稱為初始化)-----------》init方法的執行(invokerInitMethods,下文稱為init)

postprocessor的方法就是穿插在這三個大的步驟中。

BeanPostProcessor:

淺談Spring中幾個PostProcessor的區別與聯系

postProcessBeforeInitialization調用時機

淺談Spring中幾個PostProcessor的區別與聯系

向上找調用者:

淺談Spring中幾個PostProcessor的區別與聯系

繼續向上:

淺談Spring中幾個PostProcessor的區別與聯系

看以看出populateBean(初始化bean)-------------------》beanpostBeforeInitialization---------------------------------->invokeinitMethods(配置的init-method)

postProcessAfterInitialization調用時機:

淺談Spring中幾個PostProcessor的區別與聯系

向上:

淺談Spring中幾個PostProcessor的區別與聯系

可以看出在init-method方法之后

看以看出populateBean(初始化bean)-------------------》beanpostBeforeInitialization---------------------------------->invokeinitMethods(配置的init-method)------->postProcessAfterInitialization

public class MBeanPostProcessor implements BeanPostProcessor { @Override //populateBean之后 invokeinitMethods之前 public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {System.out.println('post bean before! :'+beanName);return bean; } @Override //invokeinitMethods之后 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println('post bean after!'+beanName);return bean; }}

另一個重要的是:

InstantiationAwareBeanPostProcessor

淺談Spring中幾個PostProcessor的區別與聯系

postProcessBeforeInstantiation調用時機:

淺談Spring中幾個PostProcessor的區別與聯系

向上找調用者:

淺談Spring中幾個PostProcessor的區別與聯系

繼續向上:

淺談Spring中幾個PostProcessor的區別與聯系

可以看出是在實例化之前:(也就是反射創建對象之前,如果postProcessBeforeInstantiation創建了一個非空的對象,則不會走實例化步驟。

postProcessAfterInstantiation調用時機:

protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) { PropertyValues pvs = mbd.getPropertyValues(); if (bw == null) { if (!pvs.isEmpty()) { throw new BeanCreationException( mbd.getResourceDescription(), beanName, 'Cannot apply property values to null instance'); } else { // Skip property population phase for null instance. return; } } // Give any InstantiationAwareBeanPostProcessors the opportunity to modify the // state of the bean before properties are set. This can be used, for example, // to support styles of field injection. boolean continueWithPropertyPopulation = true; if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) { for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof InstantiationAwareBeanPostProcessor) { InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp; //在這里執行 if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) { continueWithPropertyPopulation = false; break; } } } } if (!continueWithPropertyPopulation) { return; } 省略。。。。。 applyPropertyValues(beanName, mbd, bw, pvs);}

可以看出是在在初始化之前,具體是屬性填充之前。(初始化之前,實例化之后) 如果返回fales,則不會繼續初始化,即不會屬性填充。

postProcessPropertyValues調用時機:

protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) { PropertyValues pvs = mbd.getPropertyValues(); if (bw == null) { if (!pvs.isEmpty()) { throw new BeanCreationException( mbd.getResourceDescription(), beanName, 'Cannot apply property values to null instance'); } else { // Skip property population phase for null instance. return; } } // Give any InstantiationAwareBeanPostProcessors the opportunity to modify the // state of the bean before properties are set. This can be used, for example, // to support styles of field injection. boolean continueWithPropertyPopulation = true; if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) { for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof InstantiationAwareBeanPostProcessor) { InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp; if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) { continueWithPropertyPopulation = false; break; } } } } if (!continueWithPropertyPopulation) { return; } if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME || mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) { MutablePropertyValues newPvs = new MutablePropertyValues(pvs); // Add property values based on autowire by name if applicable. if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_NAME) { autowireByName(beanName, mbd, bw, newPvs); } // Add property values based on autowire by type if applicable. if (mbd.getResolvedAutowireMode() == RootBeanDefinition.AUTOWIRE_BY_TYPE) { autowireByType(beanName, mbd, bw, newPvs); } pvs = newPvs; } boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors(); boolean needsDepCheck = (mbd.getDependencyCheck() != RootBeanDefinition.DEPENDENCY_CHECK_NONE); if (hasInstAwareBpps || needsDepCheck) { PropertyDescriptor[] filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching); if (hasInstAwareBpps) { for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof InstantiationAwareBeanPostProcessor) { InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp; pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName); if (pvs == null) { return; } } } } if (needsDepCheck) { checkDependencies(beanName, mbd, filteredPds, pvs); } } applyPropertyValues(beanName, mbd, bw, pvs);}

在postProcessAfterInstantiation之后,applyPropertyValues之前。(屬性填充之前修改屬性值)

總結: 執行順序 1.postProcessBeforeInstantiation(實現這個方法可以做自定義實例化) 2.實例化 3.postProcessAfterInstantiation(是否要初始化) 4.postProcessPropertyValues(修改屬性) 5.初始化(屬性填充)(populateBean) 6.postProcesstBeforeInitialization( 自定義init方法執行之前) 7.invokeinitMethods(執行自定義的init方法) 8.postProcessAfterInitialization(自定義init方法執行之后)

如果加上aware

淺談Spring中幾個PostProcessor的區別與聯系

1.postProcessBeforeInstantiation(實現這個方法可以做自定義實例化) 2.實例化 3.postProcessAfterInstantiation(是否要初始化) 4.postProcessPropertyValues(修改屬性) 5.初始化(屬性填充)(populateBean) 6.postProcesstBeforeInitialization( 自定義init方法執行之前) 7.invokeAwareMethod 8.invokeinitMethods(執行自定義的init方法) 9.postProcessAfterInitialization(自定義init方法執行之后)

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
水蜜桃久久夜色精品一区的特点 | 国产精品超碰| 精品一区亚洲| 亚洲精品91| 99视频精品| 久久高清国产| 亚洲精品乱码| 日本午夜精品久久久| 欧美日韩亚洲一区三区| 国产精品一区二区三区美女 | 久久九九精品| 精品一区在线| 中文字幕一区二区三区日韩精品| 热久久国产精品| 日韩国产在线一| 国产亚洲精品美女久久| 欧美国产极品| 蜜臀国产一区| 欧美日韩国产在线一区| 免费成人在线视频观看| 日韩av一区二区在线影视| 麻豆精品视频在线观看视频| 久久久久久色 | 国产精品一区二区中文字幕| 久久亚洲道色| 新版的欧美在线视频| 99视频在线精品国自产拍免费观看| 视频一区欧美日韩| 国产日韩视频在线| 麻豆精品蜜桃| 夜夜嗨av一区二区三区网站四季av| 免费在线观看视频一区| 欧美日韩亚洲一区在线观看| 日韩成人精品一区| 欧美91福利在线观看| 一区二区国产在线| 蜜桃久久久久| 久久美女精品| 日韩激情综合| 久久青青视频| 老司机久久99久久精品播放免费| 欧美日韩亚洲国产精品| se01亚洲视频| 午夜天堂精品久久久久| 老司机免费视频一区二区三区| 97人人精品| 在线亚洲精品| 国产精品网址| 婷婷综合激情| 国产精品videossex| 亚洲国产一区二区在线观看| 日韩欧美高清一区二区三区| 国产一区二区三区黄网站| 日韩视频精品在线观看| 国产精品成人国产| 欧美精品一卡| 国产精品a级| 欧美一区二区三区高清视频| 日本一区二区中文字幕| 欧洲一区二区三区精品| 中文无码久久精品| 日本久久精品| 日本不卡视频在线观看| 日韩av首页| 国产欧美一区二区色老头| 136国产福利精品导航网址| 日本国产亚洲| 午夜久久黄色| 97精品国产| 日韩精品久久久久久| 欧美.日韩.国产.一区.二区| 麻豆精品视频在线| 蜜桃av一区二区| 精品国产三区在线| 日韩影片在线观看| 久久精品影视| 国产精品久久久久久妇女| 男人操女人的视频在线观看欧美| 色婷婷综合网| 国产精品一区亚洲| 亚洲在线久久| 黄色不卡一区| 中文字幕在线视频久| 青草av.久久免费一区| 极品裸体白嫩激情啪啪国产精品| 国产精品久久久免费| 在线精品亚洲| 国产精品88久久久久久| 国产在线视频欧美一区| 日韩国产一二三区| 伊人久久亚洲热| а√天堂8资源在线| 国产亚洲精品美女久久 | 免费一区二区视频| 欧美三级网址| 久久亚洲精精品中文字幕| 日韩精品一区二区三区中文在线| 免费av一区| 国产传媒在线| 欧美成人精品一级| 久久激情综合网| 亚洲一区二区三区高清不卡| 色婷婷精品视频| 国产一区二区三区亚洲| 国产精品久久久久久久久免费高清 | 亚洲aa在线| 在线亚洲自拍| 999久久久精品国产| 国产成人久久精品一区二区三区| 日本免费在线视频不卡一不卡二| 国产精品7m凸凹视频分类| 久久中文字幕av| 日韩一区自拍| 四虎成人av| 黄色精品视频| 久久精品国产免费| 不卡在线一区| 五月婷婷亚洲| 午夜久久久久| 亚洲激情国产| 九一国产精品| 99在线观看免费视频精品观看| 九九色在线视频| 中文在线а√天堂| 午夜精品成人av| 日韩电影在线视频| 日韩免费看片| 久久国产主播| 激情婷婷综合| 欧美91福利在线观看| 午夜精品网站| 水蜜桃久久夜色精品一区的特点| 欧美精品一卡| 亚洲一区二区小说| 午夜精品影视国产一区在线麻豆| 亚洲一区欧美二区| 日韩中文字幕区一区有砖一区 | 99热精品久久| 黄色精品网站| 美女久久一区| 亚洲tv在线| 国产精品久久久久久久久久久久久久久| 国产精品探花在线观看| 国产高清视频一区二区| 精品国产网站| 欧美色图国产精品| 午夜久久福利| 亚洲精品精选| 久久激情综合网| 大香伊人久久精品一区二区 | 国产aa精品| 久久青草久久| 欧美在线影院| 天堂va在线高清一区| 国产麻豆一区二区三区| 国产传媒av在线| 一区在线视频观看| 色综合视频一区二区三区日韩| 欧美精品国产一区| 久久精品女人| 激情综合网五月| 日韩欧美精品一区二区综合视频| 国产精品分类| 99久久夜色精品国产亚洲狼 | 每日更新成人在线视频| 国产亚洲一区二区三区啪| 91亚洲国产| 视频一区中文字幕| 美女毛片一区二区三区四区最新中文字幕亚洲 | 亚洲福利国产| 日产欧产美韩系列久久99| 国语对白精品一区二区| 婷婷亚洲五月| 久久国内精品视频| 亚洲v在线看| 亚洲精品免费观看| 韩国一区二区三区视频| 日韩一级精品| 欧美激情视频一区二区三区免费 | 久久精品91| 日韩成人在线看| 久久中文字幕av| 欧美日韩一区二区国产| 久久激情网站| 国产欧美日韩一区二区三区四区 | 久久黄色影视| 亚洲午夜电影| 国产欧美日韩在线观看视频| 欧美黄色网页| 日本aⅴ免费视频一区二区三区| 97se综合| 91精品国产经典在线观看| 精品亚洲美女网站| 久久激情五月激情| 99riav国产精品| 精品中文在线| 亚洲香蕉久久| 99精品美女| 国产精品15p| 丝袜美腿亚洲色图|