springbean默認作用域,spring實戰三裝配bean之Bean的作用域以及初始化和銷毀Bean

 2023-10-15 阅读 26 评论 0

摘要:1.Bean的作用域 所有的spring bean默認都是單例。當容器分配一個Bean時,不論是通過裝配還是調用容器的getBean()方法,它總是返回Bean的同一個實例。有時候需要每次請求時都獲得唯一的Bean實例,那么就需要覆蓋Spring默認的單例配置。當在Spring中配置<bean>元素時,可以為

1.Bean的作用域

所有的spring bean默認都是單例。當容器分配一個Bean時,不論是通過裝配還是調用容器的getBean()方法,它總是返回Bean的同一個實例。有時候需要每次請求時都獲得唯一的Bean實例,那么就需要覆蓋Spring默認的單例配置。當在Spring中配置<bean>元素時,可以為bean聲明一個作用域。為了讓spring在每次請求時都為bean產生一個新的實例,只需要配置bean的scope屬性為prototype即可。如下所示:

<bean id="ticket"
class="com.springinaction.springidol.Ticket" scope="prototype" />

通過將scope屬性設置為prototype,就可以保證每一個裝配了Ticket Bean的人都將獲得不同的實例。

除了prototype,spring還提供了其他幾個作用域選項,如下表所示:

大多數情況下,只需要選擇默認的singleton 作用域即可,但是如果使用Spring 作為工廠來創建領域對象新實例時,prototype 作用域就非常有用。如果領域對象的作用域配置為prototype,我們在Spring 中可以很容易地配置它們,就像配置其他Bean 一樣。Spring 保證每次請求一個prototype Bean 時總是返回一個獨一無二的實例。

細心的讀者會發現Spring 有關單例的概念限于Spring 上下文的范圍內。不像真正的單例,在每個類加載器中保證只有一個實例。Spring 的單例Bean 只能保證在每個應用上下文中只有一個Bean 的實例。沒有人可以阻止你使用傳統的方式實例化同一個Bean,或者你甚至可以定義幾個<bean> 聲明來實例化同一個Bean。

2.初始化和銷毀Bean

當實例化一個Bean 時,可能需要執行一些初始化操作來確保該Bean 處于可用狀態。同樣地,當不再需要Bean,將其從容器中移除時,我們可能還需要按順序執行一些清除工作。為了滿足初始化和銷毀Bean 的需求,Spring 提供了Bean 生命周期的鉤子方法。

2.1 init-method 和destroy-method:

為Bean 定義初始化和銷毀操作, 只需要使用init-method 和destroy-method參數來配置<bean> 元素。init-method 屬性指定了在初始化Bean 時要調用的方法。類似地,destory-method 屬性指定了Bean 從容器移除之前要調用的方法。如下所示:

<bean id="auditorium"
class="com.springinaction.springidol.Auditorium"
init-method="turnOnLights"
destroy-method="turnOffLights"/>

當我們使用這種方式配置時,auditorium Bean 實例化后會立即調用turnOn-Lights() 方法,讓它有機會點亮表演場地。在該Bean 從容器移除和銷毀前,會調用turnOffLights() 方法將燈關閉。

2.2 InitializingBean 和DisposableBean:

為Bean 定義初始化和銷毀方法的另一種可選方式是,讓Bean 實現Spring 的InitializingBean和DisposableBean 接口。Spring 容器以特殊的方式對待實現這兩個接口的Bean,允許它們進入Bean 的生命周期。InitializingBean 聲明了一個afterPropertiesSet()方法作為初始化方法。而DisposableBean 聲明了一個destroy()方法,該方法在Bean 從應用上下文移除時會被調用。使用這些生命周期接口的最大好處就是Spring 能夠自動檢測實現了這些接口的Bean,而無需額外的配置。實現這些接口的缺點是Bean 與Spring 的API 產生了耦合。就因為這條理由,所以還是推薦使用init-method 和destory-method 屬性來初始化和銷毀Bean。唯一可能使用Spring 的生命周期接口的場景是,開發一個明確在Spring 容器內使用的框架Bean。

2.3 默認的init-method 和destory-method:

如果在上下文中定義的很多Bean 都擁有相同名字的初始化方法和銷毀方法,你沒必要為每一個Bean 聲明init-method 和destory-method 屬性。幸運的是,你可以使用<beans> 元素的default-init-method 和default-destorymethod屬性:

<?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-3.0.xsd"
default-init-method="turnOnLights"
default-destroy-method="turnOffLights"> ...
</beans>

default-init-method 屬性為應用上下文中所有的Bean 設置了共同的初始化方法。類似的是,default-destory-method 為應用上下文中所有的Bean 設置了一個共同的銷毀方法。在本示例中,我們可以要求Spring 在初始化應用上下文中的Bean 時調用turnOnLights(),在銷毀Bean 時調用turnOffLights()(如果這些方法存在的話,否則什么都不會發生)。

轉載于:https://www.cnblogs.com/longshiyVip/p/4575004.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/139169.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息