2011-05-23 76 views
1

美好的一天每個人,創建應用程序Spring MVC中範圍的bean

我想解釋一下我目前的遺留應用程序之前,我問我的問題。 我有一個Tomcat中的servlet,我使用Hibernate在init()中將一個不變的數據庫表加載到內存中。因爲這是在init()中定義的,所以它只被調用一次,並且在隨後對servlet的所有請求中都可用,因此它被用來提高應用程序性能,因爲它減少了對數據庫的往返次數。

我最近開始使用Spring 3,並且我想將此設置(servlet類現在是一個控制器)更改爲Spring,但我的挑戰是如何創建域對象的ArrayList(如我在init ()),以提高效率,並且在所有對控制器類的調用中都可用,而不需要每次請求時都訪問數據庫。如果這不可行,那麼我有哪些選項?

任何幫助將不勝感激。

回答

2

流行靜態數據到RequestInterceptor

public class RequestInterceptor extends HandlerInterceptorAdapter { 
@Override 
    public void postHandle(
     HttpServletRequest request, 
     HttpServletResponse response, 
     Object handler, 
     ModelAndView modelAndView) throws Exception { 

     .... 
     modelAndView.addObject("variableName", dataIWantToHaveAvailableAllOverThePlace); 
     .... 
     super.postHandle(request, response, handler, modelAndView); 

    } 
} 
+0

感謝您的回覆,但沒有解決一個基本問題,那就是如何在請求完全進入之前,在彈簧加載時創建我需要從數據庫獲取的數組列表。也請原諒我,如果這是一個愚蠢的問題,但我如何找回你在我的控制器類中的modelandview對象中設置的變量 – 2011-05-23 16:38:27

+0

你可以訪問任何你放在modelAndView中的任何控制器,它是一個HashMap,這個數據是也可用於您可能擁有的任何JSP前端。 在第一個請求進入之前,RequestInterceptor將被調用,因此數據在第一個請求執行之前將可用。 如何從數據庫中獲取數據,這取決於您如何訪問數據庫,我使用Hibernate,因此我需要的任何數據都已經在數組列表中。要在上下文啓動後執行方法,請使用可將數據加載到單例中的@PostConstruct。 – 2011-05-23 17:17:32

0

如何創建域對象的ArrayList中的彈簧載荷時間效率(如我在init()做的),可將其跨所有對控制器類的調用在每次請求進入時都不訪問數據庫。如果這不可行,那麼我有哪些選項?

我會,因爲我想,如果數據是不斷變化的,必須從每個請求的數據庫中讀取幾乎相同在方案設計這樣的:

  • 控制器連線了一個實例MyService接口,其具有用於檢索所討論的數據的操作。
    • (可選)根據是否將DAO層與服務層分開,MyService實現與一個MyDAO bean連接。
  • MyService執行被標記爲InitializingBean,並在afterPropertiesSet()方法,你從數據庫中檢索的一次性加載數據。

通過這種設計,您的控制器不知道數據來自何處,只是它要求數據的實現爲MyService。當Spring容器首次創建MyService實現bean時,將從數據庫加載數據。

這使您可以輕鬆更改設計,以便通過交換MyService的不同實現來在每個請求上加載數據(或在特定時間等期滿數據)。

相關問題