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

Bean 作用域、生命周期和Spring執(zhí)行流程

這篇具有很好參考價(jià)值的文章主要介紹了Bean 作用域、生命周期和Spring執(zhí)行流程。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Bean作用域問(wèn)題案例分析

假設(shè)現(xiàn)在有?個(gè)公共的 Bean,提供給 A ?戶和 B ?戶使?,然?在使?的途中 A ?戶卻“悄悄”地修改了公共 Bean 的數(shù)據(jù),導(dǎo)致 B ?戶在使?時(shí)發(fā)?了預(yù)期之外的邏輯錯(cuò)誤。

公共 Bean

@Component
public class DogBean {
    @Bean
    public Dog dog() {
        Dog dog = new Dog();
        dog.setName("旺財(cái)");
        dog.setId(1);
        dog.setAge(5);
        return dog;
    }
}

A 用戶使用時(shí)修改

@Controller
public class ScopeController {

    @Autowired
    private Dog dog;

    public void doScope(){
        System.out.println("do scope controller");
        System.out.println("原始dog對(duì)象:" + dog.toString());

        Dog dog2 = dog;
        dog2.setAge(10);
        dog2.setId(2);
        dog2.setName("小黑");

        System.out.println("修改后的dog對(duì)象:" + dog.toString());
    }
}

Bean 作用域、生命周期和Spring執(zhí)行流程,Java,spring,后端,Bean生命周期,Bean作用域

B 用戶使用時(shí)

@Controller
public class ScopeController2 {
    @Resource
    private Dog dog;

    public void doScope(){
        System.out.println("do scope controller2");

        System.out.println(dog.toString());
    }
}

Bean 作用域、生命周期和Spring執(zhí)行流程,Java,spring,后端,Bean生命周期,Bean作用域

原因分析

我們可以看到,B 用戶在使用這個(gè)Bean對(duì)象時(shí),得到的Dog是被A 用戶修改過(guò)的,這無(wú)疑會(huì)給 B 用戶帶來(lái)很大的麻煩。操作以上問(wèn)題的原因是因?yàn)?Bean 默認(rèn)情況下是單例狀態(tài)(singleton),也就是所有?的使?的都是同?個(gè)對(duì)象,之前我們學(xué)單例模式的時(shí)候都知道,使?單例可以很?程度上提?性能,所以在 Spring 中 Bean 的作?域默認(rèn)也是 singleton 單例模式。

作用域定義

限定程序中變量的可?范圍叫做作?域,或者說(shuō)在源代碼中定義變量的某個(gè)區(qū)域就叫做作?域。? 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 ?效的:

  1. singleton:?jiǎn)卫?域
  2. prototype:原型作?域(多例作?域)
  3. request:請(qǐng)求作?域
  4. session:回話作?域
  5. application:全局作?域
  6. websocket:HTTP WebSocket 作?域

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

singleton

  • 官?說(shuō)明:(Default) Scopes a single bean definition to a single object instance for each Spring IoC container.
  • 描述:該作?域下的Bean在IoC容器中只存在?個(gè)實(shí)例:獲取Bean(即通過(guò)applicationContext.getBean等?法獲取)及裝配Bean(即通過(guò)@Autowired注?)都是同?個(gè)對(duì)象。
  • 場(chǎng)景:通常?狀態(tài)的Bean使?該作?域。?狀態(tài)表示Bean對(duì)象的屬性狀態(tài)不需要更新
  • 備注:?jiǎn)卫J侥J(rèn)的作用域,只有一個(gè)全局對(duì)象

prototype

  • 官?說(shuō)明:Scopes a single bean definition to any number of object instances.
  • 描述:每次對(duì)該作?域下的Bean的請(qǐng)求都會(huì)創(chuàng)建新的實(shí)例:獲取Bean(即通過(guò)applicationContext.getBean等?法獲?。┘把b配Bean(即通過(guò)@Autowired注?)都是新的對(duì)象實(shí)例。
  • 場(chǎng)景:通常有狀態(tài)的Bean使?該作?域
  • 備注:原型模式【多例默認(rèn)】,每次訪問(wèn)都會(huì)創(chuàng)建一個(gè)新對(duì)象

request

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

session

  • 官?說(shuō)明: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í)例
  • 場(chǎng)景:?戶回話的共享Bean, ?如:記錄?個(gè)?戶的登陸信息
  • 備注:限定SpringMVC中使?

application

  • 官?說(shuō)明: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í)例
  • 場(chǎng)景:Web應(yīng)?的上下?信息,?如:記錄?個(gè)應(yīng)?的共享信息
  • 備注:限定SpringMVC中使?

