springBean的作用域

淩亂°似流年 2023-10-09 15:31 110阅读 0赞

springBean的作用域

  • 一:前言
  • 二:Bean的作用域基础概念
    • 2.1 五种Bean的作用域
    • 2.2 五种Bean的作用域的解释
  • 三: bean的作用域具体实现
    • 3.1.空的AService类
    • 3.2. xml配置文件
    • 3.3. Test测试类
    • 3.4.pom文件引入的依赖
  • 四:代码分析
    • 4.1.注解方式。
    • 4.2.xml配置文件方式
  • 五:总结&提升

一:前言

最近在进行springBean的作用域学习,并且学习了对应的例子。这里进行一下总结,分享一下springBean的作用域。

二:Bean的作用域基础概念

2.1 五种Bean的作用域

如果想学习SpringBean的生命周期,那么就必须要学习Bean的作用域。因为不同的作用域的bean的生命周期不同

  1. 1:singleton(唯一bean实例,由Spring容器管理其生命周期)
  2. 2:prototype(原型bean,创建后容器不管理其生命周期)
  3. 3:request(每次http都产生新的bean,仅在http request内有效)
  4. 4:session(首次http请求创建一个实例,作用域是浏览器首次访问直至浏览器关闭)
  5. 5:global-session(全局 session 作用域,仅仅在基于 Portlet web 应用中才有意义,Spring5 已经没有了。

2.2 五种Bean的作用域的解释

  1. singleton 是默认的作用域,我们如果不对bean的scope配置项进行配置的话,默认就是Singleton类型。 在创建起容器时就同时自动创建了一个 bean 的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。
  2. prototype: 原型bean,每次对此类型的bean进行请求的时候,都会创建一个新的bean实例。与我们 java中的new效果类似。Spring 只负责创建,当容器创建了 Bean 的实例后,Bean 的实例就交给客户端代码管理,Spring 容器将不再跟踪其生命周期。
  3. request:每次HTTP请求都会创建一个新的Bean
  4. session:首次http请求创建一个实例,作用域是浏览器首次访问直至浏览器关闭
  5. global-session:作用域范围是WebApplicationContext中。一般用于Portlet应用环境,该运用域仅适用于WebApplicationContext环境。
    后三种只有在web环境下才有效。

三: bean的作用域具体实现

我针对对前两种作用域编写了一个对应的例子,这是一个普通的Maven项目,引进了spring的包。首先看一下项目结构
在这里插入图片描述

3.1.空的AService类

  1. /**
  2. * @BelongsProject: demo
  3. * @BelongsPackage: com.tfjy.test
  4. * @Author: haolizhuo
  5. * @Description: A服务类
  6. * @CreateTime: 2023-01-28 09:59
  7. * @Version: 1.0
  8. */
  9. @Component
  10. //@Scope("prototype")
  11. public class AService {
  12. }

3.2. xml配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd
  7. http://www.springframework.org/schema/context
  8. http://www.springframework.org/schema/context/spring-context-4.0.xsd">
  9. <!--开启注解的支持-->
  10. <context:annotation-config/>
  11. <!-- 自动扫描指定包及其子包下的所有Bean类 -->
  12. <context:component-scan base-package="com.tfjy.test"/>
  13. <!-- 将AService设置为原型bean-->
  14. <!-- <bean id="AService" class="com.tfjy.test.AService" scope="prototype"></bean>-->
  15. </beans>

3.3. Test测试类

  1. /**
  2. * @BelongsProject: demo
  3. * @BelongsPackage: PACKAGE_NAME
  4. * @Author: haolizhuo
  5. * @Description: test测试类
  6. * @CreateTime: 2023-01-28 10:01
  7. * @Version: 1.0
  8. */
  9. public class Test {
  10. //bean验证
  11. @org.junit.Test
  12. public void beanTest(){
  13. ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
  14. AService aServiceOne = context.getBean("AService",AService.class);
  15. AService aServiceTwo = context.getBean("AService",AService.class);
  16. System.out.println(aServiceOne);
  17. System.out.println(aServiceTwo);
  18. //通过equals方法判断两个对象是否相等
  19. if(aServiceOne.equals(aServiceTwo)){
  20. System.out.println("两次getBean方法,获得了同一个单例对象");
  21. }else{
  22. System.out.println("两次getBean方法,获得的不是同一个单例对象");
  23. }
  24. }
  25. }

3.4.pom文件引入的依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework</groupId>
  4. <artifactId>spring-webmvc</artifactId>
  5. <version>5.2.15.RELEASE</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>junit</groupId>
  9. <artifactId>junit</artifactId>
  10. <version>4.13.2</version>
  11. <scope>compile</scope>
  12. </dependency>
  13. </dependencies>

四:代码分析

上述代码中直接运行的话,是没有配置bean的作用域的。所以控制台会打印,两次getBean方法,获得了同一个单例对象
在这里插入图片描述
我们设置bean对象为prototype类型的方式也有两种。

4.1.注解方式。

  1. 在需要交由IOC容器管理的bean对象类上面添加@Scope("prototype")注解。

4.2.xml配置文件方式

  1. <bean id="AService" class="com.tfjy.test.AService" scope="prototype"></bean>

这两种方式设置任意一种,spring加载bean的时候都会去读取配置,并将对应bean设置为prototype类型。
在这里插入图片描述

五:总结&提升

在本篇博客中,我们深入学习了Spring中Bean的作用域的概念和实现方式。我们了解到不同的Bean作用域会对Bean的生命周期产生不同的影响。Spring提供了五种常用的作用域:singleton、prototype、request、session和global-session。其中singleton是默认的作用域,而后三种仅在Web环境下有效。

通过示例项目,我们展示了如何设置Bean的作用域。无论是通过注解方式还是XML配置方式,我们都可以灵活地管理Bean的生命周期和作用域。在测试中,我们验证了作用域设置的有效性,进一步加深了对Bean作用域的理解。

了解和正确使用Bean的作用域对于构建灵活、可扩展的应用程序至关重要。通过选择合适的作用域,我们可以控制对象的创建和销毁时机,提高应用程序的性能和资源利用率。

在进一步提升方面,我们可以扩展示例,探索更多复杂的应用场景,例如使用作用域管理用户会话信息、使用请求作用域处理并发请求等。此外,我们还可以深入讨论Spring容器是如何管理不同作用域的Bean实例,包括实例化、初始化和销毁等过程。

通过深入学习和理解Bean的作用域,我们可以更好地利用Spring框架的优势,构建可靠、高效的Java应用程序

发表评论

表情:
评论列表 (有 0 条评论,110人围观)

还没有评论,来说两句吧...

相关阅读

    相关 js中作用作用

    1.一段代码所在的区域,它是静态的(相对于上下文对象),在编写代码时就确定了 2.作用域可分为全局作用域,函数作用域以及ES6中的块级作用域 3.作用域可用于隔离变量,

    相关 js作用和vue作用

    js有两种作用域:全局作用域和局部作用域 1. 全局作用域 如果一个变量在所有函数外声明,那么就定义了一个全局作用域 2. 局部作用域 有两种,函数作用域和块级

    相关 作用

    \[\[scope\]\]:每个javascript函数都是一个对象,对象中有些属性我们可以访问,但有些不可以,这些属性仅供javascript引擎存取,\[\[scope\]

    相关 作用作用

    \作用域与作用域链 一、作用域 1、理解 作用域是通过函数来区分不同的作用域的,一旦在当前作用域声明了一个变量a,那么当前作用域就不能再去使用其父级作用域的a。就

    相关 作用作用

    Js 作用域和作用域链 作用域指的就是 变量和函数(方法)能在哪些区域能调用和使用,全局变量和函数(方法)能在任何地方调用,当然前提是你在声明变量(注意这里指的变量)之后调用

    相关 作用

    程序实体的访问权限有三种:包级私有的、模块级私有的和公开的。包级私有和模块级私有访问权限对应的都是代码包代码块,公开的访问权限对应的是全域代码块。然而,这个颗粒度是比较粗的,我