zwdzdy 2019-11-12 17:24 采纳率: 0%
浏览 479

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

今天本来在测试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条回答 默认 最新

  • 毕小宝 博客专家认证 2019-11-12 18:16
    关注

    很简单的呀,因为你的 bean id 不一样,单例的 key 是 bean id 的。
    你应该两次获取同一个 bean id 的再对比:

    Users u2_instance01 = (Users) app.getBean("u2");
    Users u2_instance02 = (Users) app.getBean("u2");
    此时 u2_instance01 == u2_instance02 就是 true
    
    评论

报告相同问题?

悬赏问题

  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 matlab有关常微分方程的问题求解决
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法