国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Spring】——Spring生命周期

這篇具有很好參考價值的文章主要介紹了【Spring】——Spring生命周期。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

??????Spring專欄更新中,各位大佬覺得寫得不錯,支持一下,感謝了!??????

Spring_冷兮雪的博客-CSDN博客

前面我們講完了Spring中有關(guān)Bean的讀和取,我們還沒有好好去了解了解Bean對象,這篇 就是對Bean的深入學(xué)習(xí)。

一、Bean的作用域??

1、理解概念??

限定程序中變量的可用范圍叫做作用域,或者說在源代碼中定義變量的某個區(qū)域就叫做作用域。而Bean 的作用域是指?Bean 在 Spring 整個框架中的某種行為模式,比如 singleton 單例作用域,就表示 Bean 在整個 Spring 中只有一份,它是全局共享的,那么當(dāng)其他人修改了這個值之后,另一個人讀取到的就是被修改的值。

Singleton 單例模式是一種創(chuàng)建型設(shè)計模式,它保證一個類只有一個實例,并提供該實例的全局訪問點。

使用 Singleton 模式的主要目的是確保在一個應(yīng)用程序中,某個類的對象只有一個,這樣可以節(jié)省系統(tǒng)資源,避免對同一數(shù)據(jù)的多重處理等問題。在實現(xiàn)時,我們需要注意線程安全、延遲初始化、序列化和反射等方面的問題。

一般來說,Singleton 模式適用于那些需要頻繁訪問的對象,例如日志記錄器、數(shù)據(jù)庫連接池、線程池等等。

2、通過案例理解?Bean 作用域??

有一個公共的 Bean,提供給 A 用戶和 B 用戶使用,然而在使用的途中 A 用戶卻“悄悄”地修 改了公共 Bean 的數(shù)據(jù),導(dǎo)致 B 用戶在使用時發(fā)生了預(yù)期之外的邏輯錯誤。
公共 Bean:
@Component
public class Users {
    @Bean
    public User user1() {
        User user = new User();
        user.setId(1);
        user.setName("Java"); // 【重點:名稱是 Java】
        return user;
    }
}
A 用戶使用時,進(jìn)行了修改操作:
@Controller
public class BeanScopesController {
    @Autowired
    private User user1;

    public User getUser1() {
        User user = user1;
        System.out.println("Bean 原 Name:" + user.getName());
        user.setName("悟空"); // 【重點:進(jìn)?了修改操作】
        return user;
    }
}
B 用戶再去使用公共 Bean 的時候:
@Controller
public class BeanScopesController2 {
    @Autowired
    private User user1;

    public User getUser1() {
        User user = user1;
        return user;
    }
}
打印 A 用戶和 B 用戶公共 Bean 的值:
public class App {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        BeanScopesController beanScopesController = context.getBean("beanScopesController",BeanScopesController.class);
        System.out.println("A 對象修改之后 " + beanScopesController.getUser1().toString());
        BeanScopesController2 beanScopesController2 = context.getBean("beanScopesController2",BeanScopesController2.class);
        System.out.println("B 對象讀取到的 " + beanScopesController2.getUser1().toString());
    }
}

運(yùn)行結(jié)果:

【Spring】——Spring生命周期

【Spring】——Spring生命周期

?Ⅰ、原因分析??

通過上面這個案例我們發(fā)現(xiàn)所有人的使用的都是同 一個對象,這也驗證了我們之前說的:在 Spring 中 Bean 的作用域默認(rèn)是 singleton 單例模式。

3、Bean 的 6 種作用域(前四種為常用)??

Spring 容器在初始化?個 Bean 的實例時,同時會指定該實例的作用域。Spring有 6 種作用域,最后四種是基于 Spring MVC 生效的:
  1. singleton:單例作用域
  2. prototype:原型作用域(多例作用域)
  3. request:請求作用域
  4. session:回話作用域
  5. application:全局作用域
  6. websocket:HTTP WebSocket 作用域
其中前兩種是 spring 核心作用域,而后 4 種是 spring mvc 中的作用域。

