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);
}

根据测试图片可知,打印的都是一个对象的地址,因此spring默认的是单例模式,也就是只存在一个实例。
这个对象在什么时候创建的呢?
public class SpringBean {
public SpringBean() {
System.out.println("SpringBean的无参数构造方法执行。");
}
}
@Test
public void testScope(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-scope.xml");
}

默认情况下,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>
1万+

被折叠的 条评论
为什么被折叠?



