bena计息
表达式处理器
// 设置beanfactory的表达式语言处理器
beanFactory.setBeanExpressionResolver(new StandardBeanExpressionResolver(beanFactory.getBeanClassLoader()));
属性解析器
// 为beanFactory增加一个默认的propertyEditor,这个主要是对bean的属性等设置管理的一个工具类
beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
属性解析器分类
原有的属性解析器:ResourceEditorRegistrar解析器,spring中new创建的解析器,直接添加到beanfactory中。
自定义属性解析器:自己实现的解析器,注册器配置类CustomEditorConfigurer,类中有注册器集合,类实现
BeanFactoryPostProcessor接口,启动的时候回调用bfpp,讲对应的注册器注册到bf中。
类的继承关系
注册器:
属性注册器:
注册流程到bf中(todo)
自定义属性解析器
例如解析如下属性: Address
public class Customer {
private String name;
private Address address;
}
public class Address {
private String province;
private String city;
private String town;
}
1、自定义实现PropertyEditorSupport接口的编辑器。
public class AddressPropertyEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
String[] s = text.split("_");
Address address = new Address();
address.setProvince(s[0]);
address.setCity(s[1]);
address.setTown(s[2]);
this.setValue(address);
}
}
2、让spring能够识别到此编辑器,自定义实现一个属性编辑器的注册器,实现了PropertyEditorRegistrar接口。
public class AddressPropertyEditorRegistrar implements PropertyEditorRegistrar {
@Override
public void registerCustomEditors(PropertyEditorRegistry registry) {
registry.registerCustomEditor(Address.class,new AddressPropertyEditor());
}
}
3、让spring能够识别到对应的注册器。
<bean id="customer" class="com.mashibing.e_bf_prepared.Customer">
<property name="name" value="zhangsan "></property>
<property name="address" value="河北省_邯郸市_武安市"></property>
</bean>
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="propertyEditorRegistrars">
<list>
<bean class="com.mashibing.e_bf_prepared.AddressPropertyEditorRegistrar"></bean>
</list>
</property>
</bean>
注册到bean warpper中
解析过程
注册系统环境。
environment:当前环境变量。
systemProperties:环境变量的属性值。
systemEnvironment:系统环境。
// 注册默认的系统环境bean到一级缓存中
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());
}