类型

XML配置文件定义Scope时,bean标签使用scope属性即可

Scope 描述
singleton spring IoC容器只存在一个bean对象实例。
prototype 与单例相反,每次请求bean时,它都会创建一个新实例。
request HTTP请求(Request) 的完整生命周期中,将创建并使用单个实例。 只适用于web环境中Spring ApplicationContext中有效。
session HTTP会话(Session) 的完整生命周期中,将创建并使用单个实例。 只适用于web环境中Spring ApplicationContext中有效。
application 将在ServletContext的完整生命周期中创建并使用单个实例。只适用于web环境中Spring ApplicationContext中有效。
websocket 在WebSocket的完整生命周期中,将创建并使用单个实例。 只适用于web环境中Spring ApplicationContext中有效。

singleton和prototype的区别

singleton

多次获取同一个bean时,获取到的是同一个对象,这是Spring默认的,可以不用说明(即bean标签可以省略scope属性)

beans.xml

1
2
3
4
5
6
7
8
9
10
<?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 id="user" class="entity.User">
<property name="id" value="1"/>
<property name="name" value="tom"/>
</bean>
</beans>

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import config.MyConfig;
import entity.Student;
import entity.StudentClass;
import entity.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
* @author LeDao
* @company
* @create 2022-02-12 15:56
*/
public class MyTest {

public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User user1 = context.getBean("user", User.class);
User user2 = context.getBean("user", User.class);
System.out.println(user1==user2);
}
}

结果

控制台打印出true

prototype

多次获取同一个bean时,获取到的是不同的对象,因为每一次获取都会生成一个新的对象

beans.xml

1
2
3
4
5
6
7
8
9
10
<?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 id="user" class="entity.User" scope="prototype">
<property name="id" value="1"/>
<property name="name" value="tom"/>
</bean>
</beans>

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import config.MyConfig;
import entity.Student;
import entity.StudentClass;
import entity.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
* @author LeDao
* @company
* @create 2022-02-12 15:56
*/
public class MyTest {

public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
User user1 = context.getBean("user", User.class);
User user2 = context.getBean("user", User.class);
System.out.println(user1==user2);
}
}

结果

控制台打印出false