spring中都有什麼作用域的bean

2020-12-18 老徐聊java

如果問spring中都有什麼作用域的bean、相信很多人都會回答「單例」,對的,如果這樣你只回答了一種。

spring中默認所有的bean都是作為單例(singleton)的形式創建的。不管bean被注入到其他的bean多少次,每次注入的都是同一個實例。

大多數情況下,單例bean還是一個很理想的方案。但有時它也不是理想的方案。舉一個最簡單的例子吧,比如大家所熟悉的淘寶、京東中的購物車,如果bean是單例的,那成千上萬個用戶使用的都是同一個購物車的bean,想想可能嗎?不可能,spring早已經為我們想好了方案。現在我說下sping定義的多種作用域。

單例(singleton):在整個應用中,只創建bean的一個實例。原型(prototype):每次注入或者通過spring應用上下文獲取的時候,都會創建一個新的bean實例。會話(session):在web應用中,為每個會話創建一個bean實例。請求(request):在web應用中,為每個請求創建一個bean實例。一、bean的創建(單例、原型)

我先說下單例和原型在bean中的指定

xml肯定是大家不陌生的:需要指定scope就ok了

xml配置

另外一種是組件掃描或者聲明bean的方式,我們使用ConfigurableBeanFactory來指定

組件掃描
bean上聲明

不知道大家有沒有發現、我為什麼只說了單例和原型

你會發現它ConfigurableBeanFactory就有這2種定義。

二、會話和請求

正如我上面的例子(購物車)所說、web應有中如果能夠實例化在會話和請求中共享的bean,是一件非常不錯的事情。

這裡要認真看下、因為涉及到了代理,也有可能你一個不注意,項目都啟動不起來了,我就拿「會話」講解了,「請求」同理。

使用WebApplicationContext,proxyMode來指定

大家應該對proxyMode = ScopedProxyMode.INTERFACES不理解吧,它主要目的就是為了解決會話和請求作用域bean注入到單例bean中所遇見的問題。

我在再創建一個單例bean講解。

我這StoreService注入了ShoppingCart,但是問題出來了,由於StoreService是單例,一啟動就會創建,我這個ShoppingCart是基於會話的,也就是說只有某個用戶進入系統,創建會話,這個bean才被創建,如果這樣,項目啟動去注入這個bean就會出問題,所以才使用proxyMode 目的使spring不會將實際的ShoppingCart注入到StoreService,而是注入ShoppingCart的代理,只有StoreService真正的調用了ShoppingCart中的方法,才會調用真正的ShoppingCart。

大家都應該知道代理有2種吧,一種是基於接口的、一種是基於類的(CGLib)。

上面的示例是基於接口的,那麼基於類要怎麼創建呢,其實很簡單,

將代理改成proxyMode = ScopedProxyMode.TARGET_CLASS即可。

三、xml聲明作用域代理

會話和請求我說的都是javaConfig的配置方式,現在還是會有很多人使用xml來配置(因為小編就在使用xml配置),我順便也說下xml如何配置。

xml想要設置代理模式,我們需要使用spring aop命名空間的一個新元素。

<aop:scoped-proxy/>

<aop:scoped-proxy/>默認情況下會使用CGLib代理,將proxy-target-class設置為false,就是基於接口代理。

到此spring的4中作用域說完了,如果大家有什麼疑問會不解、在下面評論、隨時解答,希望能給你們帶來幫助。

