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.javapackage 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.javaimport 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()); }}// 运行结果6418532391920467934
0x04.2 注解配置方式-自动扫描
// 第一步// 在./SpringDemo/src/main/java/com/test/创建个HelloWorld2.java// 目录: ./SpringDemo/src/main/java/com/test/// 文件名: HelloWorld2.javapackage 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.javaimport 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()); }}// 运行结果17959601021027591600