2011-05-23 45 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的不同实现来在每个请求上加载数据(或在特定时间等期满数据)。

相关问题