Spring 中 ApplicationContext 和 BeanFactory 的区别,以及 Spring bean 作用域
2015-07-19 22:48
956 查看
//从ApplicationContext 中取 bean ApplicationContext ac = new ClassPathXmlApplicationContext ( "com/hsp/beans.xml" ) ; ac.getBean("beanId");
当我们去实例化beans.xml,该文件中配置的 bean 就被实例化(不论你用还是不用,bean对象都在那),而且该对象是singleton单例的。(每个bean都有scope属性,可以人为的设置任意的bean为单态的,scope="singleton",scope="prototype"则每获得一个bean都是全新的bean)。
优点:预先加载,使用的时候速度快。
缺点:耗内存,所有的bean都被实例化了,但是可能只用到其中的很少。
//从bean工厂取bea n BeanFactory factory = new XmlBeanFactory( new ClassPathResource ( "com/hsp/beans.xml" ) ) ; factory.getBean("beanId");
如果使用 BeanFactory 去取bean ,当你只是实例化该容器,那么容器里的 beans 不会马上被实例化,只有当你使用getBean某个bean时,才会实时的创建。
优点:节约内存。
缺点:速度慢。
关于选择:只有在移动项目里使用beanfactory,大多数项目(90%)使用的都是ApplicationContext,因为可以提前加载,只是浪费点内存。
有一点需要注意,用ApplicationContext实例化xml里的bean默认都是singleton单例的。也就是说每个bean都只有一个实例对象,不论调用多少次getBean()方法,不论有多少 ref 依赖,spring容器中都只有一个bean实例。 但是当人为设置它的scope="prototype"的时候,它就不是单例了,而且在加载xml文件的时候也不会实例化了(因为当你把它设置为prototype原型的时候,spring框架不知道你需要对这个bean创建多少个实例,所以它索性就不实例了)。
附上Spring API对 Spring bean 作用域的解释: Bean简介: 在Spring中,那些组成你应用程序的主体(backbone)及由Spring IoC容器所管理的对象,被称之为bean。 简单地讲,bean就是由Spring容器初始化、装配及管理的对象,除此之外,bean就与应用程序中的其他对象没有什么区别了。 而bean定义以及bean相互间的依赖关系将通过配置元数据来描述。 Bean的作用域: 创建一个bean定义,其实质是用该bean定义对应的类来创建真正实例的“配方(recipe)”。把bean定义看成一个配方很有意义,它与class很类似,只根据一张“处方”就可以创建多个实例。 你不仅可以控制注入到对象中的各种依赖和配置值,还可以控制该对象的作用域。这样你可以灵活选择所建对象的作用域,而不必在Java Class级定义作用域。Spring Framework支持五种作用域(其中后三种属性只能用在基于web的Spring ApplicationContext,singgleton、prototype可以用于桌面开发)。 1、singleton:当一个bean的作用域为singleton, 那么Spring IoC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。 注意:Singleton作用域是Spring中的缺省作用域。要在XML中将bean定义成singleton,可以这样配置: <bean id="empServiceImpl" class="cn.csdn.service.EmpServiceImpl" scope="singleton"> 2、prototype:一个bean定义对应多个对象实例。Prototype作用域的bean会导致在每次对该bean请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)时都会创建一个新的bean实例。 根据经验,对有状态的bean应该使用prototype作用域,而对无状态的bean则应该使用singleton作用域。
相关文章推荐
- 黑马程序员--Objective-C语言基础知识--构造方法和内存管理
- CREATE_FUNC
- 一个小程序
- Android Studio学习笔记——构建系统
- 在ios中举个简单的protocol例子,关于两个类用协议方式传值。
- Android屏幕适配全攻略
- iOS 重写 isequal方法需重写hash方法
- iOS中nil 、NULL、 Nil 、NSNull的区别详谈
- 【我们都爱Paul Hegarty】斯坦福IOS8公开课个人笔记37 TableView Delegate
- IOS应用
- 利用OpenShift托管Node.js Web服务进行微信公众号开发
- Objective-C学习笔记 复合
- Objective-C设计模式——工厂方法模式virtual constructor(对象创建)
- 一个猜数字输赢的小游戏
- android按键精灵学习_框架搭建
- Unity3d与设计模式(二)单例模式
- 微信开发处理工具类
- iOS初学者第四天
- android5.0使用svg
- 微信开发第一步—接入指南