Coup de Grace

框架系列 他们怎么写开发框架

最近买了几本国产原创书,具体可以看我的书单.

框架基础实现,大概每章我都会描述一下实现思路.

其实甭说基础不基础,我觉得写书来讲不犯错就挺好了.

新手教程->高手进阶,挺好的一本书,只是作者语言魅力几乎为零.

快跑!这是本垃圾.具体可以翻看京东上的评论.

相比起来这本就用心的很.内容详实,值得一看.

正巧最近整理了2000多条微博跟Readling List,归档了一下,分门别类的总结一下各方面的东西.

今儿说说他们怎么实现框架.想到哪儿写到哪儿吧,老规矩,上面的书可取的地方我用描述一下,再发散的写一点自己的想法.

容易实现的部分我会给出两种实现方式,分别是糙一点与细一点两个版本.

内容会涉及到以下:


web框架基础

bean容器

思路都是拿到当前线程的classloader去Class.forName()去获取Class对象.

细致一点糙一点的区别是扫描类文件的过程.

依赖注入

之前有句话说的挺好的,IOC与DI是视角的区别,外部来看是控制反转,自身来看是依赖注入.

甭管是不是有人搞些邪道说IOC包含着依赖扫描与注入两部分内容,就这么点东西就别总定概念了..

实现部分分为配置文件和注解两部分

请求分发

依然是老套路,其实我觉得怎么实现都行

那么Controller返回Response的Content-Type就有很多可能了,做一个适配器来适配所有返回值.

后续接入模板引擎实现时候我们可以把这部分替换成其他形式.

系统初始化

把上述部分都启动起来,通过Servlet 3的注解或者web.xml配置WebServlet接管RootUrlPattern.

我大概几个月前才知道还有个Ordered接口可以拿来实现的,居然在项目中用到了.

面向切面

动态代理:

Spring里面的话,配置一个ProxyFactoryBean的实例指定好interface,target跟interceptors即可.

将interceptorNames替换成切面id就可以附加条件.

类似这种实例配置就不太适合用注解来实现.一如一些委托场景

Advice:

说起来Spring的代理方式开关是proxyTargetClass来着.默认false只代理接口

实现:

定义代理或者说AOP类,把逻辑跟请求路由绑在一起,分发请求时候塞进去wrap一下.做到了一定部位的AOP.

代理父类基本的doProxy之外还要在基础实现里含着口子留给前置/后置/抛出/final等增强位置.还要实现Ordered来确定权重.通过Aspect的ProxyChain来维系代理与目标调用之间的关系.

先扫描代理与目标类之前的Map,再双重遍历生成目标类与代理类的Map,统一代理掉在容器中替换目标类的实例(这一切要在DI之前完成).

上一步的代理掉实现是

public static <T> T createProxy(final Class<?> targetClass, final List<Proxy> proxyList) {
    return (T) Enhancer.create(targetClass, new MethodInterceptor() {
        @Override
        public Object intercept(Object targetObject, Method targetMethod, Object[] methodParams, MethodProxy methodProxy) throws Throwable {
            return new ProxyChain(targetClass, targetObject, targetMethod, methodProxy, methodParams, proxyList).doProxyChain();
        }
    });
}

这一步要我白板写估计下次就写得出来了.

之前写一个项目的实现蠢了,isAnnotationPresentisAssignableFrom这两个方法我不知道..

事务

实现:


MVVM框架基础


多级缓存

分层的原则一定是上层是下层的子集,有着一定的更新策略,当上层击穿去寻找下层等等就不赘述了.

实现来讲这几个级别都有相应的api,为了实现无侵入要跟AOP绑在一起.缓存处理接口留下钩子方法来前置/后置/结束.

面对动态的cache kv采用模板引擎进行语句生成.

xstream看起来居然挺好用的..


模板引擎

我们曾经在这一篇文章了一起学习了一下antlr基础与模板引擎的关系.

那么我们把之前太监的部分补再另一篇文章里,免得这篇篇幅过于膨胀.


db水平扩展

水平扩展实现:

写到这儿的时候我决定最近读一下sharding-jdbc的源码.这里.


实际到这里还剩下日常开发中经常遇到的服务/调用/Flow的部分,我认为作者的实现过于主观,也就不写出来了,对大家开发没有什么好处.

所以本篇结束,未涉及部分拆开在三篇博文里了.

done.