Spring中的singleton和prototype的实现

 更新时间:2020年07月23日 08:49:52   作者:公大哥  
这篇文章主要介绍了Spring中的singleton和prototype的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

关于spring bean作用域,基于不同的容器,会有所不同,如BeanFactory和ApplicationContext容器就有所不同,在本篇文章,主要讲解基于ApplicationContext容器的bean作用域。

关于bean的作用域,在spring中,主要包括singleton,prototype,session,request,global,本篇文章主要讲解常用的两种,即:singleton和prototype.

一  singleton

singleton为单例模式,即scope="singleton"的bean,在容器中,只实例化一次。

dao示例代码:

package com.demo.dao;

public class UserDao {

  public UserDao(){
    System.out.println("UserDao 无参构造函数被调用");
  }
  //获取用户名
  public String getUserName(){
    //模拟dao层
    return "Alan_beijing";
  }
}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean class="com.demo.dao.UserDao" id="userDao" scope="singleton"/>
</beans>

test:

public class MyTest {

  @Test
  public void test(){
    //定义容器并初始化
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

    //定义第一个对象
    UserDao userDao = applicationContext.getBean(UserDao.class);
    System.out.println(userDao.getUserName());

    //定义第二个对象
    UserDao userDao2 = (UserDao) applicationContext.getBean("userDao");
    System.out.println(userDao2.getUserName());
    //比较两个对象实例是否是同一个对象实例
    System.out.println("第一个实例:"+userDao+"\n"+"第二个实例:"+userDao2);
  }
}

测试结果:

分析:在测试代码中,将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

prototype即原型模式,调用多少次bean,就实例化多少次。

将singleton代码改为原型

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean class="com.demo.dao.UserDao" id="userDao" scope="prototype"/>
</beans>

测试代码与singleton一样,但结果却不一样:

分析:通过测试结果,不难发现,调用两次bean,就实例化两次UserDao对象,且对象不一样,需要注意的是,prototype类型的bean,只有在获取bean时,才会实例化对象。

三 singleton和prototype区别

(1)singleton在容器中,只被实例化一次,而prototype在容器中,调用几次,就被实例化几次;

(2)在AppplicationContext容器中,singleton在applicaitonContext.xml加载时就被预先实例化,而prototype必须在调用时才实例化

singleton:

定义bean:

测试:

prototype:

定义bean:

测试:不调用

测试:调用

4.singleton比prototype消耗性能,在web开发中,推荐使用singleton模式,在app开发中,推荐使用prototype模式。

到此这篇关于Spring中的singleton和prototype的实现的文章就介绍到这了,更多相关Spring singleton和prototype内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java的equals和==的比较示例

    java的equals和==的比较示例

    这篇文章主要介绍了java的equals和==的比较示例,需要的朋友可以参考下
    2014-04-04
  • Java编程实现帕斯卡三角形代码示例

    Java编程实现帕斯卡三角形代码示例

    这篇文章主要介绍了Java编程实现帕斯卡三角形代码示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Javaweb接收表单数据并处理中文乱码

    Javaweb接收表单数据并处理中文乱码

    这篇文章主要介绍了Javaweb接收表单数据并处理中文乱码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • idea mac版打开是出现打开失败问题及解决

    idea mac版打开是出现打开失败问题及解决

    这篇文章主要介绍了idea mac版打开是出现打开失败问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Java基础异常处理代码及原理解析

    Java基础异常处理代码及原理解析

    这篇文章主要介绍了java基础异常处理代码及原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • springboot2.x整合tkmapper的示例代码

    springboot2.x整合tkmapper的示例代码

    这篇文章主要介绍了springboot2.x整合tkmapper,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • SpringBoot+Spring Data JPA整合H2数据库的示例代码

    SpringBoot+Spring Data JPA整合H2数据库的示例代码

    H2数据库是一个开源的关系型数据库,本文重点给大家介绍SpringBoot+Spring Data JPA整合H2数据库的示例代码,感兴趣的朋友跟随小编一起看看吧
    2022-02-02
  • java stringbuffer的用法示例

    java stringbuffer的用法示例

    这篇文章主要介绍了java stringbuffer的用法示例,字符串缓冲区,是一个容器(当返回到的是String时而且长度不确定,数据类型不确定时就可以用StringBuffer)其实底层还是数组,只是被封装了,对外提供了方法,初始容量为16个字符
    2014-01-01
  • java如何将Object数组转换为指定类型数组

    java如何将Object数组转换为指定类型数组

    这篇文章主要介绍了java如何将Object数组转换为指定类型数组,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 200行Java代码编写一个计算器程序

    200行Java代码编写一个计算器程序

    本篇文章给大家分享的只用200行java代码,实现一个计算器程序,不仅能够计算加减乘除,还能够匹配小括号。实现代码超简单,需要的朋友参考下吧
    2017-12-12

最新评论