6_prepareBeanFactory方法分析

前面已经分析了refresh函数中的obtainFreshBeanFactory方法,在该方法中,如果是通过ClassPathXmlApplication的话,会在这里边进行beanFactory的创建以及xml中的bean的解析与注册。下面继续分析prepareBeanFactory方法.主要是对beanFactory进行相关的参数设置,包括classLoader,expressionResolver等

protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {

                   //设置classLoader

                   beanFactory.setBeanClassLoader(getClassLoader());

        //设置expressionResolver

                   beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));

                   beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

 

                   //增加一个ApplicationContextAwareProcessor后置处理器

                   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);

 

                   // 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);

 

                   // Register early post-processor for detecting inner beans as ApplicationListeners.

                   beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));

 

                   // Detect a LoadTimeWeaver and prepare for weaving, if found.

                   if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {

                            beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));

                            // Set a temporary ClassLoader for type matching.

                            beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));

                   }

 

                   // Register default environment beans.

                   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());

                   }

         }

在当前函数内,有几个值得我们关心的地方,就是对于EnvironmentAware,ApplicationEventPublisherAware,等接口的注入,spring是忽略了自动注入的。而是通过了一个ApplicationContextAwareProcessor后置处理器,在创建bean的时候进行注入,后面我们会提到。当前可以看一下ApplicationContextAwareProcessor处理器中的代码,如果spring容器发现你的类实现了上面几个接口的,他会自动给你注入。

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;

         }

 

         private void invokeAwareInterfaces(Object bean) {

                   if (bean instanceof Aware) {

                            if (bean instanceof EnvironmentAware) {

                                     ((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());

                            }

                            if (bean instanceof EmbeddedValueResolverAware) {

                                     ((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(this.embeddedValueResolver);

                            }

                            if (bean instanceof ResourceLoaderAware) {

                                     ((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);

                            }

                            if (bean instanceof ApplicationEventPublisherAware) {

                                     ((ApplicationEventPublisherAware) bean).setApplicationEventPublisher(this.applicationContext);

                            }

                            if (bean instanceof MessageSourceAware) {

                                     ((MessageSourceAware) bean).setMessageSource(this.applicationContext);

                            }

                            if (bean instanceof ApplicationContextAware) {

                                     ((ApplicationContextAware) bean).setApplicationContext(this.applicationContext);

                            }

                   }

         }

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值