bean属性解析

164 阅读1分钟

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中。

类的继承关系

注册器: image.png 属性注册器: 未命名文件 (4).png

注册流程到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中

未命名文件 (6).png

解析过程

注册系统环境。

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());
}