此接口只有一个实现: StandardBeanExpressionResolver。接口只含有一个方法:
Object evaluate(String value, BeanExpressionContext evalContext)
prepareBeanFactory将一个此对象放入BeanFactory:
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
StandardBeanExpressionResolver对象内部有一个关键的成员: SpelExpressionParser,其整个类图:
Spel表达式的应用示例后续会给出来。
此处是设置PropertyEditor
此接口用于向Spring注册java.beans.PropertyEditor,只有一个方法:
registerCustomEditors(PropertyEditorRegistry registry)
实现也只有一个: ResourceEditorRegistrar。
在编写xml配置时,我们设置的值都是字符串形式,所以在使用时肯定需要转为我们需要的类型,PropertyEditor接口正是定义了这么个东西。
prepareBeanFactory:
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
BeanFactory也暴露了registerCustomEditors方法用以添加自定义的转换器,所以这个地方是组合模式的体现。
我们有两种方式可以添加自定义PropertyEditor:
<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);
}
//....
}
}
此部分设置哪些接口在进行依赖注入的时候应该被忽略:
上图依赖解析忽略
有些对象并不在BeanFactory中,但是我们依然想让它们可以被装配,这就需要伪装一下
伪装关系保存在一个Map
这个东西具体是干什么的在后面context:load-time-weaver中说明。