2012-11-23 61 views
3

我有一個用戶等級:會話範圍bean作爲Spring MVC的控制器的類屬性

@Component 
@Scope("session") 
public class User { 
    private String username; 
} 

和控制器類:

@Controller 
public class UserManager { 
    @Autowired 
    private User user; 

    @ModelAttribute("user") 
    private User createUser() { 
     return user; 
    } 

    @RequestMapping(value = "/user") 
    public String getUser(HttpServletRequest request) { 
     Random r = new Random(); 
     user.setUsername(new Double(r.nextDouble()).toString()); 
     request.getSession().invalidate(); 
     request.getSession(true); 
     return "user"; 
    } 
} 

我無效的會話,這樣,下一次我一定要/用戶,我得到另一個用戶。由於用戶的會話範圍,我期待着不同的用戶,但我得到的是同一個用戶。我檢查了調試模式,它在內存中是相同的對象ID。我的豆聲明如下:

<bean id="user" class="org.synchronica.domain.User"> 
     <aop:scoped-proxy/> 
    </bean> 

我是新來的春天,所以我顯然做錯了什麼。我想爲每個會話用戶的一個實例。怎麼樣?

回答

3

這是預期的行爲。當您使用<aop:scoped-proxy/>標記bean時,會爲其創建代理。如果有一個bean的接口,則會創建一個java動態代理,否則會創建一個基於CGLIB的代理 - 在您的情況下,因爲您的User類沒有父類/接口,將爲您創建一個基於CGLIB的代理。

現在的問題是,這個代理是什麼將被注入到你的所有類,這就是爲什麼你只看到1個實例(代理本質上),代理知道如何管理範圍雖然 - 作爲只要你經歷過你的類的方法,那麼在你的情況下,如果你通過getter和setter調用來獲得你的User類的屬性,你應該看到反映適合於該會話的值。

+0

有沒有什麼辦法可以在同一開發機器上的多個會話上測試對象? –

+0

打開一個新的瀏覽器窗口並以其他用戶身份登錄。 –

相關問題