Spring框架中如何具体实现singleton和prototype模式?

2026-05-24 11:451阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计973个文字,预计阅读时间需要4分钟。

Spring框架中如何具体实现singleton和prototype模式?

关于Spring Bean的作用域,基于不同的容器会有所不同。例如,BeanFactory和ApplicationContext容器就存在差异。在本章节中,主要讲解基于ApplicationContext容器的bean作用域。

在Spring框架中,bean的作用域定义了bean实例的生命周期和可重用性。以下是一些常见的作用域:

1. singleton(单例):这是默认的作用域,Spring容器中只会创建一个bean实例,并在整个应用中共享这个实例。

2.prototype(原型):每次请求都会创建一个新的bean实例。

3.request:每次HTTP请求都会创建一个新的bean实例,仅在该请求的范围内有效。

4.session:每次HTTP会话都会创建一个新的bean实例,仅在该会话的范围内有效。

5.global session:每个全局的HTTP会话共享一个bean实例,仅适用于Portlet环境。

在ApplicationContext容器中,bean的作用域主要影响bean的生命周期和依赖注入。例如,在singleton作用域下,bean的依赖注入通常在容器启动时完成;而在prototype作用域下,依赖注入则是在每次请求时完成。

了解bean的作用域有助于更好地管理和复用资源,提高应用性能。

关于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="www.springframework.org/schema/beans" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="www.springframework.org/schema/beans 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="www.springframework.org/schema/beans" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="www.springframework.org/schema/beans 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:

测试:不调用

测试:调用

Spring框架中如何具体实现singleton和prototype模式?

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

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

本文共计973个文字,预计阅读时间需要4分钟。

Spring框架中如何具体实现singleton和prototype模式?

关于Spring Bean的作用域,基于不同的容器会有所不同。例如,BeanFactory和ApplicationContext容器就存在差异。在本章节中,主要讲解基于ApplicationContext容器的bean作用域。

在Spring框架中,bean的作用域定义了bean实例的生命周期和可重用性。以下是一些常见的作用域:

1. singleton(单例):这是默认的作用域,Spring容器中只会创建一个bean实例,并在整个应用中共享这个实例。

2.prototype(原型):每次请求都会创建一个新的bean实例。

3.request:每次HTTP请求都会创建一个新的bean实例,仅在该请求的范围内有效。

4.session:每次HTTP会话都会创建一个新的bean实例,仅在该会话的范围内有效。

5.global session:每个全局的HTTP会话共享一个bean实例,仅适用于Portlet环境。

在ApplicationContext容器中,bean的作用域主要影响bean的生命周期和依赖注入。例如,在singleton作用域下,bean的依赖注入通常在容器启动时完成;而在prototype作用域下,依赖注入则是在每次请求时完成。

了解bean的作用域有助于更好地管理和复用资源,提高应用性能。

关于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="www.springframework.org/schema/beans" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="www.springframework.org/schema/beans 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="www.springframework.org/schema/beans" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="www.springframework.org/schema/beans 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:

测试:不调用

测试:调用

Spring框架中如何具体实现singleton和prototype模式?

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

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