点进去
此处是 Spel表达式设置
BeanExpressionResolver
此接口只有一个实现: StandardBeanExpressionResolver。接口只含有一个方法:
Object evaluate(String value, BeanExpressionContext evalContext)
prepareBeanFactory将一个此对象放入BeanFactory:
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
StandardBeanExpressionResolver对象内部有一个关键的成员: SpelExpressionParser,其整个类图:
Spel表达式的应用示例后续会给出来。
此处是设置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
环境注入
在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);}//....}
}
依赖解析忽略
此部分设置哪些接口在进行依赖注入的时候应该被忽略:
上图依赖解析忽略
bean伪装
有些对象并不在BeanFactory中,但是我们依然想让它们可以被装配,这就需要伪装一下
伪装关系保存在一个Map<Class<?>, Object>里。
LoadTimeWeaver
如果配置了此bean,那么:
这个东西具体是干什么的在后面context:load-time-weaver中说明。
注册环境
containsLocalBean特殊之处在于不会去父BeanFactory寻找。