Controller是單例還是多例?

Controller是單例還是多例?

controller默認是單例的,不要使用非靜態的成員變量,否則會發生數據邏輯混亂。正因為單例所以不是線程安全的。

我們下面來簡單的驗證下:

package com.riemann.springbootdemo.controller;import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
public class ScopeTestController {private int num = 0;@RequestMapping("/testScope")public void testScope() {System.out.println(++num);}@RequestMapping("/testScope2")public void testScope2() {System.out.println(++num);}}

我們首先訪問 http://localhost:8080/testScope,得到的答案是1;

然后我們再訪問 http://localhost:8080/testScope2,得到的答案是 2。

得到的不同的值,這是線程不安全的。
接下來我們再來給controller增加作用多例 @Scope(“prototype”)

package com.riemann.springbootdemo.controller;import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
@Scope("prototype")
public class ScopeTestController {private int num = 0;@RequestMapping("/testScope")public void testScope() {System.out.println(++num);}@RequestMapping("/testScope2")public void testScope2() {System.out.println(++num);}}

我們依舊首先訪問 http://localhost:8080/testScope,得到的答案是1;

然后我們再訪問 http://localhost:8080/testScope2,得到的答案還是 1。

相信大家不難發現 :

單例是不安全的,會導致屬性重復使用。

解決方案
不要在controller中定義成員變量。

萬一必須要定義一個非靜態成員變量時候,則通過注解@Scope(“prototype”),將其設置為多例模式。

在Controller中使用ThreadLocal變量

補充說明
spring bean作用域有以下5個:

singleton: 單例模式,當spring創建applicationContext容器的時候,spring會欲初始化所有的該作用域實例,加上lazy-init就可以避免預處理;

prototype: 原型模式,每次通過getBean獲取該bean就會新產生一個實例,創建后spring將不再對其管理;

(下面是在web項目下才用到的)

request: 搞web的大家都應該明白request的域了吧,就是每次請求都新產生一個實例,和prototype不同就是創建后,接下來的管理,spring依然在監聽;

session: 每次會話,同上;

global session: 全局的web域,類似于servlet中的application。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/34749.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/34749.shtml
英文地址,請注明出處:http://en.pswp.cn/news/34749.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

docker配置文件

/etc/docker/daemon.json 文件作用 /etc/docker/daemon.json 文件是 Docker 配置文件,用于配置 Docker 守護進程的行為和參數。Docker 守護進程是負責管理和運行 Docker 容器的后臺進程,通過修改 daemon.json 文件,可以對 Docker 守護進程進…

不做Linux就沒前途嗎?

答案當然是——并不會 我晚上回來的時候跟一個今年的畢業生聊天,他入職了一家公司,但是從事的不是Linux相關的工作。 我這里想說的是,做Linux可以賺錢,Linux現在是全世界最牛逼的開源項目一點都不為過,但是Linux也不是…

NLP(六十五)LangChain中的重連(retry)機制

關于LangChain入門,讀者可參考文章NLP(五十六)LangChain入門 。 ??本文將會介紹LangChain中的重連機制,并嘗試給出定制化重連方案。 ??本文以LangChain中的對話功能(ChatOpenAI)為例。 LangChain中的重…

【Mysql】數據庫基礎與基本操作

🌇個人主頁:平凡的小蘇 📚學習格言:命運給你一個低的起點,是想看你精彩的翻盤,而不是讓你自甘墮落,腳下的路雖然難走,但我還能走,比起向陽而生,我更想嘗試逆風…

Centos 7 出現 write error (disk full?)