Ⅰ、singleton(單例模式)??

  • 官方說明:(默認(rèn))將單個bean定義作用于每個Spring IoC容器的單個對象實例。
  • 描述:該作用域下的Bean在IoC容器中只存在?個實例:獲取Bean(即通過 applicationContext.getBean等方法獲?。┘把b配Bean(即通過@Autowired注入)都是同一個對象。
  • 場景:通常無狀態(tài)的Bean使用該作用域。無狀態(tài)表示Bean對象的屬性狀態(tài)不需要更新。
  • 備注:Spring默認(rèn)選擇該作用域

Spring 框架默認(rèn)采用 Singleton 單例模式,主要是因為以下幾點原因:

  1. 資源消耗較少:使用單例模式可以避免頻繁創(chuàng)建對象,節(jié)約系統(tǒng)資源,提升系統(tǒng)性能。

  2. 對象復(fù)用:當(dāng)多個組件需要使用同一個對象時,采用單例模式可以確保這些組件使用的是同一個對象,保證了對象的一致性和正確性。

  3. 統(tǒng)一管理:采用單例模式可以方便地對對象進(jìn)行統(tǒng)一管理,例如設(shè)置各種屬性、初始化等操作。

  4. 易于擴(kuò)展:當(dāng)需要增加或修改某個類的實現(xiàn)時,只需要修改該類的單例實例即可,無需修改其他代碼。

想了解或者復(fù)習(xí)單例模式可以看這篇文章:

?面試突擊50:單例模式有幾種寫法? - 掘金 (juejin.cn)

?Ⅱ、prototype(原型模式/多例模式)??

  • 官方說明:將單個bean定義限定為任意數(shù)量的對象實例。
  • 描述:每次對該作用域下的Bean的請求都會創(chuàng)建新的實例:獲取Bean(即通過 applicationContext.getBean等方法獲?。┘把b配Bean(即通過@Autowired注入)都是新的對象實例。
  • 場景:通常有狀態(tài)的Bean使用該作用域。有狀態(tài)表示Bean對象的屬性狀態(tài)需要更新。

Ⅲ、request(請求作用域)??

  • 官方說明:將單個bean定義限定在單個HTTP請求的生命周期內(nèi)。也就是說,每個HTTP請求都有自己的bean實例,該實例是在單個bean定義的后面創(chuàng)建的。只在具有web感知的Spring ApplicationContext上下文中有效。
  • 描述:每次http請求會創(chuàng)建新的Bean實例,類似于prototype。
  • 場景:一次http的請求和響應(yīng)的共享Bean。
  • 備注:限定SpringMVC(Spring外部項目)中使用。

Ⅳ、session(回話作用域)??

  • 官方說明:將單個bean定義限定在HTTP會話的生命周期內(nèi)。只在具有web感知的Spring ApplicationContext上下文中有效。
  • 描述:在一個http session中,定義?個Bean實例。
  • 場景:用戶回話的共享Bean, 比如:記錄?個用戶的登陸信息。
  • 備注:限定SpringMVC中使用。

Ⅴ、application(全局作用域 | 了解)??

  • 官方說明:將單個bean定義限定在ServletContext的生命周期內(nèi)。僅在支持web的Spring ApplicationContext的上下文。
  • 描述:在一個http servlet Context中,定義一個Bean實例。
  • 場景:Web應(yīng)用的上下文信息,比如:記錄一個應(yīng)用的共享信息。
  • 備注:限定SpringMVC中使用。

Ⅵ、websocket(了解)??

  • 官方說明:將單個bean定義限定在WebSocket的生命周期內(nèi)。僅在一個具有web感知的Spring ApplicationContext。
  • 描述:在一個HTTP WebSocket的生命周期中,定義一個Bean實例。
  • 場景:WebSocket的每次會話中,保存了一個Map結(jié)構(gòu)的頭信息,將用來包裹客戶端消息頭。第一次初始化后,直到WebSocket結(jié)束都是同一個Bean。
  • 備注:限定Spring WebSocket中使用。

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

  • singleton 是 Spring Core 的作用域;application 是 Spring Web 中的作用域;
  • singleton 作用于 IoC 的容器,而?application 作用于 Servlet 容器。

?4、設(shè)置作用域??

設(shè)置作用域有兩種方法:

Ⅰ、直接設(shè)置值:@Scope("prototype")??

還是前面的代碼,我們給user1設(shè)置prototype作用域 (也可以設(shè)置成其他作用域)

【Spring】——Spring生命周期

運(yùn)行:

【Spring】——Spring生命周期

?Ⅱ、使用全局變量設(shè)置:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)??

通過@Scope(ConfigurableListableBeanFactory.SCOPE_PROTOTYPE)修改作用域

【Spring】——Spring生命周期

?我們運(yùn)行代碼也可以可以得到與 前一方法 相同的結(jié)果:

【Spring】——Spring生命周期

?二. Spring 執(zhí)行流程和 Bean 的生命周期??

?1、Spring 執(zhí)行流程???

  1. 啟動容器(啟動項目)。
  2. 讀取配置文件,初始化。
  3. a)使用 xml 直接注冊 beanb)配置 bean 根 (掃描)路徑3.將 bean 存儲到 spring 中,通過類注解進(jìn)行掃描和裝配。
  4. 將 bean 從 spring 讀取出來,裝配到相應(yīng)的類。

