2010-07-13 117 views
4

據我瞭解彈簧控制器是無狀態的嗎?如果我將某個字段設置爲某個值,則在下一次調用時會撤消該字段。彈簧控制器init方法

是否有可能添加一個init方法或其他東西?當我的控制器被觸發時調用一次的方法?我使用spring 3.0和一個註釋配置atm。

+0

你在不能注入控制器需要什麼樣的數據或存儲在會話中? – Jeff 2010-07-13 12:21:18

回答

19

Spring控制器默認情況下應該處於無狀態,這是正確的。不過,這並不意味着您的價值將在下一次通話中被撤銷。從程序員的角度來看,如果最終得到的是同一個控制器實例或不同實例,那麼這是不可判定的。更不確定的是沒有其他人使用控制器(因此在此期間改變了它的狀態)。這就是爲什麼不建議在控制器的域中保存任何狀態。也許你應該重新考慮在你的控制器中需要一個字段。

實際上有一個spring bean的init方法。您可以簡單地在您的控制器上註釋一個公共無效方法@PostConstruct。此方法是依賴關係已被注入後執行。因此,該方法在創建控制器實例後被調用。

據我瞭解您的問題,您尋找一種方法,即在每次調用控制器的方法之前執行。在這種情況下,您可以簡單地在調用您的「init」 - 在每個控制器方法開頭的方法。如果你不想在你的代碼中明確地做到這一點,AOP爲你提供了另一種選擇。

3

據我所知,彈簧控制器是無狀態的嗎?如果我將某個字段設置爲某個值,則在下一次調用時會撤消該字段。

我認爲是不正確的:彈簧控制器可以是有狀態。您應該非常小心,因爲控制器應該是可重入且線程安全的,並且支持多個線程同時執行多個請求。

它可能是安全的說它最佳實踐控制器被設計爲有效無狀態;即在控制器「有效」時沒有改變的狀態。

是否有添加init方法或其他的可能性?

這並不完全清楚你的意思。但是:

  • 控制器的handleRequest被調用來啓動請求。
  • 如果您將任何bean(例如控制器bean)聲明爲ApplicationContextAware,它將被回調以通知其ApplicationContext。
  • 如果你聲明任何bean爲ServletContextAware它將被回調通知它的ServletContext。
  • 如果將任何bean聲明爲InitializingBean,則將在設置所有屬性時調用它。

無疑還有其他回調和掛鉤可用於觸發某些延遲的初始化/上下文設置。

(我不知道如何將這些回調/鉤子映射到註釋...但我敢肯定,他們這樣做。)