搜尋
首頁Javajava教程Java之Spring Bean作用域與生命週期的深入分析與原始碼解析

Bean 作用域與生命週期

Bean 作用域

Bean 的作用域是指Bean 在Spring 整個框架中的某種行為模式.

#例如singleton 單例作用域, 就表示Bean 在整個Spring 中只有一份, 它是全域共享的, 那麼當其他人修改了這個值之後, 那麼另一個人讀取到的就是被修改的值.

Bean 作用域分類

  • singleton: 單例作用域(預設作用域)

  • ##prototype: 原型作用域(多例作用域)

  • request: 請求作用域

  • session: 回話作用域

  • application: 全域作用域

  • websocket: HTTP

# 注意# 後4 種狀態是Spring MVC 中的值,在普通的Spring 項⽬中只有前兩種.

singleton
Bean 預設情況下是單例狀態(singleton),也就是所有⼈的使⽤的都是同⼀個對象,之前我們學單例模式的時候都知道,使用單例可以很大程度上提高性能,所以在Spring 中Bean 的作用域默認也是singleton 單例模式。

  • 說明:此作用域下的Bean 在IoC 容器中只存在⼀個實例:取得Bean(即透過applicationContext.getBean 等方法取得)及組裝Bean(即透過 @Autowired 注入)都是同⼀個物件.

  • 場景:通常無狀態的Bean 使用此作用域.(無狀態表示Bean 物件的屬性狀態不需要更新)

prototype
  • 說明:每次對此作用域下的Bean 的請求都會建立新的實例:取得Bean(即透過applicationContext. getBean 等方法取得)及組裝Bean(即透過@Autowired 注入)都是新的物件實例。

  • 場景:通常有狀態的Bean使⽤該作用域.

request
  • 描述:每次http 請求都會建立新的Bean 實例,類似prototype

  • #場景:⼀次http 的請求和回應的共用Bean

  • #備註:限定SpringMVC 中使⽤

session
  • 描述:在⼀個http session 中,定義⼀個Bean 實例

  • 場景:⽤戶回話的共享Bean , 例如: 記錄⼀個⽤戶的登陸資訊

  • 備註:限定SpringMVC 中使⽤

application (了解)

  • #說明:在⼀個http servlet Context 中,定義⼀個Bean 實例

  • 場景:Web 應⽤的上下文資訊, 例如:記錄⼀個應用程式的共享資訊

  • 備註:限定SpringMVC 中使⽤

websocket (了解)

  • #描述:在⼀個HTTP WebSocket 的⽣命週期中,定義⼀個Bean 實例

  • 場景:WebSocket 的每次會話中,保存了⼀個Map 結構的頭訊息,將⽤來包裹客戶端訊息頭。第⼀次初始化後,直到 WebSocket 結束都是同⼀個 Bean。

  • 備註:限定Spring WebSocket 中使⽤

單例作用域(singleton) VS 全域作用域(application)

  • singleton 是Spring Core 的作用域, application 是Spring Web 中的作用域.

  • singleton 作用於IoC 的容器, application 作用於Servlet 容器

Bean 作用域的設定

@Scope 標籤既可以修飾⽅法也可以修飾類,@Scope 有兩種設定⽅式

使⽤枚舉設定:

@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

@Component
public class UserBeans {
  	@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    @Bean
    public User user1() {
        User user = new User();
        user.setId(1);
        user.setName("Gujiu");
        user.setPassword("123456");
        return user;
    }
}

#直接設定值: 

#@Scope("prototype" )

@Component
public class UserBeans {
    @Scope("prototype")
    @Bean
    public User user1() {
        User user = new User();
        user.setId(1);
        user.setName("Gujiu");
        user.setPassword("123456");
        return user;
    }
}

Spring 執行流程

  • #啟動容器(啟動專案)

  • 讀取設定檔(初始化)

    • 使用 

      xml 直接註冊Bean

    • 設定 

      Bean 根(掃描) 路徑

  • 將Bean 儲存到 

    Spring 中: 透過類別註解進行掃描和組裝

  • #將

    Bean 組裝到需要的類別中(取操作)

#Bean 生命週期

所謂的⽣命週期指的是⼀個物件從誕⽣到銷毀的整個⽣命過程,我們把這個過程就叫做⼀個物件的⽣命週期。

Bean 的生命週期:

  • 實例化Bean (對應JVM 中的「載入」, 從無到有, 將字節碼轉換成內存中的物件, 只是分配了記憶體) [買了一套毛坯房]

  • 設定屬性(Bean 的注入與組裝) [購買裝潢材料(引入外部資源)]

  • Bean 初始化[房子裝潢]

    • 实现了各种 Aware 通知的方法,如 BeanNameAware、BeanFactoryAware、ApplicationContextAware 的接口方法 [打电话给各个装修的师傅]

    • 执行 BeanPostProcessor 初始化前置方法 [师傅勘察环境, 指定装修方案 (前置工作)]

    • 执行 @PostConstruct 初始化方法,依赖注入操作之后被执行 [两类装修师傅进行装修]

    • 执行自己指定的 init-method 方法 (如果有指定的话) [两类装修师傅进行装修]

    • 执行 BeanPostProcessor 初始化后置方法 [装修之后的清理工作]

  • 使用 Bean [房子可以入住使用了]

  • 销毁 Bean [卖掉房子]