相關焦點

  • 理解Spring框架中Bean的作用域
    2、singleton作用域singleton是默認的作用域,當定義Bean時,如果沒有指定scope配置項,Bean的作用域被默認為singleton。singleton屬於單例模式,在整個系統上下文環境中,僅有一個Bean實例。
  • 面試刷題:Spring Bean的生命周期?
    spring是Java軟體開發的事實標準。今天的問題是:springBean的生命周期是怎樣的?bean的生命周期完全由spring容器管理,從屬性設置到各種依賴關係的注入,簡化了開發人員對bean的生命周期認知;Spring的容器中Bean生命周期如下對象創建1、從xml配置的Bean
  • Spring 中的bean 是線程安全的嗎?
    Spring 的 bean 作用域(scope)類型singleton:單例,默認作用域。prototype:原型,每次創建一個新對象。spring單例,為什麼controller、service和dao確能保證線程安全?Spring中的Bean默認是單例模式的,框架並沒有對bean進行多線程的封裝處理。實際上大部分時間Bean是無狀態的(比如Dao) 所以說在某種程度上來說Bean其實是安全的。
  • spring面試題目!
    Spring 框架中都用到了哪些設計模式?詳細講解一下核心容器(spring context應用上下文) 模塊Spring框架中有哪些不同類型的事件Spring 應用程式有哪些不同組件?使用 Spring 有哪些方式?
  • 【框架】121:spring框架之IOC容器
    在spring核心配置文件中,有一個bean標籤,我們以前創建一個對象都是直接new。 而在spring中可以將對象交給spring管理,再通過spring工廠直接獲取。 所以我們也稱之為spring容器。 今天的學習內容就是關於bean標籤: Bean的作用域:單例與多例說明。
  • Java經典面試題Spring是什麼 Spring框架入門詳解
    創建下面一個pojo看看spring都有哪些功能Sping有一個功能就是幫我們創建pojo對象實例,下面我麼需要在applicationContext.xml中將pojo配置為bean,註冊到spring
  • Spring必須掌握的Bean增強擴展點與加載流程
    用來將註解@Configuration中的相關生成bean的方法所對應的BeanDefinition進行註冊。org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator,基於beanName創建代理,就是應用了這個接口,在生成bean前生成代理bean,從而替代默認的實例化。
  • spring學習總結(一)_Ioc基礎(上)
    看了他寫的spring系列的博客,寫的不錯。於是本文的內容參考自他的博客,當然都是手打書寫。由於我感覺他寫的博客篇幅過長。我根據我的習慣進行拆分學習。而且他的文章一系列很清楚。也值得我去學習。自己寫博客就零零散散。不是很系統。spring概述spring可以做很多事情,它為企業級開發提供了豐富的功能。
  • 再談Spring中Bean的生命周期
    網上大部分都是驗證的Bean 在面試問的生命周期,其實查閱JDK還有一個完整的Bean生命周期,這同時也驗證了書是具有片面性的,最fresh 的資料還是查閱原始JDK!!!一、Bean 的完整生命周期在傳統的Java應用中,bean的生命周期很簡單,使用Java關鍵字 new 進行Bean 的實例化,然後該Bean 就能夠使用了。一旦bean不再被使用,則由Java自動進行垃圾回收。
  • 想知道Spring中Bean的作用域與StepScope關係、疑問的,看過來!
    Spring Bean有5個作用域,但是最近有需求在多個地方獲取同一個Bean,只修改其中一個參數。那麼Bean只在一個地方注入,修改屬性就好,名字能一樣嗎?一系列問題這個StepScope是什麼鬼,5個默認的Scope能滿足需求嗎?
  • spring原理詳解,兩大核心IOC和AOP
    factory-bean屬性:用來指定bean的id。 factory-method屬性:指定實例方法名。--><beanid="time1"factory-bean="cal1"factory-method="getTime"/>(2)作用域a.默認情況下,容器對於某個bean的配置,只會創建一個實例。
  • 面試刷題30:SpringBean的生命周期?
    spring是Java軟體開發的事實標準
  • 面試官:你了解spring嗎?spring的兩大核心是什麼?
    之後,當通過getBean方法來從容器中獲取對象時,其實就是根據傳入的條件在內置的Map中尋找是否有匹配的鍵值,如果有則將該鍵值對中保存的對象返回,如果沒有匹配到則拋出異常。由此可以推測而知:默認情況下,多次獲取同一個id的bean,得到的將是同一個對象。
  • 細說框架每日一解Spring @Bean Annotaion
    @Scope註解支持的參數有prototype,request和session。所依賴的bean會被容器確保在當前bean實例化之前被實例化。在第一次中,沙僧並未被執行,而第二次被執行,這是因為存在感再怎麼低,但師徒四人在西去的路上一個都不能少。6.4 與@Primary一起使用@Primary註解的作用是當應用成存在一個或多個相同類型的Bean時,優先裝配被@Primary註解的bean。
  • Java程式設計師必須要知道的Spring框架經典面試題
    spring現在Java的主流框架非Spring莫屬,Spring興起於2003年,spring最初的想法是想讓JAVA EE開發應該更加簡單,為JavaBean提供了一個更好的應用配置框架Spring的AOP是什麼?Spring的aop是面向切面編程,它和OOP相輔相成,提供了不同抽象軟體的結構視角,它們是以類為單元,aop基本單元其實就是切面3. 有哪些不同類型的IOC(依賴注入)方式?a.
  • 再見面試官:你能說說 Spring 框架中 Bean 的生命周期嗎?
    ><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
  • Java面試中常問的Spring方面問題(涵蓋七大方向共55道題,含答案)
    Global-session - 類似於標準的 HTTP Session 作用域,不過它僅僅在基於 portlet 的 web 應用中才有意義。Portlet 規範定義了全局 Session 的概念,它被所有構成某個 portlet web 應用的各種不同的 portlet 所共享。
  • 繼「劉強東」之後京東的第二位程式設計師「呂科」spring面試題講解
    spring常見面試問題答案1、什麼是Spring框架?5、BeanFactory 和ApplicationContext有什麼區別?BeanFactory可以理解為含有bean集合的工廠類。BeanFactory 包含了種bean的定義,以便在接收到客戶端請求時將對應的bean實例化。
  • 是時候了解一下Spring中常用的設計模式了
    特別推薦:下面這本書你很有必要購買並使勁閱讀一篇,裡面詳細介紹了Spring的設計原理和實現方法,更重要的是帶你通讀原始碼,徹底讓你了解Spring的細節點。你還猶豫或者視而不見什麼呢,70幾元帶你職場待遇翻倍,怎麼算怎麼划算,你看著辦吧!
  • 阿里面試總結:69道必問的spring面試題(附加答案)
    什麼是spring?2. 使用Spring框架的好處是什麼?3. Spring由哪些模塊組成?4. 核心容器(應用上下文) 模塊。5. BeanFactory – BeanFactory 實現舉例。一個 Spring Bean 定義 包含什麼?23. 如何給Spring 容器提供配置元數據?24. 你怎樣定義類的作用域?25. 解釋Spring支持的幾種bean的作用域。26. Spring框架中的單例bean是線程安全的嗎?