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容器启动时创建的。

最新文章

  1. domReady的实现
  2. USACO翻译:USACO 2013 DEC Silver三题
  3. java2
  4. laravel DB事物
  5. Qt编程之mapx组件编程
  6. Node.js入门:文件查找机制
  7. oracle/node-oracledb 数据库驱动 与 Meteor 驱动包!
  8. C#多线程网摘 2
  9. [SAP ABAP开发技术总结]屏幕跳转
  10. SqlAlchemy初探
  11. ASP.NET的分页方法(一)
  12. Imageview使用记录
  13. ANDROID_MARS学习笔记_S05_006_距离传感器
  14. 使用Eclipse创建Hibernate工程
  15. 实例讲解webpack的基本使用第三篇
  16. 支付宝pc网页支付
  17. css中的em 简单教程 -- 转
  18. XML相关知识
  19. NET-SNMP基本命令
  20. kbmmw 5.08 正式发布

热门文章

  1. Spotlight_on_linux 安装和监控
  2. (转)python selenium-webdriver 元素操作之鼠标和键盘事件
  3. vue-router(转)——基本使用 + 路由守卫无限循环问题
  4. wannafly 挑战赛8 E 小G的项链(manecher)
  5. Vue的父子组件通信(转载)
  6. hashMap与 hashTable , ArrayList与linkedList 的区别(详细)
  7. 阶段3 1.Mybatis_09.Mybatis的多表操作_1 mybatis表之间关系分析
  8. GCC 使用-C语言编译过程
  9. text_to_be_present_in_element
  10. Java多线程学习——图片下载