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

Spring Bean的Scope作用域詳解

 更新時間:2025年01月06日 09:59:06   作者:catoop  
本文介紹了Spring框架中的BeanScope(作用域),包括Singleton(單例)和Prototype(原型)兩種常見作用域的定義、生命周期和適用場景

Spring Bean的Scope作用域

Spring框架中的Bean Scope(作用域)用于控制Bean的生命周期和可見性。

Spring提供了多種作用域,每種作用域決定了Bean在應(yīng)用中的創(chuàng)建和管理方式。

以下是Spring中最常用的作用域及其特點(diǎn):

Scope作用域類型

1. Singleton(單例)

  • 默認(rèn)作用域: 如果沒有顯式指定作用域,默認(rèn)就是Singleton。
  • 生命周期: 在整個應(yīng)用中,只有一個實(shí)例。這個實(shí)例在Spring容器啟動時創(chuàng)建,并且在整個應(yīng)用運(yùn)行期間一直存在。
  • 適用場景: 適用于無狀態(tài)的Bean,如服務(wù)層和DAO層的Bean。
 @Component
 @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
 public class MySingletonComponent {
     // ...
 }

2. Prototype(原型)

  • 生命周期: 每次請求都會創(chuàng)建一個新的實(shí)例。Spring容器在創(chuàng)建原型Bean后,就不再管理其生命周期。
  • 適用場景: 適用于有狀態(tài)的Bean,如需要每個請求都獨(dú)立處理的Bean。
 @Component
 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
 public class MyPrototypeComponent {
     // ...
 }

在Spring框架中,使用@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)修飾的@Component表示該組件是一個原型(Prototype)作用域的bean。

這意味著每次通過Spring容器請求這個bean時,都會創(chuàng)建一個新的實(shí)例。

與單例(Singleton)作用域的bean不同,原型作用域的bean不會被緩存,每次請求都會返回一個新的實(shí)例。

生命周期

每次請求都創(chuàng)建新實(shí)例

  • 每次調(diào)用context.getBean(MyPrototypeComponent.class)時,都會創(chuàng)建一個新的MyPrototypeComponent實(shí)例。
  • 這意味著每個請求之間是隔離的,每個實(shí)例都有獨(dú)立的狀態(tài)。

生命周期管理

  • 原型作用域的bean的生命周期由創(chuàng)建它的客戶端代碼負(fù)責(zé)管理。Spring容器只負(fù)責(zé)初始化和裝配bean,一旦bean被創(chuàng)建并返回給客戶端代碼,容器就不再管理其生命周期。
  • 容器不會調(diào)用銷毀方法(如@PreDestroy注解的方法)來清理資源,因?yàn)槿萜鞑恢篮螘r應(yīng)該銷毀這些bean,這也反向說明了原型Bean被Spring創(chuàng)建后就不在管理其生命周期了。

在Spring框架中,當(dāng)一個Bean的作用域被設(shè)置為SCOPE_PROTOTYPE時,這個Bean在容器啟動時不會被自動實(shí)例化。相反,每次通過Spring容器請求這個Bean時,才會創(chuàng)建一個新的實(shí)例。

關(guān)鍵總結(jié)

Singleton作用域

  • 默認(rèn)作用域。
  • 在容器啟動時被實(shí)例化一次。
  • 整個應(yīng)用生命周期內(nèi)只存在一個實(shí)例。

Prototype作用域

  • 每次請求時都會創(chuàng)建一個新的實(shí)例(也是每次請時才會創(chuàng)建,一個被定義為該作用域的類如果沒有在任何地方使用它,那么你可以認(rèn)為它和一個普通的Java類沒有區(qū)別)。
  • 請求的方式包括注入該Bean到其他Bean里,每注入一個地方都是一個獨(dú)立的Bean。或者使用 context.getBean 方式獲取Bean的時候。
  • 容器啟動時不會自動實(shí)例化。
  • 容器在創(chuàng)建Bean后不再管理其生命周期。
  • 特別適合那種需要注入Spring中其他類的Java類,但是這個類又是在某些場景需要的時候才需要實(shí)例化的場景,例如實(shí)現(xiàn) Runnable 接口的線程任務(wù)類。

示例:

@Data
@Accessors(chain = true)
@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class Task implements Runnable {

    private TaskInfo taskInfo;

    // 注入對象
    @Autowired
    private TaskService taskService;

    @Override
    public void run() {
        taskService.process(taskInfo);
    }
}
// 調(diào)用示例代碼
ApplicationContext context = xxx;
ExecutorService executor = xxx;
TaskInfo taskInfo = xxx;
// 這里每次getBean獲取的Task對象都是一個新的實(shí)例
Task task = context.getBean(Task.class).setTaskInfo(taskInfo);
executor.execute(task);

總結(jié)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java 字浮串提取方法匯集

    java 字浮串提取方法匯集

    用方法toCharArray public char[] toCharArray()
    2008-10-10
  • @Async導(dǎo)致controller?404及失效原因解決分析

    @Async導(dǎo)致controller?404及失效原因解決分析

    這篇文章主要為大家介紹了@Async導(dǎo)致controller?404失效問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Java日期與時間類原理解析

    Java日期與時間類原理解析

    這篇文章主要介紹了Java日期與時間類原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-01-01
  • 最新評論

    桃江县| 镇安县| 辽宁省| 友谊县| 漾濞| 沧源| 哈巴河县| 苏尼特左旗| 黄骅市| 兰西县| 杭锦后旗| 诸暨市| 德化县| 鹤岗市| 嘉义市| 桂林市| 潢川县| 柘城县| 行唐县| 雅江县| 遂川县| 都安| 四川省| 泗水县| 德惠市| 会泽县| 渭南市| 宁阳县| 仁布县| 兰溪市| 甘洛县| 乌兰察布市| 甘谷县| 安远县| 安塞县| 南岸区| 香河县| 蓬莱市| 聂荣县| 巴林左旗| 鹤山市|