0%

Bean的作用域

  • Bean的作用域
    • scope 属性的值一共包括 8 个选项:
      • singleton:默认的,单例。
      • prototype:原型。每调用一次 getBean() 方法则获取一个新的 Bean 对象,或每次注入的时候都是新对象。
      • request:一个请求对应一个 Bean,仅限于在 WEB 应用中使用。
      • session:一个会话对应一个 Bean,仅限于在 WEB 应用中使用。
      • global session:portlet 应用中专用的,如果在 Servlet 的 WEB 应用中使用 global session 的话,和 session 一个效果。(portlet 和 servlet 都是规范。servlet 运行在 servlet 容器中,例如 Tomcat。portlet 运行在 portlet 容器中)。
      • application:一个应用对应一个 Bean,仅限于在 WEB 应用中使用。
      • websocket:一个 websocket 生命周期对应一个 Bean,仅限于在 WEB 应用中使用。
      • 自定义 scope:很少使用。

五、Bean的作用域

5.1 singleton和prototype

  1. Spring 默认情况下是如何管理 Bean 的:

    • 默认情况下 Bean 是单例(singleton)的。
    • 在 Spring 上下文初始化的时候实例化。
    • 每一次调用 getBean() 方法的时候,都返回那个单例的对象。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    package com.f.spring6.bean;

    /**
    * @author fzy
    * @date 2024/1/18 16:16
    */
    public class SpringBean {
    public SpringBean() {
    System.out.println("SpringBean的无参构造方法执行了...");
    }
    }
    1
    2
    3
    4
    5
    6
    <?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="springBean" class="com.f.spring6.bean.SpringBean"/>
    </beans>
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Test
    public void testBeanScope() {
    // Spring 上下文初始化
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-scope.xml");
    SpringBean springBean1 = applicationContext.getBean("springBean", SpringBean.class);
    System.out.println(springBean1);
    SpringBean springBean2 = applicationContext.getBean("springBean", SpringBean.class);
    System.out.println(springBean2);
    SpringBean springBean3 = applicationContext.getBean("springBean", SpringBean.class);
    System.out.println(springBean3);
    }

    执行结果:

    1
    2
    3
    4
    SpringBean的无参构造方法执行了...
    com.f.spring6.bean.SpringBean@614df0a4
    com.f.spring6.bean.SpringBean@614df0a4
    com.f.spring6.bean.SpringBean@614df0a4
  2. 当将 Beanscope 属性设置为 prototype

    • Bean 是多例(prototype)的。
    • Spring 上下文初始化的时候,并不会初始化这些 prototypeBean
    • 每一次调用 getBean() 的时候,实例化 Bean 对象。
    1
    2
    3
    4
    5
    6
    <?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="springBean" class="com.f.spring6.bean.SpringBean" scope="prototype"/>
    </beans>

    执行结果:

    1
    2
    3
    4
    5
    6
    SpringBean的无参构造方法执行了...
    com.f.spring6.bean.SpringBean@53bd8fca
    SpringBean的无参构造方法执行了...
    com.f.spring6.bean.SpringBean@7642df8f
    SpringBean的无参构造方法执行了...
    com.f.spring6.bean.SpringBean@3e30646a

5.2 其他scope

  • scope 属性的值一共包括 8 个选项:
    • singleton:默认的,单例。
    • prototype:原型。每调用一次 getBean() 方法则获取一个新的 Bean 对象,或每次注入的时候都是新对象。
    • request:一个请求对应一个 Bean,仅限于在 WEB 应用中使用。
    • session:一个会话对应一个 Bean,仅限于在 WEB 应用中使用。
    • global session:portlet 应用中专用的,如果在 Servlet 的 WEB 应用中使用 global session 的话,和 session 一个效果。(portlet 和 servlet 都是规范。servlet 运行在 servlet 容器中,例如 Tomcat。portlet 运行在 portlet 容器中)。
    • application:一个应用对应一个 Bean,仅限于在 WEB 应用中使用。
    • websocket:一个 websocket 生命周期对应一个 Bean,仅限于在 WEB 应用中使用。
    • 自定义 scope:很少使用。
---------------The End---------------