websocket

  • 官?說(shuō)明: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í)例
  • 場(chǎng)景:WebSocket的每次會(huì)話中,保存了?個(gè)Map結(jié)構(gòu)的頭信息,將?來(lái)包裹客戶端消息頭。第?次初始化后,直到WebSocket結(jié)束都是同?個(gè)Bean。
  • 備注:限定Spring WebSocket中使?

設(shè)置作用域

使? @Scope 標(biāo)簽就可以?來(lái)聲明 Bean 的作?域,@Scope 標(biāo)簽既可以修飾?法也可以修飾類,@Scope 有兩種設(shè)置?式:

  1. 直接設(shè)置值:@Scope(“prototype”)
  2. 使?枚舉設(shè)置:@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Component
public class DogBean {
    @Scope("prototype")
    @Bean
    public Dog dog() {
        Dog dog = new Dog();
        dog.setName("旺財(cái)");
        dog.setId(1);
        dog.setAge(5);
        return dog;
    }
}

這樣設(shè)置完成后,A 用戶的修改對(duì) B 用戶的使用就不會(huì)造成影響了。

Spring 執(zhí)行流程

1、啟動(dòng)容器

Bean 作用域、生命周期和Spring執(zhí)行流程,Java,spring,后端,Bean生命周期,Bean作用域

2、Bean 初始化

配置文件中的bean、配置了加載組件路徑下的類進(jìn)行掃描【看有沒(méi)有類注解】
Bean 作用域、生命周期和Spring執(zhí)行流程,Java,spring,后端,Bean生命周期,Bean作用域

3、注冊(cè)Bean對(duì)象到容器中

通過(guò)五大注解來(lái)把對(duì)象注入到容器中,并且只有在包掃描路徑上的類,且使用Spring的注解才可以被注冊(cè)到容器中。
Bean 作用域、生命周期和Spring執(zhí)行流程,Java,spring,后端,Bean生命周期,Bean作用域

具體參考博客:使用spring注解儲(chǔ)存對(duì)象

4、裝配Bean屬性

如果Bean對(duì)象 需要使用其他Bean對(duì)象作為屬性,可以使用注解@Autowired、@Resource
Bean 作用域、生命周期和Spring執(zhí)行流程,Java,spring,后端,Bean生命周期,Bean作用域
具體參考博客:spring依賴注入

Bean 生命周期

Bean 作用域、生命周期和Spring執(zhí)行流程,Java,spring,后端,Bean生命周期,Bean作用域

1、實(shí)例化

這是生命周期的第一步。在這個(gè)階段,Spring會(huì)創(chuàng)建一個(gè)Bean的實(shí)例。這就像在工廠里制造一個(gè)產(chǎn)品一樣,但在這里,Spring負(fù)責(zé)創(chuàng)建和管理Bean對(duì)象。

2、設(shè)置屬性

一旦Bean實(shí)例化了,Spring會(huì)通過(guò)依賴注入的方式設(shè)置Bean的屬性。這就像給產(chǎn)品添加特性和功能一樣。你可以在配置文件中指定屬性值,然后Spring會(huì)把這些值設(shè)置給Bean。

3、初始化

在這個(gè)階段,Bean被初始化。你可以定義初始化方法,Spring會(huì)在設(shè)置屬性后調(diào)用這些方法。這允許你在Bean準(zhǔn)備好之前做一些額外的設(shè)置或者操作。

  1. 執(zhí)行各種通知: 實(shí)現(xiàn)了各種 Aware 通知的方法,如 BeanNameAware、BeanFactoryAware、ApplicationContextAware 的接口方法;
  2. BeanPostProcessor的前置處理(postProcessBeforeInitialization): 如果在應(yīng)用中定義了BeanPostProcessor接口的實(shí)現(xiàn)類,Spring會(huì)在Bean初始化之前調(diào)用這些實(shí)現(xiàn)類的postProcessBeforeInitialization方法。這提供了一個(gè)機(jī)會(huì),你可以在Bean被初始化之前進(jìn)行一些定制化的操作。
  3. 初始化方法(InitializingBean和init-method): 如果Bean實(shí)現(xiàn)了InitializingBean接口,Spring會(huì)在屬性設(shè)置后調(diào)用它的afterPropertiesSet方法。執(zhí)? @PostConstruct 初始化?法,依賴注?操作之后被執(zhí)?。此外,你還可以通過(guò)配置指定一個(gè)自定義的初始化方法(通常使用init-method屬性)。在這個(gè)方法中,你可以執(zhí)行任何你需要在Bean初始化時(shí)完成的邏輯。
  4. BeanPostProcessor的后置處理(postProcessAfterInitialization): 類似于前置處理,如果有BeanPostProcessor接口的實(shí)現(xiàn)類,Spring會(huì)在Bean初始化之后調(diào)用這些實(shí)現(xiàn)類的postProcessAfterInitialization方法。這個(gè)階段可以用來(lái)進(jìn)行一些額外的操作,例如修改Bean的屬性或狀態(tài)。

