0

我试图找出 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 也使用它。您也可以在此处将其他对象放入渲染参数中。一些插件还在线程局部变量中设置了一些变量,以确保它们是线程安全的。

所以,我想答案是肯定的,实例是共享的,但想确认一下。

4

1 回答 1

0

你说的对。PlayPlugin(当然是子类)的每个实例都在整个 JVM 中共享。Play.plugin(class<T> clazz)您可以通过方法调用获得该实例。

于 2013-02-15T08:11:24.343 回答