spring源码探究---beanFactory为bean对象设置属性时涉及到的类型转换

在尝试实现一个简单的beanFactory时,遇到了如何在运行时动态将字符串属性值转换为set方法所需类型的挑战。深入研究Spring源码发现,Spring通过PropertyValues存储属性值,并利用反射获取属性类型,然后使用Editor进行类型转换。如对于int类型,会使用CustomNumberEditor进行转换。Spring的处理方式是按类别的Editor进行转换,虽然有效,但可能并非最简洁的方法。
摘要由CSDN通过智能技术生成

自己想着实现一个简单点的类似Spring的beanFactory,解析下xml,通过反射调用相关的set方法来实现构建bean对象,其间遇到一个问题没找到比较好的解决方案。


现在有一个简单的bean:

public class MyBean
{
	private int id;

	public int getId()
	{
		return id;
	}

	public void setId(int id)
	{
		this.id = id;
	}
}

然后有一个简单的beans.xml

<beans>
	<bean id="myBean" class="com.iss.bean.MyBean">
		<property name="id" value="1"></property>
	</bean>
</beans>

从xml解析得到一个属性value后,是字符串类型,然后要转换成set方法的参数类型,

但是如果编译时无法得知set参数的类型,就像spring那样在运行时动态获取类型动态转换,该如何实现。

也曾想过一个个比对,但是感觉太复杂,也许有简单点的方法。

然后开始艰辛地调试spring源码….

Spring在解析了xml之后会将所有属性值与属性名存储在对应bean的PropertyValues中,

该结构维护了一个List<PropertyValue> propertyValueList,而PropertyValue则维护着单个属性的属性名和属性值。

然后通过遍历该propertyValueList,将每一个待转换的类型进行判断并转换。

在获取到bean类和属性名后,spring通过该属性的get方法的返回类型或者set方法的参数类型得到属性类型,下面即获取类型

// org.springframework.beans .GenericTypeAwarePropertyDescriptor.class
public synchronized Class getPropertyType() {
		if (this.propertyType == null) {
			if (this.readMethod != null) {
				this.propertyType = GenericTypeResolver.resolveReturnType(this.readMethod, this.beanClass);//这里的readMethod就是get方法
			}
			else {
				MethodParameter writeMethodParam = getWriteMethodParameter();//获取到set方法的参数
				if (writeMethodParam != null) {
					this.propertyType = writeMethodParam.getParameterTyp
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值