最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Bean作用域與生命周期深入講解

 更新時(shí)間:2022年07月18日 11:55:07   作者:極致千葉  
這篇文章主要介紹了淺談Spring中Bean的作用域,生命周期和注解,從創(chuàng)建到消亡的完整過程,例如人從出生到死亡的整個(gè)過程就是一個(gè)生命周期。本文將通過示例為大家詳細(xì)講講,感興趣的可以學(xué)習(xí)一下

1.作用域定義

限定程序中變量的可用范圍叫做作用域,或者說在源代碼中定義變量的某個(gè)區(qū)域就叫做作用域。

Bean 的作用域

而 Bean 的作用域是指 Bean 在 Spring 整個(gè)框架中的某種行為模式,比如 singleton 單例作用域,就表示 Bean 在整個(gè) Spring 中只有一份,它是全局共享的,那么當(dāng)其他人修改了這個(gè)值之后,那么另一個(gè)人讀取到的就是被修改的值。

Bean 的 6 種作用域

Spring 容器在初始化一個(gè) Bean 的實(shí)例時(shí),同時(shí)會(huì)指定該實(shí)例的作用域。Spring有 6 種作用域,最后四種是基于 Spring MVC 生效的:

  • singleton:單例作用域(默認(rèn)作用域)
  • prototype:原型作用域(多例作用域)
  • request:請求作用域
  • session:回話作用域
  • application:全局作用域
  • websocket:HTTP WebSocket 作用域

注意后 4 種狀態(tài)是 Spring MVC 中的值,在普通的 Spring 項(xiàng)目中只有前兩種。

1,2為Spring普通項(xiàng)目(Spring Core) 3,4,5為Spring MVC 6屬于Spring WebSocket

singleton

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

