Spring Controller init方法

时间:2010-07-13 12:09:07

标签: java spring spring-mvc

据我所知,弹簧控制器是无状态的吗?如果我将字段设置为某个值,则下一次调用将撤消该字段。

是否有可能添加init方法或其他东西?当我的控制器被触发时,被调用一次的方法?我正在使用spring 3.0和一个注释配置atm。

2 个答案:

答案 0 :(得分:20)

默认情况下,Spring控制器应该处理无状态,这是正确的。然而,这并不意味着您的价值将在下次通话时被撤销。从程序员的角度来看,如果您最终使用相同的控制器实例或不同的实例,则无法判定。更进一步的是,没有其他人使用控制器(因此在此期间改变了其状态)。这就是为什么不建议在控制器的字段中保存任何状态。也许您应该重新考虑控制器中对字段的需求。

实际上,spring bean有一个init方法。您可以使用 @PostConstruct 在控制器上简单地注释公共void方法。注入依赖项后执行此方法 。因此,在创建控制器实例之后,将调用此方法。

据我了解您的问题,您需要寻找一些方法,即在每次调用控制器的方法之前执行。在这种情况下,您只需在每个控制器方法的开头调用“init”方法。如果您不想在代码中明确地执行此操作,AOP会为您提供替代方案。

答案 1 :(得分:3)

  

据我所知,弹簧控制器是无状态的吗?如果我将字段设置为某个值,则下一次调用将撤消该字段。

我认为这是不正确的:Spring控制器可以有状态。您应该非常小心,因为Controller应该是可重入且线程安全的,并支持多个线程同时执行多个请求。

可以肯定地说,控制器设计为有效无状态是最佳实践;即,当控制器处于“实时”时,没有任何状态发生变化。

  

有可能添加init方法吗?

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

  • 调用控制器的handleRequest来启动请求。
  • 如果您将任何bean(例如控制器bean)声明为ApplicationContextAware,它将被回调以通知它ApplicationContext。
  • 如果您将任何bean声明为ServletContextAware,它将被回调以通知它ServletContext。
  • 如果您将任何bean声明为InitializingBean,则在设置所有属性后将回调它。

毫无疑问,您可以使用其他回调和挂钩来触发一些延迟初始化/上下文设置。

(我不确定这些回调/钩子如何映射到注释......但我确信它们会这样做。)