<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          昨天單身的你像不像Controller單例

          共 2138字,需瀏覽 5分鐘

           ·

          2020-08-28 01:23

          沒人約不如好好學(xué)習
          答案:
          controller默認是單例的,不要使用非靜態(tài)的成員變量,否則會發(fā)生數(shù)據(jù)邏輯混亂。正因為單例所以不是線程安全的。
          我們下面來簡單的驗證下:
          package com.riemann.springbootdemo.controller;
          import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;
          /** * @author riemann * @date 2019/07/29 22:56 */@Controllerpublic 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;
          /** * @author riemann * @date 2019/07/29 22:56 */@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。
          相信大家不難發(fā)現(xiàn) :
          單例是不安全的,會導(dǎo)致屬性重復(fù)使用。

          解決方案

          • 不要在controller中定義成員變量。
          • 萬一必須要定義一個非靜態(tài)成員變量時候,則通過注解@Scope(“prototype”),將其設(shè)置為多例模式。
          • 在Controller中使用ThreadLocal變量

          補充說明

          spring bean作用域有以下5個:
          singleton:?單例模式,當spring創(chuàng)建applicationContext容器的時候,spring會欲初始化所有的該作用域?qū)嵗由蟣azy-init就可以避免預(yù)處理;
          prototype:?原型模式,每次通過getBean獲取該bean就會新產(chǎn)生一個實例,創(chuàng)建后spring將不再對其管理;
          (下面是在web項目下才用到的)
          request:?搞web的大家都應(yīng)該明白request的域了吧,就是每次請求都新產(chǎn)生一個實例,和prototype不同就是創(chuàng)建后,接下來的管理,spring依然在監(jiān)聽;
          session:?每次會話,同上;
          global session:?全局的web域,類似于servlet中的application。

          作者:riemann_
          blog.csdn.net/riemann_/article/details/97698560
          —??—
          歡迎關(guān)注“Java引導(dǎo)者”,我們分享最有價值的Java的干貨文章,助力您成為有思想的Java開發(fā)工程師!

          瀏覽 33
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产片婬乱18一级毛片视頻 | 丁香五月六月婷婷 | 国产美女被鸡巴操 | 亚洲黄色免费电影 | 午夜性福利视频 |