Spring的同一個服務為什麼會載入多次?

来源:https://www.cnblogs.com/mindforward/archive/2022/10/15/16795266.html
-Advertisement-
Play Games

問題現象 最近在本地調試公司的一個Web項目時,無意中發現日誌中出現了兩次同一個服務的init記錄,項目都是基於Spring來搭建的,按理說服務都是單例的,應該只有一次服務載入日誌才對,本著對工作認真負責(閑來無事)的態度,必然要一探究竟。 問題分析 為什麼同一個 Bean 會被容器初始化兩次? 首 ...


問題現象

最近在本地調試公司的一個Web項目時,無意中發現日誌中出現了兩次同一個服務的init記錄,項目都是基於Spring來搭建的,按理說服務都是單例的,應該只有一次服務載入日誌才對,本著對工作認真負責(閑來無事)的態度,必然要一探究竟。
16657379326359.png

問題分析

為什麼同一個 Bean 會被容器初始化兩次?

首先,我們先來梳理一下 Web 容器中如何載入 Bean:

在 Web 容器中,ContextLoaderListenerDispatchServlet 都會在容器啟動的時候載入
Bean,區別在於 DispatchServlet 一般會載入 MVC 相關的 Bean,ContextLoaderListener
會載入 Spring 相關的 Bean,二者會分別生成一個WebApplicationContext

根據 web.xml 的載入順序,listener 會先於 Servlet 載入,當獲取 Bean 時,會優先從
DispatchServlet 生成的 WebApplicationContext 中查找,如果找不到再從ContextLoaderListener 生成的 WebApplicationContext 中查找。

那麼如果這兩個載入了同樣的Bean,到底該用誰的呢?

如果二者的配置文件中定義了相同的 Bean,則實際使用中只會用到 DispatchServlet 中的
Bean,ContextLoaderListener 中的 Bean 無法調用,造成記憶體泄漏。

接下來我們看一下項目中的 web.xml 配置,如下圖所示,ContextLoaderListener
DispatchServlet載入了相同的配置 spring.xml,所以會出現兩次 Bean 的初始化現象。

解決方案

經過上面的分析,我們知道了,之所以同一個Bean會被載入兩次,是由於我們在DispatchServletContextLoaderListener都定義了這個Bean。

因此,我們要做的就是讓ContextLoaderListenerDispatcherServlet分別載入不同的Bean:

  1. 新增applicationContext.xml,其中聲明ContextLoaderListener要載入的Bean:

  2. 修改spring.xml中的包掃描範圍,讓DispatcherServlet只載入mvc相關的Bean:

  3. 啟動服務,查看初始化信息,Service只被初始化了一次:

本文來自博客園,作者:時鐘在說話,轉載請註明原文鏈接:https://www.cnblogs.com/mindforward/p/16795266.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一.簡單瞭解MySQL 1.在瞭解MySQL之前因該瞭解的東西 資料庫(Database)指長期存儲在電腦內的、有組織的、可共用的數據集合。資料庫實際上就是一個文件集合,是一個存儲數據的倉庫,本質就是一個文件系統,資料庫是按照特定的格式把數據存儲起來,用戶可以對存儲的數據進行增刪改查操作。 資料庫 ...
  • 2022 年 10 月 13 日- PostgreSQL 全球開發組今天宣佈發佈 PostgreSQL 15,這是世界上最先進的開源資料庫的最新版本。 PostgreSQL 15 建立在最近版本的性能改進的基礎上,在管理本地和分散式部署中的工作負載方面取得了顯著收益,包括改進的排序。此版本通過... ...
  • 相關術語: DB :資料庫:在硬碟上以文件的方式存在DBMS:資料庫管理系統:例如mysql,oracle,sqlserver…SQL:一門適用於所有DBMS,對DB進行操作的標準規劃語言,DQL:資料庫查詢語句 select,DML:資料庫管理語句,修改表中數據update,insert,dele ...
  • 什麼是枚舉Enum 枚舉 Enum是在眾多語言中都有的一種數據類型,JavaScript中還沒有(TypeScript有)。用來表示一些特定類別的常量數據,如性別、學歷、方向、賬戶狀態等,項目開發中是很常用的。 | Text文字(界面顯示) | key編碼(編碼、存儲使用) | 數字value值(存 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 LocalStorage 是HTML5中一個方便使用的 API,它為 Web 開發人員 提供了一個易於使用的5MB的存儲空間。使用 LocalStorage API 真的再簡單不過了。不信看下: //Save a value to loc ...
  • 概述 在上一節中介紹了兩種加密方法 對稱加密 非對稱加密 其中對稱加密性能高,但是有泄露密鑰的風險,而非對稱加密相反,加密性能較差,但是密鑰不易泄露,那麼能不能把他們進行一下結合呢? HTTPS採用混合加密 HTTPS經由HTTP進行通信,但利用SSL/TLS來加密數據包,而SSL/TLS的加密方式 ...
  • 在筆者上一篇文章`《驅動開發:內核枚舉IoTimer定時器》`中我們通過`IoInitializeTimer`這個API函數為跳板,向下掃描特征碼獲取到了`IopTimerQueueHead`也就是IO定時器的隊列頭,本章學習的枚舉DPC定時器依然使用特征碼掃描,唯一不同的是在新版系統中DPC是被異... ...
  • @ConditionalOnProperty實現按需註入bean 簡訊工具類 SmsUtil zhenghe-common是一個基礎包。 SmsUtil坐落在zhenghe-common里。先看看Smsutil的面目。 package com.emax.zhenghe.common.util; im ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...