Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结
Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结
3.2. 必须手动throw stop ex终止,负责自动接续。。4
1. 微内核与插件的优点
但凡有生命力的产品,都是在扩展性方面设计的比较好的,因为没有哪个产品可以覆盖所有需求,对于开源软件尤其如此。所以,产品只有具有良好的扩展性,允许用户或第三方参与进来,进行二次开发,才能保持生命力。
怎么样的扩展性才是最好的?通常来讲,就是没有任何功能是硬编码的,所有的功能都可被用户替换。
原作者应把自己也当作扩展者,自己添加功能时,也要用第三方扩展者同样的方式进行,而不要有特权。
要做到这一点,就需要一个良好的框架支撑,“微内核+插件”是一个不错的选择,Eclipse、Maven等知名软件都采用该体系。
什么是“微内核+插件”?微内核,即最小化核心,内核只负责插件的组装,不带任何功能逻辑,所有功能都由可替换的插件实现,并且,组装过程应基于统一的规则,比如基于setter注入,而不能对不同插件硬编码组装,这样可以确保没有任何功能在内核中硬编码。比如:Spring, OSGI, JMX, ServiceLoader等都是常见的微核容器,它们负责基于统一规则的组装,但不带功能逻辑。
非功能性的插件组装过程,可以由微内核框架来完成,那功能性的组装怎么办呢?我们可以把功能性的组装过程也封装成插件,即让大插件组装小插件,形成级联组装关系。
2. 插件的注册与使用
2.1. Ioc容器中注册插件
FilterFilterChain plugx = new FilterFilterChain();
plugx.add_action("ini", new G().m1);
作者:: 老哇的爪子 Attilax 艾龙, EMAIL:1466519819@qq.com
转载请注明来源: http://www.cnblogs.com/attilax/
2.2. 启动器微内核启动
public partial class App : Application
{
// this.StartupEventArgs
public App()
{
IocX.ini();
FilterFilterChain plugx = new FilterFilterChain();
plugx.do_action("ini",null,null);
Console.WriteLine("---f");
}
}
}
3. 插件的俩种执行策略
3.1. 必须手动接续,否则自动终止(推荐)
Java的就是这个。
这个比较好,可以支持ajax。。。。
可以漏斗形闪入闪出调用。。折回调用。。
//for ajax ,must trans in param
do_action("submit_before_check",mp,submitx2);
3.2. 必须手动throw stop ex终止,负责自动接续。。
在以下情况下web container不能把filter加载到service中:
·
· 抛出ServletException异常。
· 在container定义的时间内没有返回。
4. 插件链的生成原理
遍历委托方法List,生成LIST
遍历List,设置nextChain为下一个。。
启动插件流程。。
FilterFilterChain firstChain = chains[0];
filterHandler hd = firstChain.handler;
hd(args,firstChain.nextChain);
5. -------code
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ClassLibrary1.com.attilax.lang
{
public class FilterFilterChain
{
public static Dictionary<String, IList<filterHandler>> pluginsAti = new Dictionary<string, IList<filterHandler>>();
public delegate Object filterHandler(Object obj, FilterFilterChain nextChain);//第一步:定义委托类型
filterHandler handler; //filter
// private FilterFilterChain next1;
// private filterHandler filterHandler;
public FilterFilterChain()
{
}
public void add_action(String hookPoint, filterHandler func)
{
try
{
pluginsAti[hookPoint].Add(func);
}
catch (KeyNotFoundException e)
{
pluginsAti.Add(hookPoint, new List<filterHandler>());
pluginsAti[hookPoint].Add(func);
}
// pluginsAti.hookPoint.push(func);
}
public void do_action(String hookPoint, object args, filterHandler fltFinishCallback)
{
IList<filterHandler> fun_arr = pluginsAti[hookPoint];
//===============add to list
IList<FilterFilterChain> chains = new List<FilterFilterChain>();
for (var i = 0; i < fun_arr.Count; i++)
{
FilterFilterChain cur = new FilterFilterChain();
cur.handler = fun_arr[i];
chains.Add(cur);
}
if (fltFinishCallback != null)
{
FilterFilterChain next2 = new FilterFilterChain();
next2.handler = fltFinishCallback;
chains.Add(next2);
}
///set next
for (var i = 0; i < chains.Count; i++)
{
try
{
chains[i].nextChain = chains[i + 1];
}
catch (ArgumentOutOfRangeException e) { }
}
chains[chains.Count - 1].nextChain = new FilterFilterChain();
// fn(mp);
FilterFilterChain firstChain = chains[0];
filterHandler hd = firstChain.handler;
hd(args,firstChain.nextChain);
}
public void doFilter(Object data)
{
filterHandler hd = this.handler;
if(hd!=null)
hd(data, this.nextChain);
}
public FilterFilterChain nextChain { get; set; }
}
}
6. 参考
Atitit.wordpress插件机制原理与设计 attilax 总结
Atitit.java filter插件机制原理与 attilax总结.doc
Atitit 插件机制原理与设计微内核 c# java 的实现attilax总结的更多相关文章
- atitit.session的原理以及设计 java php实现的异同
atitit.session的原理以及设计 java php实现的异同 1. session的保存:java在内存中,php脚本因为不能常驻内存,所以在文件中 1 2. php的session机制 1 ...
- Atitit.HTTP 代理原理及实现 正向代理与反向代理attilax总结
Atitit.HTTP 代理原理及实现 正向代理与反向代理attilax总结 1. 普通代理1 1.1.1. 普通代理2 2. 隧道代理3 3. 反向代理 4 4. 正向代理也可以使用apache实现 ...
- Atitit.导出excel报表的设计与实现java .net php 总
Atitit.导出excel报表的设计与实现java .net php 总结 1. 导出报表 表格的设计要素1 1.1. 支持通用list<Map>转换1 1.2. 对于空列是否输出1 1 ...
- Atitit.导出excel报表的设计与实现java .net php 总结
Atitit.导出excel报表的设计与实现java .net php 总结 1. 导出报表 表格的设计要素1 1.1. 支持通用list<Map>转换1 1.2. 对于空列是否输出1 1 ...
- mybatis插件机制原理
mybatis插件机制及分页插件原理 参考链接:mybatis插件机制及分页插件原理 如何编写一个自定义mybatis插件 参考链接:mybatis 自定义插件的使用
- PHP中的插件机制原理和实例
PHP项目中很多用到插件的地方,更尤其是基础程序写成之后很多功能由第三方完善开发的时候,更能用到插件机制,现在说一下插件的实现.特点是无论你是否激活,都不影响主程序的运行,即使是删除也不会影响. 从一 ...
- Maven生命周期和插件机制
Maven中的一个非常重要的概念是生命周期和插件,这篇文章重点介绍下Maven的生命周期. Maven的生命周期是抽象的,具体的功能是有具体的插件来完成的,Maven有相当多的功能插件,以至于Mave ...
- MyBatis 源码分析 - 插件机制
1.简介 一般情况下,开源框架都会提供插件或其他形式的拓展点,供开发者自行拓展.这样的好处是显而易见的,一是增加了框架的灵活性.二是开发者可以结合实际需求,对框架进行拓展,使其能够更好的工作.以 My ...
- Java:HashMap原理与设计缘由
前言 Java中使用最多的数据结构基本就是ArrayList和HashMap,HashMap的原理也常常出现在各种面试题中,本文就HashMap的设计与设计缘由作出一一讲解,并解答面试常见的一些问题. ...
随机推荐
- Setup JIRA Service Desk 3.9.2 on Oracle Linux 6.8
OS Oracle Linux 6.8 V138414-01.iso Database mysql5.6.30 MySQL-5.6.30-1.el6.x86_64.rpm-bundle.tar JIR ...
- HTTP 错误 404.0 - Not Found 您要找的资源已被删除、已更名或暂时不可用。
现象:打开一个页面,一直报404异常,但是文件是存在的,打开同一目录下的其它文件都没问题,改文件名也不行,始终找不到原因 解决方案:404异常是一个幌子,实际异常是页面读取了null值,应该报空引用, ...
- iOS:quartz2D绘图(显示绘制在PDF上的图片)
quart2D既可以用来绘制图像到pdf上,也可以从pdf上读取图像并显示出来.在使用这种方式之前,还有一种方式可以用来读取显示pdf上的图像,即使用UIWebView网页视图控件- (void)lo ...
- php+wamp环境部署本地Web应用
1.创建新的项目(project),创建完成之后单击工具栏的应用运行/调试(Select Run/Debug Configuration)的下拉菜单弹出 Edit Cofigurations选项,单击 ...
- URLRewrite地址重定向的实现
URLRewrite就是我们通常说的地址重写,用户得到的全部都是经过处理后的URL地址.其优点有: (1)提高安全性,可以有效的避免一些参数名.ID等完全暴露在用户面前,如果用户随便乱输的话,不符合规 ...
- IT词汇表
本人采集到了数十万篇中文技术类博客,进行分词后根据出现的词频手工整理了一份IT词汇表,共计12000个,基本囊括了常见的中英文IT词汇,欢迎各位提出交流意见. 点此 下载
- subline 配置,本地项目代码下断点来调试远程项目
参考: https://my.oschina.net/ptk/blog/299464 1. 文件 tts.sublime-project 的配置如下: { "folders": [ ...
- (转)nio 连网和异步 I/O
连网和异步 I/O 概述 连网是学习异步 I/O 的很好基础,而异步 I/O 对于在 Java 语言中执行任何输入/输出过程的人来说,无疑都是必须具备的知识.NIO 中的连网与 NIO 中的其他任何操 ...
- Android jni GetFieldID 和 GetMethodID 函数的说明
Android jni GetFieldID 和 GetMethodID 函数的说明 GetFieldID是得到java类中的参数ID,GetMethodID得到java类中方法的ID,它们只能调用类 ...
- Python Hashtable的理解
一个对象当其生命周期内的hash值不发生改变,而且可以跟其他对象进行比较时,这个对象就是Hashtable的.两者Hashtable的对象只有具有相同的hash值时才能判断为相同的对象. ...