4、使用Bean

一旦Bean被初始化,它就準(zhǔn)備好被使用了。你可以在應(yīng)用程序的其他部分中引用并使用這個(gè)Bean,執(zhí)行你所需的操作。這就像使用你制造的產(chǎn)品一樣。

5、銷毀Bean

當(dāng)應(yīng)用程序關(guān)閉或者不再需要Bean時(shí),Spring會(huì)執(zhí)行銷毀操作。你可以定義銷毀方法,在Bean不再需要時(shí)執(zhí)行一些清理工作,比如關(guān)閉數(shù)據(jù)庫(kù)連接或者釋放資源。

生命周期演示

package com.fyd.controller;

import org.springframework.beans.factory.BeanNameAware;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class BeanLifeComponent implements BeanNameAware {
    @Override
    public void setBeanName(String name) {
        System.out.println("執(zhí)行了 Bean Name 通知" + name);
    }


    public void init(){
        System.out.println("執(zhí)行了 init 方法");
    }

    @PostConstruct
    public void myPostConstruct(){
        System.out.println("執(zhí)行了 myPostConstruct 方法");
    }

    /**
     * 銷毀前執(zhí)行方法
     */
    @PreDestroy
    public void myPreDestroy(){
        System.out.println("執(zhí)行了 myPreDestroy 方法");
    }

    public void use(){
        System.out.println("執(zhí)行了 use 方法");
    }
}

xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd ">


    <context:component-scan base-package="com.fyd"/>

    <bean id="beanlife" class="com.fyd.controller.BeanLifeComponent"
    init-method="init"></bean>
    
</beans>

調(diào)用代碼

import com.fyd.controller.BeanLifeComponent;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class BeanLifeTest {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");

        BeanLifeComponent beanLifeComponent = context.getBean("beanlife",BeanLifeComponent.class);
        beanLifeComponent.use();
        // 關(guān)閉容器
        context.destroy();

    }
}

執(zhí)行結(jié)果:
Bean 作用域、生命周期和Spring執(zhí)行流程,Java,spring,后端,Bean生命周期,Bean作用域文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-657442.html

