0x01 描述
当在Spring中定义一个Bean时,你必须声明该Bean的作用域的选项
Spring框架支持以下五个作用域
分别为singleton、prototype、request、session、global-session
0x02 语法
// 设置Bean的作用域scope属性值为prototype,scope属性则默认为singleton
// Bean标签,scope属性,语法格式如下:
// scope="xxx"
<bean name="beanScope" class="com.test.BeanScope" scope="prototype"></bean>
Bean标签,scope属性,有如下属性:
singleton(单例模式):
Spring IOC容器仅创建一个Bean实例,IOC容每次返回的是同一个Bean实例,作为该属性默认值
prototype(多例模式):
Spring IOC容器创建多个Bean实例,每次从容器中调用Bean时,都返回一个新的实例
即每次调用getBean()时,相当于执行newXxxBean()
request(HTTP请求):
每次HTTP请求都会创建一个新的Bean
该作用域仅适用于WebApplicationContext环境
session(会话):
同一个HTTP Session共享一个Bean,不同Session使用不同的Bean
该作用域仅适用于WebApplicationContext环境
global-session(全局会话):
所有的Session共享一个Bean实例
该作用域仅适用于WebApplicationContext环境
注意: 在Spring5.X中已经删除了
0x03 小例子
0x03.1 xml配置方式
// 第一步
// 在./SpringDemo/src/main/java/com/test/创建个HelloWorld.java
// 目录: ./SpringDemo/src/main/java/com/test/
// 文件名: HelloWorld.java
package com.test;
public class HelloWorld {
private String message;
public void setMessage(String message) {
this.message = message;
}
public void getMessage() {
System.out.println("Your Message: " + message);
}
}
// 第二步
// 在./SpringDemo/src/main/resources/创建个applicationContext.xml
// 文件名可以任取,不过一般这个文件名都叫applicationContext.xml
// 目录: ./SpringDemo/src/main/resources/
// 文件名: applicationContext.xml
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>
// 第三步
// 在<beans>标签中,中配置HelloWorld的信息, 设定message的值为“Hello World!”
// 并添加 scope="prototype" 到<beans>标签
// 这里提供一个配置好的applicationContext.xml文件
// 目录: ./SpringDemo/src/main/resources/
// 文件名: applicationContext.xml
<?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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="helloWorldTest" class="com.test.HelloWorld" scope="prototype">
<property name="message" value="Hello World!"/>
</bean>
</beans>
// 第四步
// 创建一个测试类Test5进行测试
// 目录: ./SpringDemo/src/test/java/
// 文件名: Test5.java
import com.test.HelloWorld;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Test5 {
public static void main(String[] args) {
// scope="singleton"作用域两次输出结果一致,说明是同一个bean
// scope="prototype"两次输出结果不一致,说明不是同一个bean
ApplicationContext context = new FileSystemXmlApplicationContext("src/main/resources/applicationContext.xml");
HelloWorld obj1 = (HelloWorld) context.getBean("helloWorldTest");
System.out.println(obj1.hashCode());
HelloWorld obj2 = (HelloWorld) context.getBean("helloWorldTest");
System.out.println(obj2.hashCode());
}
}
// 运行结果
641853239
1920467934
0x04.2 注解配置方式-自动扫描
// 第一步
// 在./SpringDemo/src/main/java/com/test/创建个HelloWorld2.java
// 目录: ./SpringDemo/src/main/java/com/test/
// 文件名: HelloWorld2.java
package com.test;
import org.springframework.stereotype.Component;
import org.springframework.context.annotation.Scope;
// 注册bean
@Component("helloWorldTest2")
// 设置bean的作用域范围为prototype
@Scope("prototype")
public class HelloWorld2 {
private String message;
public void setMessage(String message) {
this.message = message;
}
public void getMessage() {
System.out.println("Your Message: " + message);
}
}
// 第二步
// 修改applicationContext.xml,如果没有就自己创建
// 文件名可以任取,不过一般这个文件名都叫applicationContext.xml
// 在Spring的配置文件applicationContext.xml头部,引入context命名空间
// 目录: ./SpringDemo/src/main/resources/
// 文件名: applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
</beans>
// 第三步
// 在applicationContext.xml中添加配置扫描所在包下(这里为扫描com.test包)所有注解
// 目录: ./SpringDemo/src/main/resources/
// 文件名: applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<!-- 配置自动扫描 -->
<context:component-scan base-package="com.test"></context:component-scan>
</beans>
// 第四步
// 创建一个测试类Test6进行测试
// 目录: ./SpringDemo/src/test/java/
// 文件名: Test6.java
import com.test.HelloWorld2;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class Test6 {
public static void main(String[] args) {
// scope="singleton"作用域两次输出结果一致,说明是同一个bean
// scope="prototype"两次输出结果不一致,说明不是同一个bean
ApplicationContext context = new FileSystemXmlApplicationContext("src/main/resources/applicationContext.xml");
HelloWorld2 obj1 = (HelloWorld2) context.getBean("helloWorldTest2");
System.out.println(obj1.hashCode());
HelloWorld2 obj2 = (HelloWorld2) context.getBean("helloWorldTest2");
System.out.println(obj2.hashCode());
}
}
// 运行结果
1795960102
1027591600