prototype

  • 官方說明:Scopes a single bean definition to any number of object instances.
  • 描述:每次對該作用域下的Bean的請求都會(huì)創(chuàng)建新的實(shí)例:獲取Bean(即通過applicationContext.getBean等方法獲?。┘把b配Bean(即通過@Autowired注入)都是新的對象實(shí)例。
  • 場景:通常有狀態(tài)的Bean使用該作用域

request

  • 官方說明:Scopes a single bean definition to the lifecycle of a single HTTP request. Thatis, each HTTP request has its own instance of a bean created off the back of a singlebean definition. Only valid in the context of a web-aware Spring ApplicationContext.
  • 描述:每次http請求會(huì)創(chuàng)建新的Bean實(shí)例,類似于prototype
  • 場景:一次http的請求和響應(yīng)的共享Bean
  • 備注:限定SpringMVC中使用

session

  • 官方 說明:Scopes a single bean definition to the lifecycle of an HTTP Session. Only valid in the context of a web-aware Spring ApplicationContext.
  • 描述:在一個(gè)http session中,定義一個(gè)Bean實(shí)例
  • 場景: 用戶回話的共享Bean, 如:記錄 一個(gè)用戶的登陸信息
  • 備注:限定SpringMVC中使用

application(了解)

  • 官方說明:Scopes a single bean definition to the lifecycle of a ServletContext. Only valid in the context of a web-aware Spring ApplicationContext.
  • 描述:在一個(gè)http servlet Context中,定義一個(gè)Bean實(shí)例
  • 場景:Web應(yīng) 的上下 信息, 如:記錄一個(gè)應(yīng)用的共享信息
  • 備注:限定SpringMVC中使用

websocket(了解)

  • 官方說明:Scopes a single bean definition to the lifecycle of a WebSocket. Only valid in the context of a web-aware Spring ApplicationContext.
  • 描述:在一個(gè)HTTP WebSocket的 命周期中,定義一個(gè)Bean實(shí)例
  • 場景:WebSocket的每次會(huì)話中,保存了一個(gè)Map結(jié)構(gòu)的頭信息,將用來包裹客戶端消息頭。第一次初始化后,直到WebSocket結(jié)束都是同一個(gè)Bean。
  • 備注:限定Spring WebSocket中使用

單例作用域(singleton)和全局作用域(application)區(qū)別

singleton 是 Spring Core 的作用域;

application 是 Spring Web 中的作用域;

singleton 作 于 IoC 的容器, application 作 于 Servlet 容器。

2.設(shè)置作用域

使用@Scope標(biāo)簽就可以聲明Bean的作用域,比如設(shè)置Bean的作用域

@Scope標(biāo)簽可以修飾方法,也可以修飾類,@Scope有兩種設(shè)置方式:

1.直接設(shè)置值:@Scope("prototype")

2.直接枚舉設(shè)置:@Scope("ConfigurableBeanFactory.SCOPE_PROTOTYPE")

3.Bean 原理分析

3.1 Bean(Spring)執(zhí)行流程

Bean 執(zhí)行 流程(Spring 執(zhí) 流程):啟動(dòng) Spring 容器 -> 實(shí)例化 Bean(分配內(nèi)存空間,從 到有) -> Bean 注冊到 Spring 中(存操作) -> 將 Bean 裝配到需要的類中(取操作)。

3.2 Bean生命周期

所謂的生命周期指的是一個(gè)對象從誕生到銷毀的整個(gè)生命過程,我們把這個(gè)過程就叫做一個(gè)對象的生命周期。

Bean 的生命周期分為以下 5 部分:

實(shí)例化 Bean(為 Bean 分配內(nèi)存空間)【實(shí)例化!=初始化;只是執(zhí)行分配內(nèi)存空間的功能】

設(shè)置屬性(Bean 注入和裝配)【執(zhí)行依賴類的注入A需要使用B的方法,先初始化并將B加載到當(dāng)前類】

Bean 初始化

  • 實(shí)現(xiàn)了各種Aware 通知的方法,如BeanNameAware、BeanFactoryAware、ApplicationContextAware 的接口方法;
  • 執(zhí)行BeanPostProcessor 初始化前置方法;
  • 執(zhí)行@PostConstruct初始化方法,依賴注入操作之后被執(zhí)行;
  • 執(zhí)行指定的 init-method方法(如果有指定的話);
  • 執(zhí)行BeanPostProcessor 初始化后置方法。

使用Bean

銷毀 Bean

銷毀容器的各種 法,如 @PreDestroy、DisposableBean 接口方法、destroy-method。

執(zhí)行流程如下圖所示:

實(shí)例化和初始化的區(qū)別

實(shí)例化和屬性設(shè)置是 Java 級別的系統(tǒng)“事件”,其操作過程不可人工干預(yù)和修改;而初始化是給開發(fā)者提供的,可以在實(shí)例化之后,類加載完成之前進(jìn)行自定義“事件”處理。

生命流程的“故事”

Bean 的生命流程看似繁瑣,但咱們可以以生活中的場景來理解它,比如我們現(xiàn)在需要買一棟房子,那么我們的流程是這樣的:

  • 先買房(實(shí)例化,從無到有);
  • 裝修(設(shè)置屬性);
  • 買家電,如洗衣機(jī)、冰箱、電視、空調(diào)等([各種]初始化);
  • 入住(使用 Bean);
  • 賣出去(Bean 銷毀)。

生命周期演示:

package com.beans;
import org.springframework.beans.factory.BeanNameAware;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
public class BeanLifeComponent implements BeanNameAware {
    @PostConstruct
    public void postConstruct() {
        System.out.println("執(zhí)行 PostConstruct()");
    }
    public void init() {
        System.out.println("執(zhí)行 BeanLifeComponent init-method");
    }
    public void destory() {
        System.out.println("執(zhí)行了 destory 方法");
    }
    @PreDestroy
    public void preDestroy() {
        System.out.println("執(zhí)行:preDestroy()");
    }
    public void setBeanName(String s) {
        System.out.println("執(zhí)行了 setBeanName 方法:" + s);
    }
}

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">
    <!-- 設(shè)置需要存儲(chǔ)到 spring 中的 bean 根目錄 -->
    <content:component-scan base-package="com.beans"></content:component-scan>
    <bean id="beanlife" class="com.beans.BeanLifeComponent"
          init-method="init" destroy-method="destory"></bean>
</beans>

調(diào)用類:

package com;
import com.beans.BeanLifeComponent;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class App2 {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        BeanLifeComponent beanLifeComponent = context.getBean(BeanLifeComponent.class);
        System.out.println("執(zhí)行銷毀方法");
        beanLifeComponent.destory(); // 執(zhí)行銷毀方法
    }
}