到了這里,關(guān)于Bean 作用域、生命周期和Spring執(zhí)行流程的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • Spring Bean作用域與生命周期

    Spring Bean作用域與生命周期

    目錄 Bean的作用域: Bean有六大行為模式 1、singleton:單例模式(默認(rèn)) 2、prototype: 原型模式(多例模式) 3、request: 請(qǐng)求作用域(Spring MVC) 4、session: 會(huì)話作用域(Spring MVC) 5、application: 全局作用域(Spring MVC) 6、websocket: HTTP WebSocket 作用域(Spring WebSocket) applicationContext和singleton的區(qū)別? Bea

    2024年02月02日
    瀏覽(24)
  • Spring | Bean 作用域和生命周期

    Spring | Bean 作用域和生命周期

    Spring 是用來(lái)讀取和存儲(chǔ) Bean,因此在 Spring 中 Bean 是最核心的操作資源,所以接下來(lái)我們深入學(xué)習(xí)?下 Bean 對(duì)象 假設(shè)現(xiàn)在有?個(gè)公共的 Bean,提供給 A 用戶和 B 用戶使用,然而在使用的途中 A 用戶卻 “悄悄” 地修改了公共 Bean 的數(shù)據(jù),導(dǎo)致 B 用戶在使用時(shí)發(fā)生了預(yù)期之外的邏

    2024年02月14日
    瀏覽(19)
  • Spring(Bean 作用域和生命周期)

    Spring(Bean 作用域和生命周期)

    目錄 1. 案例1: Bean作用域的問(wèn)題 2. 作用域 3. 設(shè)置 Bean 的作用域 4. Spring 的執(zhí)行流程 5. Bean 的生命周期 現(xiàn)在有一個(gè)公共的 Bean,通過(guò)給 A 用戶 和 B 用戶使用, 然后在使用的過(guò)程中 A 偷偷的修改了公共 Bean 的數(shù)據(jù), 導(dǎo)致 B 在使用時(shí)發(fā)生了預(yù)期之外的邏輯錯(cuò)誤 (1) 公共 Bean:? ?[名稱是

    2024年02月19日
    瀏覽(78)
  • 【Spring】Bean的作用域和生命周期

    【Spring】Bean的作用域和生命周期

    目錄 一、引入案例來(lái)探討B(tài)ean的作用域 二、Bean的作用域 2.1、Bean的6種作用域 2.2、設(shè)置Bean的作用域 三、Spring的執(zhí)行流程 ?四、Bean的聲明周期 1、生命周期演示 首先我們創(chuàng)建一個(gè)User類,定義一個(gè)用戶信息,在定義一個(gè)Users類,使用方法注解將user存入Spring中,然后兩個(gè)用戶A對(duì)這

    2024年02月14日
    瀏覽(24)
  • Spring Bean的作用域及生命周期

    Spring Bean的作用域及生命周期

    目錄 前言: Bean的作用域(Scope) 單例模式 原型模式(多例作用域) 請(qǐng)求作用域(request) 會(huì)話作用域 全局作用域 網(wǎng)絡(luò)長(zhǎng)連接 Spring執(zhí)行流程 Bean的生命周期 測(cè)試 小結(jié): ? ? 使用Spring框架時(shí),我們需要清楚Spring托管Bean的作用域和生命周期,這樣使用框架才會(huì)更加得心應(yīng)手。

    2024年02月03日
    瀏覽(22)
  • Spring Bean的作用域和生命周期

    Spring Bean的作用域和生命周期

    Bean 的作用域指的是 Bean 在 Spring 容器中的行為(Bean 實(shí)例創(chuàng)建及生命周期),它的行為是由 Spring 來(lái)管理的,可以根據(jù)具體情況選擇不同的作用域來(lái)達(dá)到性能優(yōu)化、資源利用最大化和可維護(hù)性等目的。 Bean 作用域(Scope)類型主要有如下幾種: 其中前兩種是 Spring 核心作用域,

    2024年02月12日
    瀏覽(28)
  • 5、Spring之bean的作用域和生命周期

    5、Spring之bean的作用域和生命周期

    5.1.1.1、配置bean 注意:當(dāng)bean不配置scope屬性時(shí),默認(rèn)是singleton(單例) 5.1.1.2、測(cè)試 由控制臺(tái)日志可知,此時(shí)ioc獲取到的兩個(gè)bean本質(zhì)上是同一個(gè)對(duì)象 5.1.2.1、配置bean 5.1.2.2、測(cè)試 由控制臺(tái)日志可知,此時(shí)ioc獲取到的兩個(gè)bean本質(zhì)上是不同的對(duì)象 如果是在WebApplicationContext環(huán)境下

    2024年02月14日
    瀏覽(24)
  • Spring系列4 -- Bean的作用域和生命周期

    Spring系列4 -- Bean的作用域和生命周期

    目錄 1. 案例 2. 作用域定義 2.1 Bean的6種作用域 2.2 設(shè)置作用域 3. Sring的執(zhí)行流程 4. Bean的生命周期 思考: 為什么不是先進(jìn)行初始化然后再進(jìn)行設(shè)置屬性呢? ????????假設(shè)現(xiàn)在有?個(gè)公共的 Bean,提供給 A ?戶和 B ?戶使?,然?在使?的途中 A ?戶卻“悄悄”地修改了公共

    2024年02月15日
    瀏覽(24)
  • 【Spring專題】Bean的生命周期流程圖

    【Spring專題】Bean的生命周期流程圖

    我向來(lái)不主張【通過(guò)源碼】理解業(yè)務(wù),因?yàn)槊總€(gè)人的能力有限,甚至可能會(huì)因?yàn)殚喿x錯(cuò)誤導(dǎo)致出現(xiàn)理解上的偏差,所以我決定,還是先幫大家【開(kāi)天眼】,先整體看看流程圖,好知道,Spring在寫源碼的過(guò)程中到底干了啥事情。 對(duì)于【一、之前推測(cè)的簡(jiǎn)單流程圖】大家可以不看

    2024年02月13日
    瀏覽(34)
  • 【框架源碼】Spring源碼解析之Bean生命周期流程

    【框架源碼】Spring源碼解析之Bean生命周期流程

    觀看本文前,我們先思考一個(gè)問(wèn)題,什么是Spring的bean的生命周期?這也是我們?cè)诿嬖嚨臅r(shí)候,面試官常問(wèn)的一個(gè)問(wèn)題。 在沒(méi)有Spring之前,我們創(chuàng)建對(duì)象的時(shí)候,采用new的方式,當(dāng)對(duì)象不在被使用的時(shí)候,由Java的垃圾回收機(jī)制回收。 而 Spring 中的對(duì)象是 bean,bean 和普通的 J

    2024年02月09日
    瀏覽(21)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包