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

【Spring】Spring的Bean的生命周期

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

spring容器里bean對象的生命周期,java,Spring,java,Bean生命周期,spring

  • 作者簡介:大家好,我是五度魚,一個普通的Java領(lǐng)域博主,不停輸出Java技術(shù)博客和干貨。
  • 座右銘:鍥而不舍,金石可鏤。
  • 個人主頁:五度魚學(xué)Java的主頁

前言

Java中,Bean是一個重要的概念,它代表了應(yīng)用程序中的一個對象。在開發(fā)中,我們經(jīng)常使用Bean來管理對象的生命周期。本文將介紹Bean的生命周期,并詳細(xì)講解如何在Spring框架中管理Bean的生命周期。

spring容器里bean對象的生命周期,java,Spring,java,Bean生命周期,spring


1. 什么是Bean的生命周期?

Spring其實(shí)就是一個管理Bean對象的工廠。它負(fù)責(zé)對象的創(chuàng)建,對象的銷毀等。

所謂的生命周期就是:對象從創(chuàng)建開始到最終銷毀的整個過程。Spring為每個Bean定義了若干個回調(diào)方法,使得開發(fā)人員可以在某個特定的時(shí)間點(diǎn)對Bean進(jìn)行特定的操作。

2. 為什么要知道Bean的生命周期?

其實(shí)生命周期的本質(zhì)是:在哪個時(shí)間節(jié)點(diǎn)上調(diào)用了哪個類的哪個方法。

我們需要充分的了解在這個生命線上,都有哪些特殊的時(shí)間節(jié)點(diǎn)。

只有我們知道了特殊的時(shí)間節(jié)點(diǎn)都在哪,到時(shí)我們才可以確定代碼寫到哪。

我們可能需要在某個特殊的時(shí)間點(diǎn)上執(zhí)行一段特定的代碼,這段代碼就可以放到這個節(jié)點(diǎn)上。當(dāng)生命線走到這里的時(shí)候,自然會被調(diào)用。

3. Bean的生命周期之5步