生命周期演示

BeanLifeComponent 类:

//@Component
public class BeanLifeComponent implements BeanNameAware {

    @Override
    public void setBeanName(String s) {
        System.out.println("执行了通知");
    }

    @PostConstruct
    public void postConstruct() {
        System.out.println("执行了 @PostConstruct");
    }

    public void init() {
        System.out.println("执行了 init-method");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("执行了销毁方法");
    }
}

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

    <bean id="myComponent" class="com.demo.component.BeanLifeComponent"
          init-method="init" ></bean>
</beans>

调用类:

public class App2 {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("spring-config.xml");
        BeanLifeComponent beanLifeComponent =
                applicationContext.getBean("myComponent", BeanLifeComponent.class);
        System.out.println("使用Bean");
        applicationContext.destroy();
    }
}

运行结果展示:

Java之Spring Bean作用域與生命週期的深入分析與原始碼解析

以上是Java之Spring Bean作用域與生命週期的深入分析與原始碼解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:亿速云。如有侵權,請聯絡admin@php.cn刪除
Java開發的哪些方面取決於平台?Java開發的哪些方面取決於平台?Apr 26, 2025 am 12:19 AM

JavadevelovermentIrelyPlatForm-DeTueTososeVeralFactors.1)JVMVariationsAffectPerformanceNandBehaviorAcroSsdifferentos.2)Nativelibrariesviajnijniiniininiinniinindrododerplatefform.3)

在不同平台上運行Java代碼時是否存在性能差異?為什麼?在不同平台上運行Java代碼時是否存在性能差異?為什麼?Apr 26, 2025 am 12:15 AM

Java代碼在不同平台上運行時會有性能差異。 1)JVM的實現和優化策略不同,如OracleJDK和OpenJDK。 2)操作系統的特性,如內存管理和線程調度,也會影響性能。 3)可以通過選擇合適的JVM、調整JVM參數和代碼優化來提升性能。

Java平台獨立性有什麼局限性?Java平台獨立性有什麼局限性?Apr 26, 2025 am 12:10 AM

Java'splatFormentenceHaslimitations不包括PerformanceOverhead,versionCompatibilityIsissues,挑戰WithnativelibraryIntegration,Platform-SpecificFeatures,andjvminstallation/jvminstallation/jvmintenance/jeartenance.therefactorscomplicatorscomplicatethe“ writeOnce”

解釋平台獨立性和跨平台發展之間的差異。解釋平台獨立性和跨平台發展之間的差異。Apr 26, 2025 am 12:08 AM

PlatformIndependendecealLowsProgramStormonanyPlograwsStormanyPlatFormWithOutModification,而LileCross-PlatFormDevelopmentRequiredquiresMomePlatform-specificAdjustments.platFormIndependence,EneblesuniveByjava,EnablesuniversUniversAleversalexecutionbutmayCotutionButMayComproMisePerformance.cross.cross.cross-platformd

即時(JIT)彙編如何影響Java的性能和平台獨立性?即時(JIT)彙編如何影響Java的性能和平台獨立性?Apr 26, 2025 am 12:02 AM

JITcompilationinJavaenhancesperformancewhilemaintainingplatformindependence.1)Itdynamicallytranslatesbytecodeintonativemachinecodeatruntime,optimizingfrequentlyusedcode.2)TheJVMremainsplatform-independent,allowingthesameJavaapplicationtorunondifferen

為什麼Java是開發跨平台桌面應用程序的流行選擇?為什麼Java是開發跨平台桌面應用程序的流行選擇?Apr 25, 2025 am 12:23 AM

javaispopularforcross-platformdesktopapplicationsduetoits“ writeonce,runany where”哲學。 1)itusesbytiesebyTecodeThatrunsonAnyJvm-備用Platform.2)librarieslikeslikeslikeswingingandjavafxhelpcreatenative-lookingenative-lookinguisis.3)

討論可能需要在Java中編寫平台特定代碼的情況。討論可能需要在Java中編寫平台特定代碼的情況。Apr 25, 2025 am 12:22 AM

在Java中編寫平台特定代碼的原因包括訪問特定操作系統功能、與特定硬件交互和優化性能。 1)使用JNA或JNI訪問Windows註冊表;2)通過JNI與Linux特定硬件驅動程序交互;3)通過JNI使用Metal優化macOS上的遊戲性能。儘管如此,編寫平台特定代碼會影響代碼的可移植性、增加複雜性、可能帶來性能開銷和安全風險。

與平台獨立性相關的Java開發的未來趨勢是什麼?與平台獨立性相關的Java開發的未來趨勢是什麼?Apr 25, 2025 am 12:12 AM

Java將通過雲原生應用、多平台部署和跨語言互操作進一步提昇平台獨立性。 1)雲原生應用將使用GraalVM和Quarkus提升啟動速度。 2)Java將擴展到嵌入式設備、移動設備和量子計算機。 3)通過GraalVM,Java將與Python、JavaScript等語言無縫集成,增強跨語言互操作性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器