2010-07-13 118 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,则将在设置所有属性时调用它。

无疑还有其他回调和挂钩可用于触发某些延迟的初始化/上下文设置。

(我不知道如何将这些回调/钩子映射到注释...但我敢肯定,他们这样做。)