Bean生命周期的管理,可以參考Spring的源碼:AbstractAutowireCapableBeanFactory類的doCreateBean()方法。`

Bean生命周期可以粗略的劃分為五大步:

  • 第一步:實(shí)例化Bean
  • 第二步:Bean屬性賦值
  • 第三步:初始化Bean
  • 第四步:使用Bean
  • 第五步:銷毀Bean

spring容器里bean對象的生命周期,java,Spring,java,Bean生命周期,spring

編寫測試程序:

定義一個Bean

package com.powernode.spring6.bean;

/**
 * @author 五度魚
 * @version 1.0
 * @className User
 * @since 1.0
 **/
public class User {
    private String name;

    public User() {
        System.out.println("1.實(shí)例化Bean");
    }

    public void setName(String name) {
        this.name = name;
        System.out.println("2.Bean屬性賦值");
    }

    public void initBean(){
        System.out.println("3.初始化Bean");
    }

    public void destroyBean(){
        System.out.println("5.銷毀Bean");
    }

}
<?xml version="1.0" encoding="UTF-8"?>
<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://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--
    init-method屬性指定初始化方法。
    destroy-method屬性指定銷毀方法。
    -->
    <bean id="userBean" class="com.powernode.spring6.bean.User" init-method="initBean" destroy-method="destroyBean">
        <property name="name" value="zhangsan"/>
    </bean>

</beans>
package com.powernode.spring6.test;

import com.powernode.spring6.bean.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author 五度魚
 * @version 1.0
 * @className BeanLifecycleTest
 * @since 1.0
 **/
public class BeanLifecycleTest {
    @Test
    public void testLifecycle(){
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
        User userBean = applicationContext.getBean("userBean", User.class);
        System.out.println("4.使用Bean");
        // 只有正常關(guān)閉spring容器才會執(zhí)行銷毀方法
        ClassPathXmlApplicationContext context = (ClassPathXmlApplicationContext) applicationContext;
        context.close();
    }
}

執(zhí)行結(jié)果:

spring容器里bean對象的生命周期,java,Spring,java,Bean生命周期,spring

需要注意的:

  • 第一:只有正常關(guān)閉spring容器,bean的銷毀方法才會被調(diào)用。
  • 第二:ClassPathXmlApplicationContext類才有close()方法。
  • 第三:配置文件中的init-method指定初始化方法。destroy-method指定銷毀方法。

4. Bean的生命周期之7步

在以上的5步中,第3步是初始化Bean,如果你還想在初始化前和初始化后添加代碼,可以加入“Bean后處理器”。

編寫一個類實(shí)現(xiàn)BeanPostProcessor類,并且重寫before和after方法:

package com.powernode.spring6.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

/**
 * @author 五度魚
 * @version 1.0
 * @className LogBeanPostProcessor
 * @since 1.0
 **/
public class LogBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("Bean后處理器的before方法執(zhí)行,即將開始初始化");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("Bean后處理器的after方法執(zhí)行,已完成初始化");
        return bean;
    }
}

spring.xml文件中配置“Bean后處理器”:

<!--配置Bean后處理器。這個后處理器將作用于當(dāng)前配置文件中所有的bean。-->
<bean class="com.powernode.spring6.bean.LogBeanPostProcessor"/>

一定要注意:在spring.xml文件中配置的Bean后處理器將作用于當(dāng)前配置文件中所有的Bean。

執(zhí)行測試程序:

spring容器里bean對象的生命周期,java,Spring,java,Bean生命周期,spring

如果加上Bean后處理器的話,Bean的生命周期就是7步了:

spring容器里bean對象的生命周期,java,Spring,java,Bean生命周期,spring

5. Bean的生命周期之10步

如果根據(jù)源碼跟蹤,可以劃分更細(xì)粒度的步驟,10步:

spring容器里bean對象的生命周期,java,Spring,java,Bean生命周期,spring

上圖中檢查Bean是否實(shí)現(xiàn)了Aware的相關(guān)接口是什么意思?

Aware相關(guān)的接口包括:BeanNameAwareBeanClassLoaderAware、BeanFactoryAware

  • 當(dāng)Bean實(shí)現(xiàn)了BeanNameAware,Spring會將Bean的名字傳遞給Bean。
  • 當(dāng)Bean實(shí)現(xiàn)了BeanClassLoaderAware,Spring會將加載該Bean的類加載器傳遞給Bean。
  • 當(dāng)Bean實(shí)現(xiàn)了BeanFactoryAware,Spring會將Bean工廠對象傳遞給Bean。

測試以上10步,可以讓User類實(shí)現(xiàn)5個接口,并實(shí)現(xiàn)所有方法:

  • BeanNameAware
  • BeanClassLoaderAware
  • BeanFactoryAware
  • InitializingBean
  • DisposableBean

代碼如下:

package com.powernode.spring6.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.*;

/**
 * @author 五度魚
 * @version 1.0
 * @className User
 * @since 1.0
 **/
public class User implements BeanNameAware, BeanClassLoaderAware, BeanFactoryAware, InitializingBean, DisposableBean {
    private String name;

    public User() {
        System.out.println("1.實(shí)例化Bean");
    }

    public void setName(String name) {
        this.name = name;
        System.out.println("2.Bean屬性賦值");
    }

    public void initBean(){
        System.out.println("6.初始化Bean");
    }

    public void destroyBean(){
        System.out.println("10.銷毀Bean");
    }

    @Override
    public void setBeanClassLoader(ClassLoader classLoader) {
        System.out.println("3.類加載器:" + classLoader);
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        System.out.println("3.Bean工廠:" + beanFactory);
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("3.bean名字:" + name);
    }

    @Override
    public void destroy() throws Exception {
        System.out.println("9.DisposableBean destroy");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("5.afterPropertiesSet執(zhí)行");
    }
}
package com.powernode.spring6.bean;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

/**
 * @author 五度魚
 * @version 1.0
 * @className LogBeanPostProcessor
 * @since 1.0
 **/
public class LogBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("4.Bean后處理器的before方法執(zhí)行,即將開始初始化");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("7.Bean后處理器的after方法執(zhí)行,已完成初始化");
        return bean;
    }
}

執(zhí)行結(jié)果:

spring容器里bean對象的生命周期,java,Spring,java,Bean生命周期,spring

通過測試可以看出來:

  • InitializingBean的方法早于init-method的執(zhí)行。
  • DisposableBean的方法早于destroy-method的執(zhí)行。

對于SpringBean的生命周期,掌握之前的7步即可。夠用。

6. Bean的作用域不同,管理方式不同

Spring 根據(jù)Bean的作用域來選擇管理方式。

  • 對于singleton作用域的Bean,Spring 能夠精確地知道該Bean何時(shí)被創(chuàng)建,何時(shí)初始化完成,以及何時(shí)被銷毀;
  • 而對于 prototype 作用域的BeanSpring 只負(fù)責(zé)創(chuàng)建,當(dāng)容器創(chuàng)建了 Bean 的實(shí)例后,Bean 的實(shí)例就交給客戶端代碼管理,Spring 容器將不再跟蹤其生命周期。

把之前User類的spring.xml文件中的配置scope設(shè)置為prototype

<?xml version="1.0" encoding="UTF-8"?>
<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://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--
    init-method屬性指定初始化方法。
    destroy-method屬性指定銷毀方法。
    -->
    <bean id="userBean" class="com.powernode.spring6.bean.User" init-method="initBean" destroy-method="destroyBean" scope="prototype">
        <property name="name" value="zhangsan"/>
    </bean>

    <!--配置Bean后處理器。這個后處理器將作用于當(dāng)前配置文件中所有的bean。-->
    <bean class="com.powernode.spring6.bean.LogBeanPostProcessor"/>

</beans>

執(zhí)行測試程序:

spring容器里bean對象的生命周期,java,Spring,java,Bean生命周期,spring

通過測試一目了然。只執(zhí)行了前8步,第9和10都沒有執(zhí)行。

7. 自己new的對象如何讓Spring管理

有些時(shí)候可能會遇到這樣的需求,某個java對象是我們自己new的,然后我們希望這個對象被Spring容器管理,怎么實(shí)現(xiàn)?

package com.powernode.spring6.bean;

/**
 * @author 五度魚
 * @version 1.0
 * @className User
 * @since 1.0
 **/
public class User {
}
package com.powernode.spring6.test;

import com.powernode.spring6.bean.User;
import org.junit.Test;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;

/**
 * @author 五度魚
 * @version 1.0
 * @className RegisterBeanTest
 * @since 1.0
 **/
public class RegisterBeanTest {

    @Test
    public void testBeanRegister(){
        // 自己new的對象
        User user = new User();
        System.out.println(user);

        // 創(chuàng)建 默認(rèn)可列表BeanFactory 對象
        DefaultListableBeanFactory factory = new DefaultListableBeanFactory();
        // 注冊Bean
        factory.registerSingleton("userBean", user);
        // 從spring容器中獲取bean
        User userBean = factory.getBean("userBean", User.class);
        System.out.println(userBean);
    }
}

最后求個關(guān)注,點(diǎn)贊收藏,謝謝!文章來源地址http://www.zghlxwxcb.cn/news/detail-795398.html

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

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

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

相關(guān)文章

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

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

    ?我們都知道,Spring框架為開發(fā)人員提供了很多便捷,這使得開發(fā)人員能夠更加專注于應(yīng)用程序的核心業(yè)務(wù)邏輯,而不需要花費(fèi)大量時(shí)間和精力在技術(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)造方法或工廠方法實(shí)例化 Bean。 2、利用依賴注入完成Bean中所有屬性值的配置注入。 3、如果Bean 實(shí)現(xiàn)了BeanNameAware 接口,則 Spring調(diào)用Bean的setBeanName()方法傳入當(dāng)前Bean的id值。 4、如果Bean實(shí)現(xiàn)了BeanFactoryAware 接口

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

    Spring -- Bean的生命周期

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

    2024年02月15日
    瀏覽(35)
  • 【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的行為和資源使用。 實(shí)例化(Instantiation): 容器首先創(chuàng)建Bean的實(shí)例。 填充屬性(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日
    瀏覽(25)
  • 【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啟動的時(shí)

    2024年02月15日
    瀏覽(23)
  • Spring中 Bean的生命周期

    Spring中 Bean的生命周期

    如果把Spring看做一個大型工廠,則Spring容器中的Bean就是該工廠的產(chǎn)品。要想使用這個工廠生產(chǎn)和管理Bean,就需要在配置文件中告訴它需要哪些Bean,以及需要使用何種方式將這些Bean裝配到一起。 Bean的本質(zhì)就是Java中的類,而Spring中的Bean其實(shí)就是對實(shí)體類的引用,來生產(chǎn)Java類

    2024年01月24日
    瀏覽(24)
  • 詳解Spring Bean的生命周期

    詳解Spring Bean的生命周期

    Spring Bean的生命周期包括以下階段: 1. 實(shí)例化Bean 對于BeanFactory容器,當(dāng)客戶向容器請求一個尚未初始化的bean時(shí),或初始化bean的時(shí)候需要注入另一個尚未初始化的依賴時(shí),容器就會調(diào)用createBean進(jìn)行實(shí)例化。 對于ApplicationContext容器,當(dāng)容器啟動結(jié)束后,便實(shí)例化所有的bean。

    2024年02月14日
    瀏覽(24)
  • Spring Bean的生命周期解讀

    Spring Bean的生命周期解讀

    目錄 ? 1. Spring IOC容器 1.1 Spring IOC 容器的設(shè)計(jì) 1.1.1 BeanFactory 1.1.2 ApplicationContext 1.2 Spring Bean的生命周期 1.2.1 BeanDefinition 1.2.2 InstantiationAwareBeanPostProcessor和BeanPostProcessor 1.2.3 測試生命周期 ? Spring IOC 容器的設(shè)計(jì)主要是基于 BeanFactory 和 ApplicationContex t兩個接口,其中ApplicationConte

    2024年02月11日
    瀏覽(24)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包