初学Spring源码3.3:prepareBeanFactory(beanFactory)

prepareBeanFactory(beanFactory);

/**
 * 配置工厂的标准上下文参数,比如上下文类加载器和后处理器等
 * Configure the factory's standard context characteristics,
 * such as the context's ClassLoader and post-processors.
 * @param beanFactory the BeanFactory to configure
 */
protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
   // Tell the internal bean factory to use the context's class loader etc.
   // 设置bean的类加载器使用上下文的类加载器
   beanFactory.setBeanClassLoader(getClassLoader());
   // 设置解析器,用于解析bean的定义中出现的spel表达式
   beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
   // 添加一个属性编辑注册器,该接口有一个方法registerCustomEditors,用来设置自定义转换器
   beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));

   // Configure the bean factory with context callbacks.
   // 部署一个bean的后置处理器ApplicationContextAwareProcessor,用于将spring的环境信息注入到实例化的bean中
   beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
   // bean在初始化时,如果bean含有某些属性(比如ResourceLoaderAware),则该属性不会被依赖注入
   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 interface not registered as resolvable type in a plain factory.
   // MessageSource registered (and found for autowiring) as a bean.
   // 在普通工厂中,如果一个bean有BeanFactory.class属性,那么这个属性会被设置为beanFactory
   // 消息源会被注册(会被自动装配)为一个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.
   // 早期注册的post-processor将会被添加作为检测内部的应用监听器
   beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));

   // Detect a LoadTimeWeaver and prepare for weaving, if found.
   // aop的代码织入,如果发现beanFactory中包含loadTimeWeaver的bean,则添加一个LoadTimeWeaverAwareProcessor
   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());
   }
}

上述代码有一下几点需要注意:

  • beanFactory.addPropertyEditorRegistrar(this,getEnvironment())要配合AbstractBeanFactory.registerCustomEditor()方法一起看更好理解,addPropertyEditorRegistrar()向Set propertyEditorRegistrars = new LinkedHashSet<>(4);中添加了一个registrar,之后调用registerCustomEditor()方法时,会用到propertyEditorRegistrars 中的registrar,调用这些registrar的registerCustomEditor方法,完成自定义的转换器的设置

  • beanFactory.addBeanPostProcessor()方法来注入后置处理器,在bean实例被创建后,初始化方法执行前后,后置处理器的postProcessBeforeInitialization,postProcessAfterInitialization这两个方法会被分别调用

  • beanFactory.ingoreDependencyInterface设置了依赖注入时要忽略的接口,例如bean有个属性类型时ResourceLoaderAware,那么该属性就不会被注入ResourceLoaderAware类型的实例中

  • beanFactory.registerResovableDependency(BeanFactory.class,beanFactory)是特殊设置,如果一个bean有个属性类型是BeanFactory,那么这个bean会被设置为beanFactory这个实例(表示这个bean是个BeanFactory的实例)

    总的来说,prepareBeanFactory方法就是为BeanFactory做一些设置工作,传入一些后面会用到的参数和工具类,再在spring容器中创建一些bean

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值