spring,bean注入的运行顺序,singleton和prototype的深入辨析

spring随记:

bean属性,singleton,单例,默认值,调用getBean方法返回是同一个对象,实例会被缓存起来,效率比较高。当一个bean被标识为singleton时候,spring的IOC容器中只会存在一个该bean。意思就是只有一个对象,video1和video2没有区别,大家都指向同一个地址,改变一个另外一个也变。代码如下

<bean id="video" class="net.xdclass.sp.domain.Video">
<--这里scope不写,默认是singleton-->
        <property name="id" value="9"/>
        <property name="title" value="Spring5.x课程"/>
</bean>
public static void main(String[] args) {
        /**
         * ClassPathXmlApplicationContext从类路径下面开始找
         * ApplicationContext上下文接口,是spring的一个核心接口
         */
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");

        testScope(context);
    //即使不在一个函数作用域里面,也是一个对象
        Video video3=(Video)context.getBean("video");
        System.out.println("video3: "+video3.getId());
    }

    public static void testScope(ApplicationContext context){

        Video video1=(Video)context.getBean("video");
        Video video2=(Video)context.getBean("video");

        video1.setId(111);
        System.out.println("video1: "+video1.getId());
        System.out.println("video2: "+video2.getId());
        System.out.println(video1==video2);
    }

(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\1648278506672.png)]

prototype:多例,调用getBean方法创建不同的对象,会频繁的创建和销毁对象造成很大的开销

<bean id="video" class="net.xdclass.sp.domain.Video" scope="prototype">

        <property name="id" value="9"/>
        <property name="title" value="Spring5.x课程"/>

</bean>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R84CAuI2-1648282202089)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\1648278595926.png)]

除此之外,singleton和prototype还在set注入上有非常有趣的体现:

public static void main(String[] args) {
        /**
         * ClassPathXmlApplicationContext从类路径下面开始找
         * ApplicationContext上下文接口,是spring的一个核心接口
         */
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");



        //测试scope的两种属性
//        testScope(context);
//        Video video3=(Video)context.getBean("video");
//        System.out.println("video3: "+video3.getId());

        testInject(context);

    }
//测试set注入,以及与scope两种属性的关系
    public static  void testInject(ApplicationContext context){
       System.out.println("================================");
        Video video=(Video) context.getBean("video");
        VideoOrder videoOrder=(VideoOrder)context.getBean("videoOrder");
        System.out.println("================================");
        System.out.println(video.getTitle());
        System.out.println(videoOrder.getId());
    }

如果是singleton则一种bean只会调用一次,也就是只调用了一次set注入

在这里插入图片描述

如果video是prototype,则prototype所标注的bean,会调用多次,调用次数由代码中getbean所bean的次数决定。

在这里插入图片描述

现在我们将video和videoOrder都标注成prototype,就可以彻底发现他们的运行特点了!
在这里插入图片描述

现在我们可以总结了,首先,如果是singleton,它是可以在main之前运行的,类似于static代码块,而且它只有一次,但如果是prototype,他不能提前运行,必须处理到getbean方法才可以运行。而且这两个都是先执行构造函数,再执行set方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值