在spring MVC中创建一个应用程序作用域bean

时间:2011-05-23 16:05:13

标签: java spring

每个人都好,

在我提出问题之前,我想解释一下我当前的遗留应用程序。 我在Tomcat中有一个servlet,我使用Hibernate在init()中将一个不变的数据库表加载到内存中。因为这是在init()中定义的,所以它只被调用一次,并且在所有后续的servlet请求中都可用,因为它可以提高应用程序性能,因为它可以减少到数据库的往返次数。

我最近开始使用Spring 3,我想把这个设置(servlet类现在是一个控制器)改为Spring,但我的挑战是如何创建域对象的ArrayList(就像我在init中做的那样) ))在Spring加载时提高效率,并且在每次请求进入时都可以在所有对控制器类的调用中使用它而不访问数据库。如果这不可能,那么我有哪些选项?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分: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);

    }
}

答案 1 :(得分:0)

  

如何在Spring加载时创建域对象的ArrayList(就像我在init()中那样)以提高效率,并且在每次请求进入时都可以在所有对控制器类的调用中使用它而无需访问数据库。如果这是不可能的,那么我有哪些选择?

如果数据不断变化并且必须在每次请求时从数据库中读取,我会在你的场景中设计这个几乎相同:

  • 控制器与MyService接口的实例连接,该接口具有检索相关数据的操作。
    • 或者,根据您是否将DAO层与服务层分开,MyService实现与MyDAO bean连接。
  • MyService实现标记为InitializingBean,在afterPropertiesSet()方法中,您从数据库中检索一次性加载数据。

使用这种设计,您的控制器不知道数据的来源,只是它要求MyService实现数据。当Spring容器首次创建MyService实现bean时,将从数据库加载数据。

通过交换MyService的不同实现,您可以轻松更改设计以在每个请求上加载数据(或在特定时间使数据到期等)。