spring源码(属性填充(填充具体属性))

前面我们在对引用属性和@Autowired注解标注的属性进行赋值之后,接下来我们对具体的属性进行赋值。

先贴一下自己写的代码

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">

    <!--给复杂类型的赋值都在property标签内进行-->
    <bean id="person" class="com.mashibing.populateBean.Person" >
        <property name="name">
            <!--赋空值-->
            <null></null>
        </property>
        <!--通过ref引用其他对象,引用外部bean-->
        <property name="address" ref="address"></property>
        <!--引用内部bean-->
        <!-- <property name="address">
             <bean class="com.mashibing.bean.Address">
                 <property name="province" value="北京"></property>
                 <property name="city" value="北京"></property>
                 <property name="town" value="西城区"></property>
             </bean>
         </property>-->
        <!--为list赋值-->
        <property name="books">
            <list>
                <!--内部bean-->
                <bean id="book1" class="com.mashibing.populateBean.Book">
                    <property name="name" value="童话故事"></property>
                    <property name="author" value="作者"></property>
                    <property name="price" value="1000"></property>
                </bean>
                <!--外部bean-->
                <ref bean="book2"></ref>
            </list>
        </property>
        <!--给map赋值-->
        <property name="maps" ref="myMap"></property>
        <!--给property赋值-->
        <property name="properties">
            <props>
                <prop key="aaa">aaa</prop>
                <prop key="bbb">222</prop>
            </props>
        </property>
        <!--给数组赋值-->
        <property name="hobbies">
            <array>
                <value>book</value>
                <value>movie</value>
                <value>game</value>
            </array>
        </property>
        <!--给set赋值-->
        <property name="sets">
            <set>
                <value>111</value>
                <value>222</value>
                <value>222</value>
            </set>
        </property>
    </bean>
    <bean id="address" class="com.mashibing.populateBean.Address">
        <property name="province" value="河北"></property>
        <property name="city" value="邯郸"></property>
        <property name="town" value="武安"></property>
    </bean>
    <bean id="book2" class="com.mashibing.populateBean.Book">
        <property name="name" value="JVM"></property>
        <property name="author" value="马士兵"></property>
        <property name="price" value="1200"></property>
    </bean>
    <!--级联属性-->
    <bean id="person2" class="com.mashibing.populateBean.Person" >
        <property name="address" ref="address"></property>
        <property name="address.province" value="北京"></property>
    </bean>
    <!--util名称空间创建集合类型的bean-->
    <util:map id="myMap">
        <entry key="key1" value="value1"></entry>
        <entry key="key2" value-ref="book2"></entry>
        <entry key="key03">
            <bean class="com.mashibing.populateBean.Book">
                <property name="name" value="西游记" ></property>
                <property name="author" value="吴承恩" ></property>
                <property name="price" value="100" ></property>
            </bean>
        </entry>
    </util:map>
    <context:component-scan base-package="com.mashibing.populateBean.annotation"></context:component-scan>

然后我们启动程序,断点打到applyPropertyValues

有哪些属性需要我们进行赋值,我们打开pvs看一下

 现在对象的赋值情况

 点进去,看这个方法

走到这所有的属性都是未转换过的属性,

接着往下走

接着往下走

点进resolveValueIfNecessary方法看一下

以address属性为例,在注入的时候就进入RuntimeBeanReference类型

点进入

点进去

点进去

看一下parseExpression方法

 点进去

 到这里我们执行到了这里

到此返回一个对应这个属性名称的Object类型的值。

接下来会针对这个object类型的对象进行转换

点进去

 点进去

点进去

 点进去

接着往下看

 点进去,前面的方法不看,

 点进去

可以看到将其封装到一个LinkedHashMap的集合中。

到此类型转换完成,接着就把它方法创建出来的深拷贝对象中去

 for循环反复执行上述操作,接着往下走

 到此applyPropertyValues执行完毕,也就是populate执行完毕。

扩展

浅拷贝和深拷贝的区别:(A对象拷贝到B对象)

浅拷贝:如果是基本数据类型,那么将数据拷贝给B对象。如果是引用数据类型,那么将A对象的引用地址赋值给B对象。当对A的引用属性进行修改的时候,因为存储的相同的地址,B对象也会被影响到。

深拷贝:再创建一个独立的空间给B对象,然后将A的所有值拷贝赋值给B对象。当对A 的属性进行修改时,不会影响B对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值