关于spring bean做用域,基于不一样的容器,会有所不一样,如BeanFactory和ApplicationContext容器就有所不一样,在本篇文章,主要讲解基于ApplicationContext容器的bean做用域。php
关于bean的做用域,在spring中,主要包括singleton,prototype,session,request,global,本篇文章主要讲解经常使用的两种,即:singleton和prototype.html
singleton为单例模式,即scope="singleton"的bean,在容器中,只实例化一次。java
dao示例代码:web
applicationContext.xmlspring
test:session
测试结果:app
分析:在测试代码中,将bean定义为singleton,并前后2次经过ApplicationContext的getBean()方法获取bean(userDao),却返回相同的实例对象:com.demo.dao.UserDao@27a5f880,仔细观察,虽然获取bean两次,可是UserDao的无参构造函数却只被调用一次,这也证实了在容器中,singleton实际只被实例化一次,须要注意的是,Singleton模式的bean,ApplicationContext加载bean时,就实例化了bean。函数
定义bean:性能
测试结果:测试
以下代码只是加载bean,却没调用getBean方法获取bean,但UserDao却被调用了一次,即实例化。
prototype即原型模式,调用多少次bean,就实例化多少次。
将singleton代码改成原型
测试代码与singleton同样,但结果却不同:
分析:经过测试结果,不难发现,调用两次bean,就实例化两次UserDao对象,且对象不同,须要注意的是,prototype类型的bean,只有在获取bean时,才会实例化对象。
(1)singleton在容器中,只被实例化一次,而prototype在容器中,调用几回,就被实例化几回;
(2)在AppplicationContext容器中,singleton在applicaitonContext.xml加载时就被预先实例化,而prototype必须在调用时才实例化
singleton:
定义bean:
测试:
prototype:
定义bean:
测试:不调用
测试:调用
4.singleton比prototype消耗性能,在web开发中,推荐使用singleton模式,在app开发中,推荐使用prototype模式。
转载博客,必须注明博客出处 博客园:http://www.cnblogs.com/wangjiming/ (侧重.NET) CSDN:https://blog.csdn.net/u010228798 (侧重JAVA) 如您有新想法,欢迎提出,邮箱:2098469527@qq.com 专业.NET之家技术QQ群:490539956 专业化Java之家QQ群:924412846 有问必答QQ群:2098469527 一对一技术辅导QQ:2098469527