步驟 2 和步驟 3 的順序不能打個(gè)顛倒?。。?/p>

到此這篇關(guān)于Spring Bean作用域與生命周期深入講解的文章就介紹到這了,更多相關(guān)Spring Bean作用域與生命周期內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實(shí)現(xiàn)的按照順時(shí)針或逆時(shí)針方向輸出一個(gè)數(shù)字矩陣功能示例

    Java實(shí)現(xiàn)的按照順時(shí)針或逆時(shí)針方向輸出一個(gè)數(shù)字矩陣功能示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的按照順時(shí)針或逆時(shí)針方向輸出一個(gè)數(shù)字矩陣功能,涉及java基于數(shù)組遍歷、運(yùn)算的矩陣操作技巧,需要的朋友可以參考下
    2018-01-01
  • Spring的注解配置與XML配置之間的比較

    Spring的注解配置與XML配置之間的比較

    在很多情況下,注釋配置比 XML 配置更受歡迎,注釋配置有進(jìn)一步流行的趨勢。Spring 2.5 的一大增強(qiáng)就是引入了很多注釋類,現(xiàn)在您已經(jīng)可以使用注釋配置完成大部分 XML 配置的功能
    2013-09-09
  • java通過PDF模板填寫PDF表單

    java通過PDF模板填寫PDF表單

    這篇文章主要為大家詳細(xì)介紹了java通過PDF模板填寫PDF表單,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • IDEA中JetBrains Mono字體的正確安裝姿勢

    IDEA中JetBrains Mono字體的正確安裝姿勢

    在 JetBrains Mono 的設(shè)計(jì)階段,它就充分考慮到了長時(shí)間工作可能導(dǎo)致的眼睛疲勞問題,比如字母的大小和形狀、空間量、自然等寬平衡、不必要的細(xì)節(jié)、連字、以及難以區(qū)分的符號等,從而最終設(shè)計(jì)出了這么一款字體
    2021-06-06
  • 員工管理系統(tǒng)java版

    員工管理系統(tǒng)java版

    這篇文章主要為大家詳細(xì)介紹了java版的員工管理系統(tǒng),,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Spring Boot 整合 Shiro+Thymeleaf過程解析

    Spring Boot 整合 Shiro+Thymeleaf過程解析

    這篇文章主要介紹了Spring Boot 整合 Shiro+Thymeleaf過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Java中Date時(shí)區(qū)的轉(zhuǎn)換代碼示例

    Java中Date時(shí)區(qū)的轉(zhuǎn)換代碼示例

    這篇文章主要給大家介紹了關(guān)于Java中Date時(shí)區(qū)轉(zhuǎn)換的相關(guān)資料,當(dāng)在不同的時(shí)區(qū)使用相同程序,時(shí)間的值只會(huì)為當(dāng)?shù)貢r(shí)間,這樣就會(huì)造成時(shí)間混亂,需要的朋友可以參考下
    2023-07-07
  • Java 自定義線程池和線程總數(shù)控制操作

    Java 自定義線程池和線程總數(shù)控制操作

    這篇文章主要介紹了Java 自定義線程池和線程總數(shù)控制操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Spring加載properties文件的兩種方式實(shí)例詳解

    Spring加載properties文件的兩種方式實(shí)例詳解

    這篇文章主要介紹了Spring加載properties文件的兩種方式,需要的朋友可以參考下
    2018-02-02
  • SpringBoot中的@DependsOn注解詳解

    SpringBoot中的@DependsOn注解詳解

    這篇文章主要介紹了SpringBoot中的@DependsOn注解詳解,
    2023-08-08

最新評論

龙里县| 天津市| 建湖县| 潜江市| 杨浦区| 柳江县| 龙川县| 滦南县| 上饶市| 普陀区| 财经| 海丰县| 女性| 三江| 应用必备| 大安市| 洛阳市| 揭阳市| 太保市| 南阳市| 宝兴县| 吉安县| 三江| 叙永县| 大安市| 华阴市| 安远县| 新巴尔虎右旗| 湘潭县| 清水河县| 赤水市| 伊金霍洛旗| 双辽市| 勐海县| 沅江市| 闻喜县| 兰考县| 琼结县| 尤溪县| 尖扎县| 清镇市|