Cubby的plugin的实现原理以及执行顺序分析
来源:互联网 发布:小火柴软件 编辑:程序博客网 时间:2024/05/08 13:05
在cubby里可以使用plugin实现拦截器。通常的做法是重载plugin的invokeAction方法对Action方法进行拦截。
执行顺序
CubbyFilter --> Action.initialize() --> Plugin.invokeAction() --> Actoin.xxx()
plugin代码示例
public class TestPlugin extends AbstractPlugin {@Overridepublic ActionResult invokeAction(final ActionInvocation invocation)throws Exception {//Action前的处理......//Action处理xxxAction action = (xxxAction) invocation.getActionContext().getAction();ActionResult result = super.invokeAction(invocation);//Action后的处理...... return result;}}
com.example.plugin.TestPlugin
这里的文件名和文件位置是固定的。可以查看Cubby源代码的plugin加载类:
org.seasar.cubby.internal.util.ServiceLoader
这个类里的代码
private static final String PREFIX = "META-INF/services/";
决定了文件的位置。
而通过这个类里的代码
final String resourceName = PREFIX + service.getName();
可以发觉文件名就是从plugin管理类
org.seasar.cubby.internal.plugin.PluginManager
的代码
for (final Plugin plugin : ServiceLoader.load(Plugin.class)) {
plugins.add(plugin);
}
传递过来的Plugin.class的完整类名,即org.seasar.cubby.plugin.Plugin。
所以,这个文件的名字和位置是有框架的源代码决定的固定值。
另外,通过源代码可以发现,在ServiceLoader类中,加载的plugin是存储在LinkedHashMap<String, S>中的,因此这时候是有序的。
而在返回到类PluginManager时,plugin是存储在LinkedHashSet<Plugin>中的,因此,到这里为止plugin还是有序的。
但是,PluginManager里把plugin加载到类PluginRegistry中的时候,是存储在HashSet<Plugin>里的,所以最后又变成无序的了。
而执行plugin的代码是在类ActionProcessorImpl中以下代码取得类PluginRegistry里的plugin的迭代器,
this.pluginsIterator = pluginRegistry.getPlugins().iterator();
也就是说最终执行plugin时是无序的。
所以,如果需要有序的多个拦截器的话,不要用创建多个plugin的方法。
可以在一个plugin里调用多个类来处理;
也可以把一些前面的处理放到Action的initialize()里 。
- Cubby的plugin的实现原理以及执行顺序分析
- MyBatis执行一次数据库操作的原理以及顺序
- S2Container + Cubby 工程的创建
- sql的执行原理和执行顺序
- SQL 的执行顺序分析
- cubby对应多种编码的做法
- 对于 S2Container + Cubby 数据绑定和自己获取提交数据的分析
- plugin的实现原理(Linux 环境)
- sql语句的执行顺序 以及 优化
- Java程序的执行顺序以及赋值顺序
- 关于try,finally执行顺序的分析
- 分析下面的代码执行数顺序
- 【java关键字-Thread】Thread.Join()的用法,及其实现线程顺序执行的原理
- 异步函数顺序执行的实现
- sturts2拦截器执行顺序理解以及拦截器机制实现原理
- Hashmap的原理以及实现
- JAVA类代码块执行顺序、以及继承父类的执行顺序
- SQL语句的执行原理分析
- DSP之有限字长效应
- iphone No architectures to compile for (ARCHS=i386, VALID_ARCHS=armv6 armv7)错误解决办法
- 快速寻找满足条件的两个数或三个数
- 谈语感:统计语言模型
- 瞧瞧苹果OS X如何干掉Linux
- Cubby的plugin的实现原理以及执行顺序分析
- 628和822大K站:每个站长挥之不去的阴影
- bat批处理
- 发布Qt程序时,插件设置
- java中abstract,interface,final,static
- mysql存储过程详解
- 根据主机名来查找ip或者根据ip来查看主机名(nbtstat)
- C# 判断本机是否安装Excel及多版本安装?获取Excel进程信息和打开Excel应用软件
- tar命令常用方法