2、Bean的生命周期???

所謂的生命周期指的是一個對象從誕生到銷毀的整個生命過程,我們把這個過程就叫做一個對象的生命周期。
Bean 的生命周期分為以下 5 大部分:
  1. 實例化:當(dāng)Spring容器接收到一個Bean的定義時,會根據(jù)該定義創(chuàng)建一個Bean的實例。

  2. 屬性賦值:創(chuàng)建Bean的實例后,Spring通過反射機(jī)制將Bean屬性設(shè)置為相應(yīng)的值。通常情況下,這些 Bean 屬性的值來自于配置文件或注解等方式。

  3. 初始化:在Bean實例化并設(shè)置好所有屬性之后,Spring容器將調(diào)用特定的方法對Bean進(jìn)行初始化,例如執(zhí)行自定義的初始化方法或BeanPostProcessor接口中的回調(diào)方法等。

  4. 使用:當(dāng)Bean初始化完成后,它可以被Spring容器使用了。在此階段,Bean可以響應(yīng)容器中的請求,執(zhí)行相應(yīng)的業(yè)務(wù)邏輯。

  5. 銷毀:當(dāng)應(yīng)用程序關(guān)閉或者Spring容器銷毀時,會調(diào)用已注冊的bean的銷毀方法,以釋放資源。這個銷毀方法也可以是自定義的,需要實現(xiàn)DisposableBean接口或者添加@PreDestroy注解。

銷毀容器的各種方法,如 @PreDestroy、DisposableBean 接口方法、destroy-method。
執(zhí)行流程如下圖所示:

【Spring】——Spring生命周期

多學(xué)一招:?實例化和初始化的區(qū)別

實例化和初始化是Bean生命周期中的兩個不同階段。

實例化:指根據(jù)配置文件或注解等方式,創(chuàng)建一個對象實例的過程。在Spring容器啟動時,會根據(jù)定義的Bean定義信息創(chuàng)建相應(yīng)的Bean實例,并將其添加到容器中進(jìn)行管理。這個過程可以通過構(gòu)造函數(shù)、工廠方法或者其他方式來實現(xiàn)。

初始化:指在Bean實例化后,進(jìn)行必要的屬性設(shè)置、調(diào)用接口方法以及執(zhí)行自定義初始化方法等操作,使得Bean達(dá)到可以使用的狀態(tài)。在Spring容器創(chuàng)建了Bean實例之后,會根據(jù)配置信息和需要執(zhí)行一定的初始化操作,例如調(diào)用BeanPostProcessor接口中的回調(diào)方法、執(zhí)行自定義的初始化方法等等。

總之,Bean的實例化和初始化是在Spring容器中管理Bean的重要環(huán)節(jié),它們各自都有著不同的作用和實現(xiàn)方式。

【Spring】——Spring生命周期文章來源地址http://www.zghlxwxcb.cn/news/detail-479664.html

