Bean的作用域

Bean的作用域

在Spring框架中,Bean的作用域(Bean Scope)定义了Spring容器中Bean对象的生命周期及其创建实例的方式。Spring提供了五种常用的作用域,每种作用域决定了Bean实例的创建、缓存和共享方式。

1. Singleton(单例)

  • 描述: 在整个Spring容器中,Bean只会创建一个实例,并且每次获取该Bean时,返回的都是同一个实例。
  • 适用场景: 适用于无状态的Bean,如服务类、工具类等。
  • 默认作用域: 如果不指定,Bean默认就是单例的。
  • 生命周期: Spring容器初始化时创建,容器关闭时销毁。
  • 配置
    <bean id="myBean" class="com.example.MyBean" scope="singleton"/>
    

 测试:

@Test
public void testScope(){
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-scope.xml");

    SpringBean sb1 = applicationContext.getBean("myBean", SpringBean.class);
    System.out.println(sb1);

    SpringBean sb2 = applicationContext.getBean("myBean", SpringBean.class);
    System.out.println(sb2);
}

b8f1c6dc08fd41b3aab9a16506a48f89.png

根据测试图片可知,打印的都是一个对象的地址,因此spring默认的是单例模式,也就是只存在一个实例。

这个对象在什么时候创建的呢?

public class SpringBean {
    public SpringBean() {
        System.out.println("SpringBean的无参数构造方法执行。");
    }
}
@Test
public void testScope(){
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-scope.xml");
}

bd3509fde940423d989d852434c70e80.png

 默认情况下,Bean对象的创建是在初始化Spring上下文的时候就完成的。

2. Prototype(原型)

  • 描述: 每次获取该Bean时,都会创建一个新的实例。
  • 适用场景: 适用于有状态的Bean,或者需要频繁创建的对象,如用户会话信息、表单数据等。
  • 生命周期: Bean不会在Spring容器启动时创建,而是在每次请求时创建,并且不会自动管理Bean的销毁。
  • 配置:
    <bean id="myBean" class="com.example.MyBean" scope="prototype"/>
    

     

3. Request(仅用于Web应用):

  • 描述: 在一次HTTP请求中,Bean的生命周期与该请求绑定。每个请求都会创建一个新的Bean实例。
  • 适用场景: 适用于处理单次HTTP请求的Bean。
  • 生命周期: 请求开始时创建,请求结束时销毁。
  • 配置:
    <bean id="myBean" class="com.example.MyBean" scope="request"/>
    

4. Session(仅用于Web应用):

  • 描述: Bean的生命周期与HTTP会话绑定。每个会话中Bean只会创建一个实例,不同会话中Bean实例是独立的。
  • 适用场景: 适用于处理与用户会话相关的数据,如购物车、用户偏好等。
  • 生命周期: 会话开始时创建,销毁时销毁。
  • 配置:
    <bean id="myBean" class="com.example.MyBean" scope="globalSession"/>
    

注意3,4这两种情况需要引入依赖 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>spring6-003-scrop</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>22</maven.compiler.source>
        <maven.compiler.target>22</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
//      在这里引入springmvc的框架
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>6.1.13</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.1.5-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

        <!--log4j2的依赖-->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.19.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j2-impl</artifactId>
            <version>2.19.0</version>
        </dependency>

    </dependencies>

</project>

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值