单例bean不仅仅是可以通过<bean/>标签来定义多个bean,还可以只定义一个bean,然后在代码中通过不同的ApplicationContext来获取到不同的bean(如下面的单例bean与单例模式的区别里面的代码)

单例bean与单例模式的区别

Spring单例Bean与单例模式的区别在于它们关联的环境不一样,单例模式是指在一个JVM进程中仅有一个实例,而Spring单例是指一个Spring Bean容器(ApplicationContext)中仅有一个实例。

首先看单例模式,在一个JVM进程中(理论上,一个运行的JAVA程序就必定有自己一个独立的JVM)仅有一个实例,于是无论在程序中的何处获取实例,始终都返回同一个对象,以Java内置的Runtime为例(现在枚举是单例模式的最佳实践),无论何时何处获取,下面的判断始终为真:


//  基于懒汉模式实现

//  在一个JVM实例中始终只有一个实例

Runtime.getRuntime() == Runtime.getRuntime()

与此相比,pring的单例Bean是与其容器(ApplicationContext)密切相关的,所以在一个JVM进程中,如果有多个Spring容器,即使是单例bean,也一定会创建多个实例,代码示例如下:


//  第一个Spring Bean容器

ApplicationContext context_1 = new FileSystemXmlApplicationContext("classpath:/ApplicationContext.xml");

Person yiifaa_1 = context_1.getBean("yiifaa", Person.class);

//  第二个Spring Bean容器

ApplicationContext context_2 = new FileSystemXmlApplicationContext("classpath:/ApplicationContext.xml");

Person yiifaa_2 = context_2.getBean("yiifaa", Person.class);

//  这里绝对不会相等,因为创建了多个实例

System.out.println(yiifaa_1 == yiifaa_2);

以下是Spring的配置文件:


<!-- 即使声明了为单例,只要有多个容器,也一定会创建多个实例 -->

<bean id="yiifaa" class="com.stixu.anno.Person" scope="singleton">

    <constructor-arg name="username">

        <value>yiifaa</value>

    </constructor-arg>

</bean>

单例池

单例池就是为了实现单例bean定义的一个hashMap,详情看我另一篇文章(单例bean和原型bean的区别、单例池是啥)。

面试结束复盘查漏补缺

每次面试都是检验自己知识与技术实力的一次机会,面试结束后建议大家及时总结复盘,查漏补缺,然后有针对性地进行学习,既能提高下一场面试的成功概率,还能增加自己的技术知识栈储备,可谓是一举两得。

以下最新总结的阿里P6资深Java必考题范围和答案,包含最全MySQL、Redis、Java并发编程等等面试题和答案,用于参考~

资料免费领取方式:点赞关注后,戳这里免费领取

重要的事说三遍,关注+关注+关注!

历经30天,说说我的支付宝4面+美团4面+拼多多四面,侥幸全获Offer

image.png

更多笔记分享

历经30天,说说我的支付宝4面+美团4面+拼多多四面,侥幸全获Offer