play1.2.4版本:
继承类play.PlayPlugin,我们可以实现插件的功能。
play框架本身基于此类提供了一些已经实现的plugin,比如:ConfigurablePluginDisablingPlugin, CorePlugin, DBPlugin, Evolutions, JobsPlugin, JPAPlugin, MessagesPlugin, TempFilePlugin, ValidationPlugin, WS
这其中有我们非常熟悉的JobsPlugin,实现一些定时JOB,onApplicationStart() 和onApplicationStop() 在服务启动停止时实现一些我们自己的业务。
onApplicationStart() 和onApplicationStop() 都是PlayPlugin类的方法,当然还有很多其它方法,你只需要继承类并重写这些方法就可以实现自己需要的插件。
打开play-1.2.4.jar包,在根目录下,我们可以看到文件play.plugins,这里面列出了所有play已经实现的插件,该文件中列出的插件类在play启动时加载。打开看看内容:
0:play.CorePlugin 100:play.data.parsing.TempFilePlugin 200:play.data.validation.ValidationPlugin 300:play.db.DBPlugin 400:play.db.jpa.JPAPlugin 450:play.db.Evolutions 500:play.i18n.MessagesPlugin 600:play.libs.WS 700:play.jobs.JobsPlugin 100000:play.plugins.ConfigurablePluginDisablingPlugin |
每个插件类一行,第一列的数字为编号。
所以,我们要实现自己的插件并应用,必须也新加一个play.plugins文件(名称必须为play.plugins,在play jar中写死了,否则无法加载),存放在app目录下。
好了,主要内容描述完了,下面来个简单例子,主要实现在所有action调用前做一些操作,你可以做用户校验,这里只简单做个公共变量配置,假设所有模板都需要这个变量的话:
第一步:定义一个类,名称无所谓,只要继承类play.PlayPlugin,并重写方法beforeActionInvocation:
package plugin; import flect.Method; import play.PlayPlugin; import play.mvc.Scope; public class RenderPublicVariablePlugin extends PlayPlugin { @Override public void beforeActionInvocation(Method actionMethod) { Scope.RenderArgs args = Scope.RenderArgs.current(); args.put("test", "FROM plugin:this is the TEST parameter's value!"); } } |
第二步:在app目录下添加文件play.plugins,内容如下:
2000:plugin.RenderPublicVariablePlugin |
第三步? 没有了,就是这么简单,这样你在所有模板里就可以直接引用变量test了。
后续需测试:
如果多个插件都实现beforeActionInvocation,程序会怎么处理,根据在play.plugins中列出的顺序先后执行?
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论