今天本来在测试spel spring表达式赋值的,但是突然发现了一些问题,想请教一下大家,
这是我在测试时观察表达式传值时方便查看用this显示对象地址,区分到底是那个对象进入了方法,类名就是Users,就是一个普通的get/set方法
public String getName() {
System.out.println("getname"+"="+this);
return name;
}
public void setName(String name) {
System.out.println("setname"+"="+this);
this.name = name;
}
但是当我使用spring框架在spring.xml文件中做spel spring表达式赋值练习时为了确认是否传值,把默认的单例模式取消掉了,为如下代码:
<bean id="u1" class="com.qf.bean.Users" scope="prototype">
<property name="name" value="张三"></property>
<property name="age" value="15"></property>
</bean>
<bean id="u2" class="com.qf.bean.Users">
<property name="name" value="#{u1.name}"></property>
<property name="age" value="#{u1.age}"></property>
</bean>
<bean id="u3" class="com.qf.bean.Users">
<property name="name" value="#{u1.name}"></property>
<property name="age" value="#{u1.age}"></property>
</bean>
u3是为了测试u1改为了多例后u2和u3的地址是否相同用的,可以不看,然后我在测试类中准备打印对象的属性观察是否成功赋值,写了如下代码,怎么看都是没有问题的
ApplicationContext app = new ClassPathXmlApplicationContext("spring.xml");
Users u1 = (Users) app.getBean("u1");
Users u2 = (Users) app.getBean("u2");
Users u3 = (Users) app.getBean("u3");
System.out.println("================");
System.out.println("u1 = " + u1);
System.out.println(u1.getName() + "\t" + u1.getAge());
System.out.println("================");
System.out.println("u2 = " + u2);
System.out.println(u2.getName() + "\t" + u2.getAge());
System.out.println("================");
System.out.println("u3 = " + u3);
System.out.println(u3.getName() + "\t" + u3.getAge());
但是打印结果让我想不通为什么:结果为下述情况:
/*疑问
没有此对象 setname=com.qf.bean.Users@5c5a1b69
getname=com.qf.bean.Users@5c5a1b69
没有此对象 setname=com.qf.bean.Users@cd2dae5
u2 setname=com.qf.bean.Users@3a883ce7
没有此对象 setname=com.qf.bean.Users@79be0360
getname=com.qf.bean.Users@79be0360
没有此对象 setname=com.qf.bean.Users@22a67b4
u3 setname=com.qf.bean.Users@57855c9a
u1 setname=com.qf.bean.Users@d44fc21
================
u1 = com.qf.bean.Users@d44fc21
getname=com.qf.bean.Users@d44fc21
张三 15
================
u2 = com.qf.bean.Users@3a883ce7
getname=com.qf.bean.Users@3a883ce7
张三 15
================
u3 = com.qf.bean.Users@57855c9a
getname=com.qf.bean.Users@57855c9a
张三 15
*/
我是想问的我只有三个对象,走的也应该是取一次值赋一次值,走一次get走一次set啊,为什么控制台输出的this地址会出来四个没用到也没出现的对象地址,
正常我三个对象,第一个应该直接走set赋值,第二个对象通过get获取第一个对象的值再set给自己,第三个也一样,那应该是走两次get方法,三次set方法,那么另外那么多次的getset方法是谁调用的?this的地址与我的三个对象地址完全不一样,那些地址是谁的?另外那四个我标注的看地址本应该不存在的地址对应的对象是怎么出来的?哪位大神能帮我说明一下,另外那四个对象是怎么来的?