溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring中Bean的作用域與生命周期是什么

發(fā)布時(shí)間:2021-12-21 17:09:22 來(lái)源:億速云 閱讀:123 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要講解了“Spring中Bean的作用域與生命周期是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Spring中Bean的作用域與生命周期是什么”吧!

一、Bean的作用域

通過Spring容器創(chuàng)建一個(gè)Bean的實(shí)例時(shí),不僅可以完成Bean的實(shí)例化,還可以使用Bean的scope屬性為bean設(shè)置作用域。

語(yǔ)法格式:<bean id="別名" scope="作用域" class="對(duì)應(yīng)實(shí)現(xiàn)類">

作用域的種類:(sing)

Spring中Bean的作用域與生命周期是什么

singleton和prototype區(qū)別:(該兩種比較常用)

① singleton單實(shí)例,prototype多實(shí)例

② 設(shè)置scope值是singleton時(shí)候,加載spring配置文件時(shí)候就會(huì)創(chuàng)建單實(shí)例對(duì)象

設(shè)置scope值是prototype時(shí)候,在加載spring配置文件時(shí)候暫時(shí)不會(huì)創(chuàng)建對(duì)象,在調(diào)用getBean方法時(shí)候才創(chuàng)建多實(shí)例對(duì)象

singleton作用域:

//Cat.java
public class Cat {
    private String name;
    public void setName(String name) {
        this.name = name;
    }
}

配置文件beans5.xml

<bean id="cat" scope="singleton" class="com.jd.dao.Cat">
    <property name="name" value="大橘"></property>
</bean>

測(cè)試:

//Bean的作用域測(cè)試方法
@Test
public void catTest(){
    //1.初始化Spring容器,加載配置文件
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans5.xml");
    //2.通過Spring容器獲取Bean的實(shí)例
    Cat cat1 = (Cat) applicationContext.getBean("cat");
    Cat cat2 = (Cat) applicationContext.getBean("cat");
    //3.輸出獲取的實(shí)例
    System.out.println(cat1);
    System.out.println(cat2);
}

Spring中Bean的作用域與生命周期是什么

prototype作用域:

將配置文件beans5.xml中的scope屬性改為prototype,再次運(yùn)行測(cè)試:

<bean id="cat" scope="prototype" class="com.jd.dao.Cat">
    <property name="name" value="大橘"></property>
</bean>

3測(cè)試:

Spring中Bean的作用域與生命周期是什么

二、Bean的生命周期

Bean從創(chuàng)建到銷毀稱為Bean的生命周期,大體上Bean的生命周期共有七步:

(1)通過無(wú)參構(gòu)造器創(chuàng)建bean實(shí)例

(2)調(diào)用屬性setter方法為bean的屬性設(shè)置值

(3)把bean實(shí)例傳遞bean后置處理器的方法postProcessBeforeInitialization

(4)調(diào)用bean的初始化的方法(需要配置初始化的方法)

(5)把bean實(shí)例傳遞bean后置處理器的方法postProcessAfterInitialization

(6)獲取使用已經(jīng)創(chuàng)建的bean

(7)當(dāng)容器關(guān)閉時(shí)候,調(diào)用bean的銷毀的方法(需要配置銷毀的方法)

注意:

① 初始化方法、銷毀方法都需要在Bean中作為屬性手動(dòng)配置;

② 只有singleton作用域的Bean才會(huì)執(zhí)行銷毀方法;

使用代碼演示Bean的生命周期

(1)普通Java Bean:Cat.java

public class Cat {
    private String name;
    public void setName(String name) {
        this.name = name;
        System.out.println("第二步:調(diào)用屬性setter方法為bean的屬性設(shè)置值");
    }
    public Cat(){
        System.out.println("第一步;通過無(wú)參構(gòu)造器創(chuàng)建bean實(shí)例");
    }
    //初始化方法(在配置文件中配置實(shí)現(xiàn)調(diào)用)
    public void initMethod(){
        System.out.println("第四步:調(diào)用bean的初始化的方法");
    }
    //銷毀方法(在配置文件中配置實(shí)現(xiàn)調(diào)用)
    public void destroyMethod(){
        System.out.println("第七步:當(dāng)容器關(guān)閉時(shí)候,調(diào)用bean的銷毀的方法");
    }
}

(2)myBeanPostProcessor實(shí)現(xiàn)BeanPostProcessor接口,實(shí)現(xiàn)后置處理器:myBeanPostProcessor.java

(spring中的AOP就是通過實(shí)現(xiàn)BeanPostProcessor接口實(shí)現(xiàn)的)

//myBeanPostProcessor實(shí)現(xiàn)BeanPostProcessor接口,實(shí)現(xiàn)后置處理器
public class myBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("第三步:把bean實(shí)例傳遞bean后置處理器的方法");
        return bean;
    }
    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("第五步:把bean實(shí)例傳遞bean后置處理器的方法");
        return bean;
    }
}

(3)配置文件:beans5.xml

<!--scope屬性必須設(shè)置為singleton,否則創(chuàng)建的Bean不會(huì)被銷毀-->
<!--init-method屬性配置初始化方法,destroy-method屬性銷毀方法-->
<bean id="cat" scope="singleton" class="com.jd.dao.Cat" init-method="initMethod" destroy-method="destroyMethod">
    <property name="name" value="大橘"></property>
</bean>
<!--配置后置處理器,為當(dāng)前配置文件中的所有bean添加后置處理器的處理-->
<bean id="myBeanPostProcessor" class="com.jd.dao.myBeanPostProcessor"></bean>

(4)測(cè)試

@Test
public void catTest(){
    //1.初始化Spring容器,加載配置文件
    ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans5.xml");
    //2.通過Spring容器獲取Bean的實(shí)例
    Cat cat = (Cat) applicationContext.getBean("cat");
    //3.輸出獲取的實(shí)例
    System.out.println("第六步:獲取創(chuàng)建Bean實(shí)例"+cat);
    //4.手動(dòng)關(guān)閉
    applicationContext.close();
}

Spring中Bean的作用域與生命周期是什么

感謝各位的閱讀,以上就是“Spring中Bean的作用域與生命周期是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)Spring中Bean的作用域與生命周期是什么這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI