前面我们在对引用属性和@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对象