理解Spring框架中Bean的作用域

2020-12-18 米粒教育

本篇介紹Spring Bean實例的作用範圍,Spring Bean實例的作用範圍由配置項scope限定。通過本篇的學習,可以達成如下目標。

● 應用scope配置項配置Bean的作用域

● 應用單例模式singleton

● 應用原型模式prototype

1、作用域scope配置項

作用域限定了Spring Bean的作用範圍,在Spring配置文件定義Bean時,通過聲明scope配置項,可以靈活定義Bean的作用範圍。例如,當你希望每次IOC容器返回的Bean是同一個實例時,可以設置scope為singleton;當你希望每次IOC容器返回的Bean實例是一個新的實例時,可以設置scope為prototype。

scope配置項有5個屬性,用於描述不同的作用域。

① singleton

使用該屬性定義Bean時,IOC容器僅創建一個Bean實例,IOC容器每次返回的是同一個Bean實例。

② prototype

使用該屬性定義Bean時,IOC容器可以創建多個Bean實例,每次返回的都是一個新的實例。

③ request

該屬性僅對HTTP請求產生作用,使用該屬性定義Bean時,每次HTTP請求都會創建一個新的Bean,適用於WebApplicationContext環境。

④ session

該屬性僅用於HTTP Session,同一個Session共享一個Bean實例。不同Session使用不同的實例。

⑤ global-session

該屬性僅用於HTTP Session,同session作用域不同的是,所有的Session共享一個Bean實例。

下面重點討論singleton、prototyp作用域,request、session和global-session類作用域放到Spring MVC章節討論,這裡不再做詳細講述。

2、singleton作用域

singleton是默認的作用域,當定義Bean時,如果沒有指定scope配置項,Bean的作用域被默認為singleton。singleton屬於單例模式,在整個系統上下文環境中,僅有一個Bean實例。也就是說,在整個系統上下文環境中,你通過Spring IOC獲取的都是同一個實例。

配置Bean為singleton作用域的配置代碼如下。

singleton作用域示例:

(1)課程案例新建SingletonTest類文件,添加下面的代碼。

(2)修改IocPrincipal類文件,添加輸出EmailNotice和PhoneNotice實例的hashCode,用於判斷程序兩次從IOC容器中獲取的實例是否為同一實例。

(3)執行SingletonTest類文件,輸出結果如下圖所示。

圖1 執行SingletonTest類輸出結果

從輸出結果可以看出,程序兩次從IOC容器中獲取的EmailNotice和PhoneNotice實例的hashCode是相同的,說明IOC容器返回的是同一個實例。

3、prototype作用域

當一個Bean的作用域被定義prototype時,意味著程序每次從IOC容器獲取的Bean都是一個新的實例。因此,對有狀態的bean應該使用prototype作用域,而對無狀態的bean則應該使用singleton作用域。

配置Bean為singleton作用域的配置代碼如下。

prototype作用域示例:

(1)修改dispatcher.xml配置文件,在定義的Bean中添加prototype屬性。

(3)執行SingletonTest類文件,輸出結果如下圖所示。

圖2 添加prototype後執行SingletonTest

從輸出結果可以看出,程序兩次從IOC容器中獲取的EmailNotice和PhoneNotice實例的hashCode是不相同的,說明EmailNotice和PhoneNotice添加prototype作用域後,IOC容器每次返回的都是一個新的實例。

課程小結

Spring IOC容器創建一個Bean實例時,可以為Bean指定實例的作用域,作用域包括singleton(單例模式)、prototype(原型模式)、request(HTTP請求)、session(會話)、global-session(全局會話)。

本文重點介紹了singleton和prototype模式,這兩個模式的作用域在Spring框架中是經常用到的。對於singleton作用域的Bean,IOC容器每次都返回同一個實例,而prototype作用域的Bean,IOC容器每次產生一個新的實例。

