0x01 描述

  1. 当在Spring中定义一个Bean时,你必须声明该Bean的作用域的选项
  2. Spring框架支持以下五个作用域
  3. 分别为singletonprototyperequestsessionglobal-session

0x02 语法

  1. // 设置Bean的作用域scope属性值为prototype,scope属性则默认为singleton
  2. // Bean标签,scope属性,语法格式如下:
  3. // scope="xxx"
  4. <bean name="beanScope" class="com.test.BeanScope" scope="prototype"></bean>
  1. Bean标签,scope属性,有如下属性:
  2. singleton(单例模式):
  3. Spring IOC容器仅创建一个Bean实例,IOC容每次返回的是同一个Bean实例,作为该属性默认值
  4. prototype(多例模式):
  5. Spring IOC容器创建多个Bean实例,每次从容器中调用Bean时,都返回一个新的实例
  6. 即每次调用getBean()时,相当于执行newXxxBean()
  7. request(HTTP请求):
  8. 每次HTTP请求都会创建一个新的Bean
  9. 该作用域仅适用于WebApplicationContext环境
  10. session(会话):
  11. 同一个HTTP Session共享一个Bean,不同Session使用不同的Bean
  12. 该作用域仅适用于WebApplicationContext环境
  13. global-session(全局会话):
  14. 所有的Session共享一个Bean实例
  15. 该作用域仅适用于WebApplicationContext环境
  16. 注意: Spring5.X中已经删除了

0x03 小例子

0x03.1 xml配置方式

  1. // 第一步
  2. // 在./SpringDemo/src/main/java/com/test/创建个HelloWorld.java
  3. // 目录: ./SpringDemo/src/main/java/com/test/
  4. // 文件名: HelloWorld.java
  5. package com.test;
  6. public class HelloWorld {
  7. private String message;
  8. public void setMessage(String message) {
  9. this.message = message;
  10. }
  11. public void getMessage() {
  12. System.out.println("Your Message: " + message);
  13. }
  14. }
  1. // 第二步
  2. // 在./SpringDemo/src/main/resources/创建个applicationContext.xml
  3. // 文件名可以任取,不过一般这个文件名都叫applicationContext.xml
  4. // 目录: ./SpringDemo/src/main/resources/
  5. // 文件名: applicationContext.xml
  6. <?xml version="1.0" encoding="UTF-8"?>
  7. <beans xmlns="http://www.springframework.org/schema/beans"
  8. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  9. xsi:schemaLocation="http://www.springframework.org/schema/beans
  10. https://www.springframework.org/schema/beans/spring-beans.xsd">
  11. </beans>
  1. // 第三步
  2. // 在<beans>标签中,中配置HelloWorld的信息, 设定message的值为“Hello World!”
  3. // 并添加 scope="prototype" 到<beans>标签
  4. // 这里提供一个配置好的applicationContext.xml文件
  5. // 目录: ./SpringDemo/src/main/resources/
  6. // 文件名: applicationContext.xml
  7. <?xml version="1.0" encoding="UTF-8"?>
  8. <beans xmlns="http://www.springframework.org/schema/beans"
  9. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  10. xsi:schemaLocation="http://www.springframework.org/schema/beans
  11. https://www.springframework.org/schema/beans/spring-beans.xsd">
  12. <bean id="helloWorldTest" class="com.test.HelloWorld" scope="prototype">
  13. <property name="message" value="Hello World!"/>
  14. </bean>
  15. </beans>
  1. // 第四步
  2. // 创建一个测试类Test5进行测试
  3. // 目录: ./SpringDemo/src/test/java/
  4. // 文件名: Test5.java
  5. import com.test.HelloWorld;
  6. import org.springframework.context.ApplicationContext;
  7. import org.springframework.context.support.FileSystemXmlApplicationContext;
  8. public class Test5 {
  9. public static void main(String[] args) {
  10. // scope="singleton"作用域两次输出结果一致,说明是同一个bean
  11. // scope="prototype"两次输出结果不一致,说明不是同一个bean
  12. ApplicationContext context = new FileSystemXmlApplicationContext("src/main/resources/applicationContext.xml");
  13. HelloWorld obj1 = (HelloWorld) context.getBean("helloWorldTest");
  14. System.out.println(obj1.hashCode());
  15. HelloWorld obj2 = (HelloWorld) context.getBean("helloWorldTest");
  16. System.out.println(obj2.hashCode());
  17. }
  18. }
  19. // 运行结果
  20. 641853239
  21. 1920467934

