3

Count.java:如何使用Session範圍的組件,在控制器

@Component 
@Scope(value = "session",proxyMode = ScopedProxyMode.TARGET_CLASS) 
public class Count { 
    Integer i; 
    public Count() { 
     this.i = 0; 
    } 

控制器:

@Controller 
public class GreetingController { 
    @Autowired private Count count; 
    @RequestMapping("/greeting") 
    public String greetingForm(Model model) { 
     if(count.i == null) i == 0; 
     else i++; 
     model.addAttribute("count",String.valueOf(count.i)); 
     return "greeting"; 
    } 
} 

但我每次運行這個控制器(/賀卡),它總是增加了我,即使我關閉瀏覽器,那麼如何在Singleton控制器中使用此Session Session組件?

+0

[Spring request scope bean]的可能重複(http://stackoverflow.com/questions/14731092/sp​​ring-request-scope-bean) – nowszy94

+1

爲'i'創建一個getter。 – zeroflagL

+0

@zeroflagL:它的工作原理,謝謝。但你能解釋一下嗎?起初,會話bean像一個全局變量,它甚至在我刪除cookies時也會增加。但是使用setter/getter來代替i ++;它的作用就像一個魅力 – Snoob

回答

8

該代理只攔截方法調用。你的情況會發生以下情況:

@Autowired private Count count; 

創建一個代理,看起來像數的實例,因此也有一個i場。但由於代理不是真實的,所以不調用Count構造函數,並且i保持未初始化狀態。這就是爲什麼你總是得到null

現在介紹一個getter:

class Count { 
    ... 
    public Integer getI() { 
    return i; 
    } 

當你調用getI()代理首先檢查是否存在Count豆當前會話的一個實例。如果沒有,就創建一個。這也意味着Count構造函數被調用,並且i現在處於初始狀態。然後,代理將調用委託給bean的getI(),該返回值將返回值i

+0

你的anwser還解釋了什麼是代理以及它是如何工作的:D – Snoob