相關焦點

  • spring中都有什麼作用域的bean
    如果問spring中都有什麼作用域的bean、相信很多人都會回答「單例」,對的,如果這樣你只回答了一種。spring中默認所有的bean都是作為單例(singleton)的形式創建的。不管bean被注入到其他的bean多少次,每次注入的都是同一個實例。
  • 【框架】121:spring框架之IOC容器
    在spring核心配置文件中,有一個bean標籤,我們以前創建一個對象都是直接new。 而在spring中可以將對象交給spring管理,再通過spring工廠直接獲取。 所以我們也稱之為spring容器。 今天的學習內容就是關於bean標籤: Bean的作用域:單例與多例說明。
  • Java經典面試題Spring是什麼 Spring框架入門詳解
    配置文件中的根標籤是beans,所以配置一定要寫到beans裡面。到目前為止Sping框架就搭建完畢了。以上的就是Spring被外行廣為流傳的,傳說中的IOC的使用,什麼是IOC中文意思就是控制反轉,什麼意思?我們平時創建對象需要自己手動創建,現在對象都是通過spring容器ApplicationContext創建,這就是所謂的IOC控制反轉,如果有了解工廠設計模式的朋友會更容易理解,ApplicationContext此處就相當於一個工廠類。
  • Java中最強大的框架spring
    所以就出現了對應的web層框架:SSH中的Strutes2、SSM框架中的SpringMVC。我們後續要學的就是SpringMVC。前面學過的jdbc、jdbcTemplate、mybatis都是和這層是相關的,SSH框架中的hibernate,還有後續要學的SpringDateJPA都是。而我們今天要學的spring框架也就對應著業務層:無論是SSM框架還是SSH框架都有Spring,足以證明其重要性。
  • Java程式設計師必須要知道的Spring框架經典面試題
    spring現在Java的主流框架非Spring莫屬,Spring興起於2003年,spring最初的想法是想讓JAVA EE開發應該更加簡單,為JavaBean提供了一個更好的應用配置框架那麼經歷了10幾年的框架,已經成為了Java的主流框架,並且也有Spring自己體系。面對10幾年主流開發框架,必須要知道的Spring框架面試題你了解多少呢?
  • spring面試題目!
    什麼是spring?Spring框架的設計目標,設計理念,和核心是什麼Spring的優缺點是什麼?Spring有哪些應用場景Spring由哪些模塊組成?Spring 框架中都用到了哪些設計模式?詳細講解一下核心容器(spring context應用上下文) 模塊Spring框架中有哪些不同類型的事件Spring 應用程式有哪些不同組件?使用 Spring 有哪些方式?
  • 面試刷題:Spring Bean的生命周期?
    spring是Java軟體開發的事實標準。今天的問題是:springBean的生命周期是怎樣的?bean的生命周期完全由spring容器管理,從屬性設置到各種依賴關係的注入,簡化了開發人員對bean的生命周期認知;Spring的容器中Bean生命周期如下對象創建1、從xml配置的Bean
  • Spring 中的bean 是線程安全的嗎?
    結論:不是線程安全的Spring容器中的Bean是否線程安全,容器本身並沒有提供Bean的線程安全策略,因此可以說Spring容器中的Bean本身不具備線程安全的特性,但是具體還是要結合具體scope的Bean去研究。
  • 細說框架每日一解Spring @Bean Annotaion
    依賴於另外一個bean。所依賴的bean會被容器確保在當前bean實例化之前被實例化。在第一次中,沙僧並未被執行,而第二次被執行,這是因為存在感再怎麼低,但師徒四人在西去的路上一個都不能少。6.4 與@Primary一起使用@Primary註解的作用是當應用成存在一個或多個相同類型的Bean時,優先裝配被@Primary註解的bean。
  • 再見面試官:你能說說 Spring 框架中 Bean 的生命周期嗎?
    結合代碼理解一下1、Bean的定義Spring通常通過配置文件定義Bean。如:<?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
  • 如何能理解 Spring 框架的思想?
    Spring 是一個輕量級的開源的 JavaEE 框架,由作者 Rod Johnson 創建,興起於 2003 年。目的是為了解決企業級開發的複雜性問題,Spring 出發點就是不重新造輪子,而是使現有的技術或框架更加易於使用。具有簡單,易於擴展和維護和低耦合等特點。
  • spring學習總結(一)_Ioc基礎(上)
    IOC是spring框架的核心內容,使用多種方式完美的實現了IOC,可以使用xml配置,也可以使用註解,新版本的spring可以零配置實現IOC。animal.xml測試輸出結果對象引用TyreCar測試輸出結果對象作用域
  • Spring框架如何加載和定義Spring Bean類?
    2、Bean類的配置項Spring IOC容器管理Bean時,需要了解Bean的類名、名稱、依賴項、屬性、生命周期及作用域等信息。為此,Spring IOC提供了一系列配置項,用於Bean在IOC容器中的定義。
  • spring原理詳解,兩大核心IOC和AOP
    1.概念:spring是輕量級的開發框架;兩大核心IOC和AOP;包含完成特定功能的子框架。2.特點:簡化開發過程;解耦;集成第三方框架一、Spring容器Spring框架中的一個核心模塊,用來管理對象(包括對象的創建、銷毀、對象之間的依賴關係的 建立等等)。
  • Spring必須掌握的Bean增強擴展點與加載流程
    用來將註解@Configuration中的相關生成bean的方法所對應的BeanDefinition進行註冊。org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator,基於beanName創建代理,就是應用了這個接口,在生成bean前生成代理bean,從而替代默認的實例化。
  • 繼「劉強東」之後京東的第二位程式設計師「呂科」spring面試題講解
    面試問題答案及spring常見面試問題答案1、什麼是Spring框架?控制反轉是一種以給予應用程式中目標組件更多控制為目的設計範式,並在我們的實際工作中起到了有效的作用。依賴注入是在編譯階段尚未知所需的功能是來自哪個的類的情況下,將其他對象所依賴的功能對象實例化的模式。這就需要一種機制用來激活相應的組件以提供特定的功能,所以依賴注入是控制反轉的基礎。
  • 再談Spring中Bean的生命周期
    一、Bean 的完整生命周期在傳統的Java應用中,bean的生命周期很簡單,使用Java關鍵字 new 進行Bean 的實例化,然後該Bean 就能夠使用了。一旦bean不再被使用,則由Java自動進行垃圾回收。
  • spring框架之註解的使用
    一、Spring的註解IoC容器是Spring的特色之一,可以使用它管理很多Bean,前幾天我們都是將這些Bean配置在applicationContext.xml文件中的。而註解的作用在於:用了註解之後,就不需要在xml文件中配置這些了 。
  • 是時候了解一下Spring中常用的設計模式了
    2.1 單例beans通常,單例對於應用程式是全局唯一的,但是在Spring中,此約束更寬泛。Spring定義的單例是在spring IOC容器中唯一。實際上,這意味著Spring只會為每個應用程式上下文的每種類型創建一個bean。
  • Java面試中常問的Spring方面問題(涵蓋七大方向共55道題,含答案)
    Global-session - 類似於標準的 HTTP Session 作用域,不過它僅僅在基於 portlet 的 web 應用中才有意義。Portlet 規範定義了全局 Session 的概念,它被所有構成某個 portlet web 應用的各種不同的 portlet 所共享。