0x04.2 注解配置方式-自动扫描

  1. // 第一步
  2. // 在./SpringDemo/src/main/java/com/test/创建个HelloWorld2.java
  3. // 目录: ./SpringDemo/src/main/java/com/test/
  4. // 文件名: HelloWorld2.java
  5. package com.test;
  6. import org.springframework.stereotype.Component;
  7. import org.springframework.context.annotation.Scope;
  8. // 注册bean
  9. @Component("helloWorldTest2")
  10. // 设置bean的作用域范围为prototype
  11. @Scope("prototype")
  12. public class HelloWorld2 {
  13. private String message;
  14. public void setMessage(String message) {
  15. this.message = message;
  16. }
  17. public void getMessage() {
  18. System.out.println("Your Message: " + message);
  19. }
  20. }
  1. // 第二步
  2. // 修改applicationContext.xml,如果没有就自己创建
  3. // 文件名可以任取,不过一般这个文件名都叫applicationContext.xml
  4. // 在Spring的配置文件applicationContext.xml头部,引入context命名空间
  5. // 目录: ./SpringDemo/src/main/resources/
  6. // 文件名: applicationContext.xml
  7. <?xml version="1.0" encoding="UTF-8"?>
  8. <beans xmlns="http://www.springframework.org/schema/beans"
  9. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  10. xmlns:context="http://www.springframework.org/schema/context"
  11. xsi:schemaLocation="http://www.springframework.org/schema/beans
  12. https://www.springframework.org/schema/beans/spring-beans.xsd
  13. http://www.springframework.org/schema/context
  14. http://www.springframework.org/schema/context/spring-context-4.2.xsd">
  15. </beans>
  1. // 第三步
  2. // 在applicationContext.xml中添加配置扫描所在包下(这里为扫描com.test包)所有注解
  3. // 目录: ./SpringDemo/src/main/resources/
  4. // 文件名: applicationContext.xml
  5. <?xml version="1.0" encoding="UTF-8"?>
  6. <beans xmlns="http://www.springframework.org/schema/beans"
  7. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  8. xmlns:context="http://www.springframework.org/schema/context"
  9. xsi:schemaLocation="http://www.springframework.org/schema/beans
  10. https://www.springframework.org/schema/beans/spring-beans.xsd
  11. http://www.springframework.org/schema/context
  12. http://www.springframework.org/schema/context/spring-context-4.2.xsd">
  13. <!-- 配置自动扫描 -->
  14. <context:component-scan base-package="com.test"></context:component-scan>
  15. </beans>
  1. // 第四步
  2. // 创建一个测试类Test6进行测试
  3. // 目录: ./SpringDemo/src/test/java/
  4. // 文件名: Test6.java
  5. import com.test.HelloWorld2;
  6. import org.springframework.context.ApplicationContext;
  7. import org.springframework.context.support.FileSystemXmlApplicationContext;
  8. public class Test6 {
  9. public static void main(String[] args) {
  10. // scope="singleton"作用域两次输出结果一致,说明是同一个bean
  11. // scope="prototype"两次输出结果不一致,说明不是同一个bean
  12. ApplicationContext context = new FileSystemXmlApplicationContext("src/main/resources/applicationContext.xml");
  13. HelloWorld2 obj1 = (HelloWorld2) context.getBean("helloWorldTest2");
  14. System.out.println(obj1.hashCode());
  15. HelloWorld2 obj2 = (HelloWorld2) context.getBean("helloWorldTest2");
  16. System.out.println(obj2.hashCode());
  17. }
  18. }
  19. // 运行结果
  20. 1795960102
  21. 1027591600