繁体   English   中英

Spring Controller init方法

[英]Spring Controller init method

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

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

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

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

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

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

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

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

是否有可能添加init方法或其他东西?

你的意思并不完全清楚。 然而:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM