zwdzdy
zwdzdy
2019-11-12 17:24

关于spring框架当取消bean标签默认的单例模式时多创建出来的对象是怎么来的?

  • spring
  • java
  • java-ee

今天本来在测试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的地址与我的三个对象地址完全不一样,那些地址是谁的?另外那四个我标注的看地址本应该不存在的地址对应的对象是怎么出来的?哪位大神能帮我说明一下,另外那四个对象是怎么来的?

  • 点赞
  • 回答
  • 收藏
  • 复制链接分享

1条回答