最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Spring中Bean的单例和多例使用代码示例
时间:2022-06-29 01:44:46 编辑:袖梨 来源:一聚教程网
本篇文章小编给大家分享一下Spring中Bean的单例和多例使用代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
Bean的单例和多例使用
在Spring中,bean可以被定义为两种模式:prototype(多例)和singleton(单例)
singleton(单例):只有一个共享的实例存在,所有对这个bean的请求都会返回这个唯一的实例。
prototype(多例):对这个bean的每次请求都会创建一个新的bean实例,类似于new。
Spring bean 默认是单例模式。
实战演示
在配置文件中,修改这句代码为:
在测试类中,修改代码为:
ApplicationContext context = new FileSystemXmlApplicationContext("applicationContext.xml"); Hi hi1 = (Hi) context.getBean("hi"); Hi hi2 = (Hi) context.getBean("hi"); System.out.println(hi1); System.out.println(hi2);
结果为:
结论:二个变量指向一个对象。
将配置文件改为:
其他的不变,运行测试类,结果为:
结论:每次访问bean,均创建一个新实例。
此外,在springBoot项目中如果要配置单例或者多例,可以在对应的bean上加一个@scope()注解
Spring单例bean与原型bean区别和创建过程
Spring官方文档中给出的bean的scope有五种
singleton
prototype
request
session
global session
实际上,Spring最基本的scope只有两种,即singleton和prototype。
可以参看spring源码中的BeanDefinition.java的定义,只有这两种:
String SCOPE_SINGLETON = ConfigurableBeanFactory.SCOPE_SINGLETON; String SCOPE_PROTOTYPE = ConfigurableBeanFactory.SCOPE_PROTOTYPE;
其他的各种scope都是自行扩展出来的。包括官网文档中没有列出来的 servletContenxt 、thread;SpringCloud提供的refresh等。
其继承关系大致如下
singletonScope与prototypeScope
singletonScope,即单例Bean,顾名思义具有单例模式的所有特性,在spring容器里面只会初始化出一个bean实例,存于缓存中。后续的请求都公用这个对象。
最简单的创建单例bean的方式,就是直接在类名上面加@Service注解。
prototypeScope,即原型Bean,每次请求时都会创建新的bean实例直接使用。
创建原型Bean,需要显示指定scope属性。
可以参看spring的 AbstractBeanFactory.java 中的 doGetBean 方法,理解两种bean的使用过程
单例bean的创建
单例bean被存放在这样一个Map中:
/** Cache of singleton objects: bean name --> bean instance */ private final MapsingletonObjects = new ConcurrentHashMap (256);
上面代码中的 getSingleton 方法,作用就是先根据beanName从map(singletonObjects)中取bean,
取不到的话,调用后面的singletonFactory的createBean方法创建单例bean(这里的createBean是抽象方法,具体实现交给了各种scope的实现类负责),
创建成功以后,存入singletonObjects,并将引用返回。
原型bean的创建
中规中矩,上来就直接创建,然后分befoew、createBean、after三个生命周期,对于具体实现提供充分的支持。
至于最后一句 getObjectForBeanInstance,如果上面创建的是一个普通bean则直接返回;如果创建的是一个BeanFactory的实例,则利用工厂实例创建新的bean,然后返回。
对于其他扩展出来的scope
会利用 接口 Scope.java 中定义的这个方法,调用各扩展scope的实现去创建bean:
// Return the object with the given name from the underlying scope, Object get(String name, ObjectFactory> objectFactory);
相关文章
- 《无限暖暖》天星之羽获得位置介绍 12-20
- 《流放之路2》重铸台解锁方法介绍 12-20
- 《无限暖暖》瞄准那个亮亮的成就怎么做 12-20
- 《无限暖暖》魔气怪终结者完成方法 12-20
- 《无限暖暖》曙光毛团获得位置介绍 12-20
- 《无限暖暖》日光果获得位置介绍 12-20