SpringBoot注解擴(kuò)展篇(2)-BeanFactory的前置處理

繼續(xù)接著講prepareBeanFactory()的流程,這一步的主要作用是BeanFactory的預(yù)準(zhǔn)備工作,也就是對(duì)BeanFactory進(jìn)行一些初始化后的設(shè)置;


進(jìn)入這個(gè)方法的實(shí)現(xiàn)之前,我們來(lái)看下方法上面的注釋,Configure the factory's standard context characteristics, such as the context's ClassLoader and post-processors.翻譯后的大概意思就是:設(shè)置這個(gè)BeanFactory的標(biāo)準(zhǔn)上下文特性,比如比如上下文的類加載器和后置處理器。傳進(jìn)來(lái)的參數(shù)是待配置的beanFactory。ok,看下其源碼:

protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
    beanFactory.setBeanClassLoader(getClassLoader());
        beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
        beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
        beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);       beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
beanFactory.registerResolvableDependency(ResourceLoader.class, this);
beanFactory.registerResolvableDependency(ApplicationEventPublisher.class, this);
beanFactory.registerResolvableDependency(ApplicationContext.class, this);
        beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));

        if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
            beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
        
            beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
        }

        
        if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
            beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
        }
        if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
            beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME, getEnvironment().getSystemProperties());
        }
        if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
            beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME, getEnvironment().getSystemEnvironment());
        }
    }

首先:
1.設(shè)置BeanFactoryBeanClassLoader,如果存在,則直接使用之前的那個(gè),否則,初始化一個(gè)新的ClassLoader;
2.設(shè)置BeanExpressionResolver表達(dá)式解析器,主要用來(lái)解析EL表達(dá)式;那么什么時(shí)候會(huì)進(jìn)行EL表達(dá)式的解析嘞?可以提前劇透下,也就是在Bean進(jìn)行初始化后會(huì)有屬性填充的一步,方法如下:

protected void populateBean(String beanName, RootBeanDefinition mbd, BeanWrapper bw) {

...

//屬性填充
applyPropertyValues(beanName, mbd, bw, pvs);
}

在這一步中會(huì)調(diào)用BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(this, beanName, mbd, converter); 來(lái)進(jìn)行屬性值的解析;而接下來(lái)便是通過(guò)AbstractBeanFactory中的evaluateBeanDefinitionString方法進(jìn)行解析,解析代碼如下:

protected Object evaluateBeanDefinitionString(String value, BeanDefinition beanDefinition) {
        if (this.beanExpressionResolver == null) {
            return value;
        }
        Scope scope = (beanDefinition != null ? getRegisteredScope(beanDefinition.getScope()) : null);
        return this.beanExpressionResolver.evaluate(value, new BeanExpressionContext(this, scope));
    }

然后這時(shí)候就進(jìn)到StandardBeanExpressionResolver中的evaluate方法中進(jìn)行解析了;

3.設(shè)置屬性注冊(cè)解析器PropertyEditor;這個(gè)主要是對(duì)某些注入的Bean的一些屬性的支持;
4.設(shè)置ApplicationContextAwareProcessor的支持,關(guān)于BeanPostProcessor的作用我這里不在贅述,在這個(gè)地方僅僅是注冊(cè),真是的實(shí)現(xiàn)還是在ApplicationContextAwareProcessor的內(nèi)部,先看其前置處理.

public Object postProcessBeforeInitialization(final Object bean, String beanName) throws BeansException {
        AccessControlContext acc = null;

        if (System.getSecurityManager() != null &&
                (bean instanceof EnvironmentAware || bean instanceof EmbeddedValueResolverAware ||
                        bean instanceof ResourceLoaderAware || bean instanceof ApplicationEventPublisherAware ||
                        bean instanceof MessageSourceAware || bean instanceof ApplicationContextAware)) {
            acc = this.applicationContext.getBeanFactory().getAccessControlContext();
        }

        if (acc != null) {
            AccessController.doPrivileged(new PrivilegedAction<Object>() {
                @Override
                public Object run() {
                    invokeAwareInterfaces(bean);
                    return null;
                }
            }, acc);
        }
        else {
            invokeAwareInterfaces(bean);
        }

        return bean;
    }

首先就是校驗(yàn)權(quán)限,然后就是判斷Aware的類型,然后調(diào)用invokeAwareInterfaces,這樣實(shí)現(xiàn)了這些Aware接口的Bean在被初始化之后就能取到響應(yīng)的資源.
再看其后置處理器,啥事沒(méi)干,直接返回Bean:

public Object postProcessAfterInitialization(Object bean, String beanName) {
        return bean;
    }

接下來(lái)就是設(shè)置忽略自動(dòng)裝配的屬性:

beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
        beanFactory.ignoreDependencyInterface(EmbeddedValueResolverAware.class);
        beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
        beanFactory.ignoreDependencyInterface(ApplicationEventPublisherAware.class);
        beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
        beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);

當(dāng)Spring將ApplicationContextAwareProcessor注冊(cè)后,已經(jīng)注冊(cè)了EnvironmentAware.class, EmbeddedValueResolverAware.class, ResourceLoaderAware.class, ApplicationEventPublisherAware.class,
MessageSourceAware.class,
ApplicationContextAware.class,
這些內(nèi)容,那么在Spring做Bean的注入的時(shí)候肯定是要忽略他們的;

再往下走就是注冊(cè)依賴了,這里沒(méi)啥好說(shuō)的,就是當(dāng)檢查到依賴時(shí),將依賴的實(shí)例進(jìn)行注冊(cè);
接下來(lái)又是注冊(cè)后置處理器ApplicationListenerDetector,這里主要是檢測(cè)是否有事件監(jiān)聽(tīng);
以及判斷是否有對(duì)編譯時(shí)AspectJ的支持,這些都是通過(guò)后置處理器來(lái)完成的,最后主要是給BeanFactory注冊(cè)一些能通用的組件。

好了,這一節(jié)內(nèi)容不多,感覺(jué)自己說(shuō)了好多廢話,但是也是為了能將內(nèi)容講明白,不足之處望大街指出,下一節(jié)我們講BeanFactory的后置處理,敬請(qǐng)期待!

最后編輯于
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

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