Spring容器中的组件,及自定义属性编辑器
文章目录
一、Spring容器中的组件及配合机理
1.1 物料组件
Resource
、BeanDefinition
、PropertyEditor
、及最终的Bean
。
它们是加工流程中被加工、被消费的组件、就像流水线上被加工的物料一样。
1.2 设备组件
ResourceLoader
、BeanDefinitionReader
、BeanFactoryPostProcessor
、InstantiationStrategy
、BeanWrapper
。
它们就像流水线上不同环节的加工设备,对物料组件进行加工处理。
1.3 配合机理
(1)ResourceLoader
加载配置信息,并使用Resource
表示这个配置文件资源;
(2)BeanDefinitionReader
读取Resource
所指向的配置文件资源,解析配置文件,将每个<bean>
解析成一个BeanDefinition
对象,并保存到**BeanDefinitionRegistry
**中;
(3)BeanFactoryPostProcessor
对BeanDefinition
进行加工处理,情况一:对使用占位符的<bean>
元素标签进行解析,得到最终的配置值。情况二:获取PropertyEditor
,将PropertyEditor
注册到Spring容器的属性编辑器注册表中;
(4)InstantiationStrategy
着手进行Bean
实例化工作;
(5)BeanWrapper
对Bean
的属性进行设置;
(6)BeanFactoryPostProcessor
对Bean
进行后续的寄送处理;
二、BeanDefinition
BeanDefinition
就像<bean>
的镜中人,二者是一一对应。
三、InstantiationStrategy
InstantiationStrategy
负责根据BeanDefinition
对象创建一个Bean
实例。
四、BeanWrapper
Spring委托BeanWrapper
完成Bean属性的填充工作。
五、属性编辑器(类型转换器)
Spring在PropertyEditorRegistrySyooirt
中为常见属性类型提供了默认的属性编辑器。
六、自定义属性编辑器
6.1 自定义属性编辑器
/**
* 自定义属性编辑器
*
* @Date 2020/5/31
* @Author lifei
*/
public class CustomCarEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
if (text==null || text.indexOf(",")==-1){
throw new IllegalArgumentException("设置的字符串格式不正确");
}
String[] infos = text.split(",");
Car car = new Car();
car.setBrand(infos[0]);
car.setColor(infos[1]);
car.setMaxSpeed(Integer.parseInt(infos[2]));
// 调用父类的setValue() 方法设置转换后的属性对象
setValue(car);
}
}
6.2 注册属性编辑器
<!-- 注册属性编辑器-->
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="com.hef.beans.Car" value="com.hef.editor.CustomCarEditor"/>
</map>
</property>
</bean>
6.3 使用自定义的属性编辑器
<!-- 使用自定义的编辑器-->
<bean id="bossCustom" class="com.hef.beans.Boss" p:name="customBoss" p:car="自定义,黑色,137"/>