問題 mysql 導入任務時,由于導出的 sql 文件是在很大 (30G),利用 SQLDumpSpliter 切割工具 切成幾個 1G 大小的 sql 文件 結果在導入大半天,突然報錯 (另一個服務器上更慘,都導入兩天快完成的…

一分鐘上手Vue VueI18n Internationalization(i18n)多國語言系統開發、國際化、中英文語言切換!

這里以Vue2為例子 第一步:安裝vue-i18n npm install vue-i18n8.26.5 第二步:在src下創建js文件夾,繼續創建language文件夾 在language文件夾里面創建zh.js、en.js、index.js這仨文件 這仨文件代碼分別如下: zh.js export de…

在Eclipse在Java里面調用Python腳本的方法

由于項目中需要用到Java調用Python的腳本,來實現一些功能,就對jython做了一些了解,通過jython可以實現java對python腳本的調用。Java調用Python開發環境配置(EclipseJythonPyDev) 1、Jython是什么 Java可以使用Jython庫來調用Python庫。Jyt…

你不得不懂的IT知識-《敏捷項目管理》

國林哥在IBM時,幾乎每天都會收到關于“敏捷”相關的郵件,公司鼓勵我們去學習郵件里的知識,參加敏捷相關的認證和培訓。剛開始我和大多數同事一樣不管不顧,后來隨著PBC里要求加上成長目標,比如要獲得一個認證&#xff0…

React使用antd的圖片預覽組件,點擊哪個圖片就預覽哪個的設置

使用了官方推薦的相冊模式的預覽,但是點擊預覽之后,每次都是從圖片列表的第一張開始預覽,而不是點擊哪張就從哪張開始預覽: 所以這里我就封裝了一下,對初始化預覽的列表進行了邏輯處理: 當點擊開始預覽的…

加載并繪制時間域內的心電圖信號,并實施Q因子為1的陷波濾波器以去除50 Hz頻率研究(Matlab代碼實現)

💥💥💞💞歡迎來到本博客????💥💥 🏆博主優勢:🌞🌞🌞博客內容盡量做到思維縝密,邏輯清晰,為了方便讀者。 ??座右銘&a…

一篇打通,pytest自動化測試框架詳細,從0到1精通實戰(一)

目錄:導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結(尾部小驚喜) 前言 pytest單元測試框…

redis學習筆記(七)

文章目錄 zset(有序集合)(1)添加成員(2)獲取score在指定區間的所有成員(3)獲取集合長度(4)獲取指定成員的權重值(5)獲取指定成員在集合…

2308C++簡單異步改造網絡庫

用簡單異步可以輕松改造同步網絡庫從而獲得大幅性能提升,用它改造異步回調網絡庫可以讓我們以同步方式寫代碼,讓代碼更簡潔,可讀性更好,還能避免回調地獄的問題. 本文通過兩個例子分別來介紹如何用簡單異步改造基于asio的同步網絡庫和異步回調網絡庫. 示例依賴了獨立版的asio(…

JavaWeb_總體介紹

文章目錄 1.總括2.JavaWeb項目架構 1.總括 2.JavaWeb項目架構

request.post,json和data

參考 https://zhuanlan.zhihu.com/p/140372568 https://zhuanlan.zhihu.com/p/140372568 介紹 這兩條請求語句使用了不同的參數傳遞方式,有以下區別:1. requests.post(urlhttp://xx.8.84.xx:8000/inference, jsondata)這個語句使用了 json 參數&#…

js設置css變量控制頁面一行展示指定個數的元素

前置知識: CSS變量之var()函數的應用——動態修改樣式 & root的使用 flex相關知識 場景: 動態設置給父元素內子元素設置每行排列幾個 通過 document.body.style.setProperty(--itemNum, 5)設置樣式變量,然后通過給父元素設置display: f…

RocketMQ發送消息失敗:error CODE: 14 DESC: service not available now, maybe disk full

在執行業務時,發現MQ控制臺沒有查詢到消息,在日志中發現消息發送失敗,報錯error CODE: 14 DESC: service not available now, maybe disk full 分析報錯應該是磁盤空間不足,導致broker不能進行正常的消息存儲刷盤,去查…

MySQL 窗口函數是什么,有這么好用

先看這段像天書一樣的 SQL ,看著就頭疼。 SELECTs1.name,s1.subject,s1.score,sub.avg_score AS average_score_per_subject,(SELECT COUNT(DISTINCT s2.score) 1 FROM scores s2 WHERE s2.score > s1.score) AS score_rank FROM scores s1 JOIN (SELECT subject, AVG(sco…

Android 13 MTK平臺添加自定義按鍵,以及CTS問題解決

添加自定義按鍵流程 一般來說上層添加以下幾處修改 驅動層的鍵值上報,讓驅動處理好即可 frameworks / base/core/java/android/view/KeyEvent.java public static final int KEYCODE_DEMO_APP_4 = 304;/** add by songhui for fingerprint Key code */+ public static fina…