1. 程式人生 > 其它 >Spring中bean的作用域(易懂版)

Spring中bean的作用域(易懂版)

技術標籤:Spring5beanbean作用域

bean的作用域


作用域:用於確定Spring建立Bean的例項個數。

作用域類別描述
singleton單例的(預設的),使用singleton定義的Bean是單例的,每次呼叫getBean都是呼叫的同一個物件。只要IOC容器一建立就會建立Bean的例項。
prototype多例的,每次通過Spring IOC容器獲取prototype定義的Bean時,容器都將建立一個新的Bean例項。建立時不會例項該Bean,只有呼叫getBean方法時,才會例項化。
request作用於web的請求範圍,在每一次HTTP請求時,容器會返回Bean的同一個例項,對不同的HTTP請求則會產生一個新的Bean,而且該Bean僅在當前HTTP Request內有效。
session作用於web的會話範圍,在一次HTTP Session中,容器會返回該Bean的同一個例項,對不同的HTTP請求則會產生一個新的Bean,而且該Bean僅在當前HTTP Session內有效。
global-session作用於叢集環境的會話範圍(全域性會話範圍),在一個全域性的HTTP Session中,容器返回Bean的同一個例項。當不是叢集環境時,它就是session。

單例項(singleton)的bean

這種單例項的是預設的型別
使用singleton定義的Bean是單例的,每次呼叫getBean都是呼叫的同一個物件。只要IOC容器一建立就會建立Bean的例項。

隨便拿來一個Book類演示:

package com.Keafmd.spring5.collectiontype;

import java.util.List;

/**
 * Keafmd
 *
 * @ClassName: Book
 * @Description:
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 14:56
 */
public class Book {
    private List<
String>
list; public void setList(List<String> list) { this.list = list; } public void test(){ System.out.println(list); } }

bean2.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:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">


    <!--設定為單例項,不寫預設的就是這種型別:scope="singleton"-->
    <!--設定為多例項:scope="prototype"-->
    <bean id="book" class="com.Keafmd.spring5.collectiontype.Book">
        <property name="list" ref="bookList"></property>
    </bean>

</beans>

測試程式碼:

package com.Keafmd.spring5.testdemo;

import com.Keafmd.spring5.bean.Orders;
import com.Keafmd.spring5.collectiontype.Book;
import com.Keafmd.spring5.collectiontype.Course;
import com.Keafmd.spring5.collectiontype.Stu;
import com.Keafmd.spring5.factorybean.MyBean;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Keafmd
 *
 * @ClassName: TestSpring5demo1
 * @Description: 測試類
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 14:30
 */
public class TestSpring5demo1 {

    @Test
    public void test(){

        ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
        Book book = context.getBean("book",Book.class);
        Book book2 = context.getBean("book",Book.class);
        System.out.println(book);
        System.out.println(book2);
    }
 
}

測試結果:

com.Keafmd.spring5.collectiontype.Book@376b4233
com.Keafmd.spring5.collectiontype.Book@376b4233

Process finished with exit code 0

輸出結果相同證明是同一個物件,證明是單例項的。

多例項(prototype)的bean

設定為多例項需要用到scope屬性,並且屬性值設為"prototype"。這樣就是多例的,每次通過Spring IOC容器獲取prototype定義的Bean時,容器都將建立一個新的Bean例項。建立時不會例項該Bean,只有呼叫getBean方法時,才會例項化。

Book類:

package com.Keafmd.spring5.collectiontype;

import java.util.List;

/**
 * Keafmd
 *
 * @ClassName: Book
 * @Description:
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 14:56
 */
public class Book {
    private List<String> list;

    public void setList(List<String> list) {
        this.list = list;
    }
    public void test(){
        System.out.println(list);
    }
}

修改bean2.xml的bean的scope的值為prototype。
bean2.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:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">


    <!--設定為單例項,不寫預設的就是這種型別:scope="singleton"-->
    <!--設定為多例項:scope="prototype"-->
    <bean id="book" class="com.Keafmd.spring5.collectiontype.Book" scope="prototype">
        <property name="list" ref="bookList"></property>
    </bean>

</beans>

測試程式碼:

package com.Keafmd.spring5.testdemo;

import com.Keafmd.spring5.bean.Orders;
import com.Keafmd.spring5.collectiontype.Book;
import com.Keafmd.spring5.collectiontype.Course;
import com.Keafmd.spring5.collectiontype.Stu;
import com.Keafmd.spring5.factorybean.MyBean;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * Keafmd
 *
 * @ClassName: TestSpring5demo1
 * @Description: 測試類
 * @author: 牛哄哄的柯南
 * @date: 2021-01-15 14:30
 */
public class TestSpring5demo1 {

    @Test
    public void test(){

        ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
        Book book = context.getBean("book",Book.class);
        Book book2 = context.getBean("book",Book.class);
        System.out.println(book);
        System.out.println(book2);
    }
 
}

測試結果:

com.Keafmd.spring5.collectiontype.Book@376b4233
com.Keafmd.spring5.collectiontype.Book@2fd66ad3

Process finished with exit code 0

輸出結果不同的,證明不是同一個物件,證明是多例項的。

看完如果對你有幫助,感謝點贊支援!
如果你是電腦端的話,看到右下角的 “一鍵三連” 了嗎,沒錯點它[哈哈]

在這裡插入圖片描述
加油!

共同努力!

Keafmd