開發專案時遇到介面呼叫方同時有兩個請求進來同一個方法,存入plan物件時,資料庫報主鍵衝突,難道springboot自動注入的實體類在不同請求進來時,指向的是同一個物件地址嗎,為什麼不會自動new一個新的物件呢?
有可能是我加了註解Data、導致的嗎
回覆列表
-
1 # 影視避風港
-
2 # 破力
問題一
首先spring注入的類例項是有IOC容器建立的,IOC容器建立的是公用物件,是單例物件,一次建立,到處使用。,其次request是多執行緒的
問題二,為什麼不每次reqeust都new物件先說說IOC的思想了,IOC-Inversion of Control,即“控制反轉”, 不是什麼技術,而是一種設計思想。在Java開發中,Ioc意味著將你設計好的物件交給容器控制,而不是傳統的在你的物件內部直接控制。
透過控制反轉客戶端不需要再主動建立物件,只需要透過IOC,由IOC去建立就可以了,由傳統的應用程式建立物件轉變為由IOC容器來建立,用於控制建立物件的主體發生了改變,這是控制反轉。 應用程式需要的物件資訊由IOC容器建立後注入,也就是說依賴於容器來注入,這是依賴注入 表達的是一個東西,只是描述的角度不同。 IOC,從容器的角度出發,容器反向控制應用程式物件的建立;
現在來看為什麼不new物件
如果物件的構造器發生了變化,是不是每次都需要改動很多需要該物件的地方,但是如果我們把物件的建立交給 ioc 容器來管理,我們就不用關心物件的建立這些,需要物件的時候,我們只需要去透過ioc容器獲取我們需要的物件就可以了。
再來看你截圖的程式碼,plan物件明顯是一個作為一個實體類存在的,這樣的類物件不應該交給ioc控制,由於ioc的單列特性,導致plan物件只有一個,就造成了你上面的問題。
Data註解這個Data註解是編譯期的一個註解,是在編譯階段自動生成field的getter和setter方法,不會對執行期的內容有影響
你指定了bean的主鍵了吧,要不就是主鍵生成策略有問題。spring預設單例,不會出現你說的同一個物件,要是你自己定義了static變數就當我沒說