Spring基础11——Bean的作用域
1.Bean的作用域种类
Spring中的bean的作用域分为四种:singleton、prototype、session、request,后两种很少使用,下面我们主要来学习前两种
2.singleton单例模式
在Spring种我们可以通过bean标签中的scope属性对Bean的作用域进行设置,singleton是默认值,容器初始时创建bean实例,在整个容器的生命周期内只创建一这一个bean,是单例的,在程序种无论获取多少次这个bean返回的都是同一个bean,并且在容器启动的时候就会创建。
1)验证bean是否是单例的
首先配置一个singleton作用域的bean
<bean id="car" class="com.wzy.autowire.Car" scope="singleton">
<property name="brand" value="AUDI"/>
<property name="price" value="300000"/>
</bean>
执行java测试类:
public class Main {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml"); Car car = (Car) ctx.getBean("car");
Car car2 = (Car) ctx.getBean("car"); System.out.println(car == car2);
}
}
执行结果:
我们可以看到打印了执行了Car的构造方法,并且两个对象的引用时相等的,说明使用singleton模式多次返回的bean是同一个。
2)验证单例模式的bean是否在IOC容器启动时就被创建
在不改变配置文件的情况下,我们只执行下面一行代码:
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml");
输出结果:
根据输出结果我们可以观察到,我们没有去getBean,但是Car的构造方法还是执行,说明在IOC容器启动时,就将单例的对象创建好,当程序中需要这个bean直接将创建好的bean推送给程序。
3.prototype原型模式(即多例模式)
原型模式是经常使用的一种bean作用域,使用prototype作用域,容器初始化时不创建bean的实例,而在每次请求时都创建一个新的Bean实例,并返回。
1)验证bean是否是多例的
spring配置文件配置一个多例的bean:
<bean id="car" class="com.wzy.autowire.Car" scope="prototype">
<property name="brand" value="AUDI"/>
<property name="price" value="300000"/>
</bean>
我们同样来执行之前那段Java的测试代码:
public class Main {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml"); Car car = (Car) ctx.getBean("car");
Car car2 = (Car) ctx.getBean("car"); System.out.println(car == car2);
}
}
执行结果:
通过输出的结果我们可以观察到,两次获取bean的引用并不相等,说明并不是同一个bean,并且调用了两次构造方法,说明创建了两个Car类的对象。
2)验证prototype模式的bean在容器启动时是否创建
我们在不改变spring配置的情况下,只执行下面一行代码:
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans-scope.xml");
执行结果:
我们可以观察到,控制台上没有任何输出,所以我们可以得出结论,prototype模式下bean是在获取时才创建,而不是在IOC容器启动时创建的。
最新文章
- domReady的实现
- USACO翻译:USACO 2013 DEC Silver三题
- java2
- laravel DB事物
- Qt编程之mapx组件编程
- Node.js入门:文件查找机制
- oracle/node-oracledb 数据库驱动 与 Meteor 驱动包!
- C#多线程网摘 2
- [SAP ABAP开发技术总结]屏幕跳转
- SqlAlchemy初探
- ASP.NET的分页方法(一)
- Imageview使用记录
- ANDROID_MARS学习笔记_S05_006_距离传感器
- 使用Eclipse创建Hibernate工程
- 实例讲解webpack的基本使用第三篇
- 支付宝pc网页支付
- css中的em 简单教程 -- 转
- XML相关知识
- NET-SNMP基本命令
- kbmmw 5.08 正式发布
热门文章
- Spotlight_on_linux 安装和监控
- (转)python selenium-webdriver 元素操作之鼠标和键盘事件
- vue-router(转)——基本使用 + 路由守卫无限循环问题
- wannafly 挑战赛8 E 小G的项链(manecher)
- Vue的父子组件通信(转载)
- hashMap与 hashTable , ArrayList与linkedList 的区别(详细)
- 阶段3 1.Mybatis_09.Mybatis的多表操作_1 mybatis表之间关系分析
- GCC 使用-C语言编译过程
- text_to_be_present_in_element
- Java多线程学习——图片下载