001-BeanPostProcessor

1.目的

以前也稍微了解spring的源碼,最近在研究研究,記錄一下心得。
今天就針對(duì)spring中BeanPostProcessor的理解進(jìn)行加深一下。

2.BeanPostProcessor是什么?

spring中基礎(chǔ)對(duì)象都是bean! 那么beanPostProcessor也是一個(gè)bean,只不過(guò)多了一層關(guān)系,實(shí)現(xiàn)BeanPostProcessor接口。

2.1.beanPostProcessor如何被識(shí)別出來(lái)的?

在AbstractApplicationContext方法中registerBeanPostProcessors()
代碼行數(shù):
版本:spring-core-3.0.0.RELEASE-sources.jar
方法中:AbstractApplicationContext.registerBeanPostProcessors() 401行

        registerBeanPostProcessors(beanFactory);
    protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
        String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);

2.2.beanPostProcessor中的方法何時(shí)被調(diào)用?

在bean初始化的時(shí)候,也就是Spring激活bean的init-method方法的前后,會(huì)調(diào)用BeanPostProcessor的postProcessBeforeInitialization方法和postProcessAfterInitialization。
代碼行數(shù):
版本:spring-core-3.0.0.RELEASE-sources.jar
方法中:AbstractAutowireCapableBeanFactory.initializeBean()
1394
1407

        
        Object wrappedBean = bean;
        if (mbd == null || !mbd.isSynthetic()) {
            wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
        }

        try {
            invokeInitMethods(beanName, wrappedBean, mbd);
        }
        catch (Throwable ex) {
            throw new BeanCreationException(
                    (mbd != null ? mbd.getResourceDescription() : null),
                    beanName, "Invocation of init method failed", ex);
        }

        if (mbd == null || !mbd.isSynthetic()) {
            wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
        }

3.分析一下BeanPostProcessor的實(shí)現(xiàn)類ApplicationContextAwareProcessor

3.1.ApplicationContextAwareProcessor的作用?

如果bean實(shí)現(xiàn)ApplicationContextAware的接口,那么就會(huì)將applicationContext注入到這個(gè)bean中。

3.2.ApplicationContextAwareProcessor實(shí)現(xiàn)原理:

1.添加到容器中:在AbstractApplicationContext的refresh方法中的prepareBeanFactory(beanFactory);方法。添加了ApplicationContextAwareProcessor處理器

     protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
     // Tell the internal bean factory to use the context's class loader etc.
     beanFactory.setBeanClassLoader(getClassLoader());
     beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
     beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

     // Configure the bean factory with context callbacks.
     beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
     beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
     beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
     beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
     beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
     beanFactory.ignoreDependencyInterface(EnvironmentAware.class);

     // BeanFactory interface not registered as resolvable type in a plain factory.
     // MessageSource registered (and found for autowiring) as a bean.
     beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
     beanFactory.registerResolvableDependency(ResourceLoader.class, this);
     beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
     beanFactory.registerResolvableDependency(ApplicationContext.class, this);

     .....
     ...
     ..
}

2.調(diào)用地方:ApplicationContextAwareProcessor是繼承了BeanPostProcessor接口。在bean初始化的時(shí)候,也就是Spring激活bean的init-method方法的前后,會(huì)調(diào)用BeanPostProcessor的postProcessBeforeInitialization方法和postProcessAfterInitialization。

          if (bean instanceof ApplicationContextAware) {
                ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);
           }

3.3.ApplicationContextAware的作用。

通過(guò)對(duì)ApplicationContextAwareProcessor的分析,我們可以清楚的了解ApplicationContextAware的作用:對(duì)當(dāng)前bean傳入對(duì)應(yīng)的Spring上下文。(即得到applicationContext)

3.4.ApplicationContextAware的使用實(shí)例。

請(qǐng)點(diǎn)擊以下的文章(自己看)
請(qǐng)點(diǎn)擊---文章1

3.5.ApplicationContextAwareProcessor的使用實(shí)例

請(qǐng)點(diǎn)擊---[文章2](https://blog.csdn.net/qq_34310242/article/details/78266590)

4.參考目錄

推薦:https://blog.csdn.net/mdq11111/article/details/79050280

推薦:http://www.itdecent.cn/p/2692bf784976

http://www.itdecent.cn/p/a90a3e617ba6

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容