13.Spring源码解析-prepareBeanFactory

13.Spring源码解析-prepareBeanFactory_第1张图片
点进去
13.Spring源码解析-prepareBeanFactory_第2张图片此处是 Spel表达式设置

BeanExpressionResolver

此接口只有一个实现: StandardBeanExpressionResolver。接口只含有一个方法:

Object evaluate(String value, BeanExpressionContext evalContext) 

prepareBeanFactory将一个此对象放入BeanFactory:

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

StandardBeanExpressionResolver对象内部有一个关键的成员: SpelExpressionParser,其整个类图:
13.Spring源码解析-prepareBeanFactory_第3张图片
Spel表达式的应用示例后续会给出来。
13.Spring源码解析-prepareBeanFactory_第4张图片
此处是设置PropertyEditor

PropertyEditorRegistrar

此接口用于向Spring注册java.beans.PropertyEditor,只有一个方法:

registerCustomEditors(PropertyEditorRegistry registry)

实现也只有一个: ResourceEditorRegistrar。
在编写xml配置时,我们设置的值都是字符串形式,所以在使用时肯定需要转为我们需要的类型,PropertyEditor接口正是定义了这么个东西。
prepareBeanFactory:

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

BeanFactory也暴露了registerCustomEditors方法用以添加自定义的转换器,所以这个地方是组合模式的体现。
我们有两种方式可以添加自定义PropertyEditor:

  • 通过context.getBeanFactory().registerCustomEditor
  • 通过Spring配置文件:
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
  <property name="customEditors">
    <map>
      <entry key="base.Cat" value="base.CatEditor" /> 
    map>
  property>
bean>

参考: 深入理解JavaBean(2):属性编辑器PropertyEditor

13.Spring源码解析-prepareBeanFactory_第5张图片

环境注入

在Spring中我们自己的bean可以通过实现EnvironmentAware等一系列Aware接口获取到Spring内部的一些对象。prepareBeanFactory:

beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)); 

ApplicationContextAwareProcessor核心的invokeAwareInterfaces方法:

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);
        }
        //....
    }
}
依赖解析忽略

此部分设置哪些接口在进行依赖注入的时候应该被忽略:
13.Spring源码解析-prepareBeanFactory_第6张图片
上图依赖解析忽略

bean伪装

有些对象并不在BeanFactory中,但是我们依然想让它们可以被装配,这就需要伪装一下
13.Spring源码解析-prepareBeanFactory_第7张图片
伪装关系保存在一个Map, Object>里。

LoadTimeWeaver

如果配置了此bean,那么:
13.Spring源码解析-prepareBeanFactory_第8张图片

这个东西具体是干什么的在后面context:load-time-weaver中说明。

注册环境

13.Spring源码解析-prepareBeanFactory_第9张图片
containsLocalBean特殊之处在于不会去父BeanFactory寻找。

你可能感兴趣的:(springIOC,spring,java,后端)