我试图找出 PlayPlugin 对象是如何在 Play Framework (1.2.5) 中使用的。
不同的 Play 线程之间是否共享相同的 PlayPlugin 实例?
通过一些源代码查找,我想是的,但由于 Play 在很多地方都有一些元编程,而且我对这一切不太熟悉,所以我不能 100% 确定。
PlayPlugin.beforeInvocation 的调用堆栈:
- PlayPlugin.beforeInvocation
- PluginCollection.beforeInvocation
- 启用插件列表是 PluginCollection 中的一个字段)
- 调用.before
- 使用静态字段 Play.PluginCollection
Thread.currentThread().setContextClassLoader(Play.classloader)
例如,可能会影响 Play.PluginCollection 的一件事。
所有线程的单一实例 - 行为也将由文章Play Framework: Introduction to Writing Modules确认:
beforeActionInvocation():此代码在控制器调用之前执行。用于验证,Play 也使用它。您也可以在此处将其他对象放入渲染参数中。一些插件还在线程局部变量中设置了一些变量,以确保它们是线程安全的。
所以,我想答案是肯定的,实例是共享的,但想确认一下。