到了這里,關(guān)于【Spring】——Spring生命周期的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • Spring:Bean生命周期

    Spring:Bean生命周期

    Bean 生命周期 是 bean 對象從創(chuàng)建到銷毀的整個過程。 簡單的 Bean 生命周期的過程: 1.實例化(調(diào)用構(gòu)造方法對 bean 進(jìn)行實例化) 2.依賴注入(調(diào)用 set 方法對 bean 進(jìn)行賦值) 3.初始化(手動配置 xml 文件中 bean 標(biāo)簽的 init-method 屬性值,來指定調(diào)用對應(yīng)的初始化方法) 4.使用

    2024年02月13日
    瀏覽(27)
  • 淺析Spring生命周期

    淺析Spring生命周期

    Spring框架是一個非常流行的Java企業(yè)級應(yīng)用程序框架,已經(jīng)成為許多生產(chǎn)環(huán)境中的首選技術(shù)。它提供了一種便捷的方法來幫助開發(fā)人員構(gòu)建可擴(kuò)展和模塊化的企業(yè)級應(yīng)用程序。在Spring框架中,Bean生命周期是非常重要的一部分,它負(fù)責(zé)Bean的創(chuàng)建和銷毀。 Spring框架中Bean的完整生

    2024年02月08日
    瀏覽(13)
  • 【Spring】Bean的作用域與生命周期詳情:請簡述Spring的執(zhí)行流程并分析Bean的生命周期?

    【Spring】Bean的作用域與生命周期詳情:請簡述Spring的執(zhí)行流程并分析Bean的生命周期?

    ?我們都知道,Spring框架為開發(fā)人員提供了很多便捷,這使得開發(fā)人員能夠更加專注于應(yīng)用程序的核心業(yè)務(wù)邏輯,而不需要花費大量時間和精力在技術(shù)細(xì)節(jié)上。作為一個包含眾多工具方法的IoC容器,存取JavaBean是其極為重要的一個環(huán)節(jié)。本文就對Spring中的Bean的作用域和生命周

    2024年02月12日
    瀏覽(27)
  • Spring Bean的生命周期

    Spring Bean的生命周期

    Bean生命周期的整個執(zhí)行過程描述如下: 1、根據(jù)配置情況調(diào)用Bean構(gòu)造方法或工廠方法實例化 Bean。 2、利用依賴注入完成Bean中所有屬性值的配置注入。 3、如果Bean 實現(xiàn)了BeanNameAware 接口,則 Spring調(diào)用Bean的setBeanName()方法傳入當(dāng)前Bean的id值。 4、如果Bean實現(xiàn)了BeanFactoryAware 接口

    2023年04月22日
    瀏覽(35)
  • Spring -- Bean的生命周期

    Spring -- Bean的生命周期

    Spring容器在進(jìn)行實例化時,會將xml配置的bean的信息封裝成一個BeanDefinition對象,Spring根據(jù)BeanDefinition來創(chuàng)建Bean對象,里面有很多的屬性用來描述Bean? ?BeanDefinition 中幾個重要方法如下 beanClassName:bean 的類名 initMethodName:初始化方法名稱 properryValues:bean 的屬性值 scope:作用域

    2024年02月15日
    瀏覽(35)
  • spring框架-概述(spring特性、生命周期)(一)

    spring框架-概述(spring特性、生命周期)(一)

    Spring框架是一個開放源代碼的J2EE應(yīng)用程序框架,由Rod Johnson發(fā)起,是針對bean的生命周期進(jìn)行管理的輕量級容器 ,是為了解決企業(yè)級編程開發(fā)中的復(fù)雜性,實現(xiàn)敏捷開發(fā)的應(yīng)用型框架 IOC: (Inverse of Control ):一種思想 (容器幫我們創(chuàng)建對象并且管理和控制 ) 反轉(zhuǎn)后不再由自己

    2024年02月10日
    瀏覽(23)
  • 【Spring】Spring的Bean的生命周期

    【Spring】Spring的Bean的生命周期

    作者簡介:大家好,我是五度魚,一個普通的Java領(lǐng)域博主,不停輸出Java技術(shù)博客和干貨 。 座右銘:鍥而不舍,金石可鏤 。 個人主頁:五度魚學(xué)Java的主頁 在 Java 中, Bean 是一個重要的概念,它代表了應(yīng)用程序中的一個對象。在開發(fā)中,我們經(jīng)常使用 Bean 來管理對象的生命

    2024年01月16日
    瀏覽(35)
  • Spring整理-Spring Bean的生命周期

    Spring?Bean的生命周期涉及多個階段,從Bean的定義到其銷毀。在這個過程中,Spring容器負(fù)責(zé)創(chuàng)建、初始化、使用和最終銷毀Bean。了解這個生命周期有助于更好地管理Bean的行為和資源使用。 實例化(Instantiation): 容器首先創(chuàng)建Bean的實例。 填充屬性(Populate?Properties): 容器

    2024年01月21日
    瀏覽(31)
  • Spring Bean的生命周期 -- Spring入門(三)

    Spring Bean的生命周期 -- Spring入門(三)

    為了鞏固所學(xué)的知識,作者嘗試著開始發(fā)布一些學(xué)習(xí)筆記類的博客,方便日后回顧。當(dāng)然,如果能幫到一些萌新進(jìn)行新技術(shù)的學(xué)習(xí)那也是極好的。作者菜菜一枚,文章中如果有記錄錯誤,歡迎讀者朋友們批評指正。 (博客的參考源碼以及可以在我主頁的資源里找到,如果在學(xué)

    2024年02月15日
    瀏覽(24)
  • 【Spring】Spring之Bean生命周期源碼解析

    什么是bean的生命周期 是指bean在spring中是如何生成,如何銷毀的; spring創(chuàng)建對象的過程,就是IOC(控制反轉(zhuǎn))的過程; JFR Java Flight Record,java飛行記錄,類似于飛機(jī)的黑匣子,是JVM內(nèi)置的基于事件的JDK監(jiān)控記錄框架,主要用于問題定位和持續(xù)監(jiān)控; 入口代碼: Spring啟動的時

    2024年02月15日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包