小鸦-spring AOP的小模拟

来源:互联网 发布:淘宝轮番图片尺寸 编辑:程序博客网 时间:2024/04/29 03:11

首先, 为什么要用AOP?

不用AOP的话, 我们需要手动添加大量重复代码不同类的 method

结论, 它作用就是 动态的复制+粘帖

我们需要做的是
1. 不改变原来的class以及其method
2. 让class增加其他功能
3. 动态

这三点结合起来, 在字节码上操作是不可能, 也就只能创造一个class.
1. 原本功能 记做 origin.Method();
2. 额外功能 记做 extra.before(), extra.after();

这种做法, 就已经很自然可以想到 代理模式了

//这种想法实现,首先我们要一个代理类public AOPproxy implement originInterface{Object extra;//以及set功能originInterface origin;//以及set功能    Method(){        extra.before();        origin.Method();        extra.after();    }}//这里的originInterface, 是为了让其他类调用时, 不会感觉到异常, 类似继承的功能

从上面, 我们就可以看到, 剩下要做啥?
1. extra要动态
2. origin要动态

动态, 常规做的两点
1. 配置文件 (e.g. xml文档)
2. 一堆烦人的反射
3. 一个平台(Spring)执行操作

现在, 我们主要要解决的是烦人的反射
1. 动态代理, 帮我们解决origin动态的问题
2. 我们就只需要关注 动态代理extra类 怎么实现就可以了

//改一下接口,就变成动态代理了public AOPproxy implement InvocationHandler {Object extra;//以及set功能@override public Object invoke(Object proxy, Method method, Object[] args){        extra.before();        Object result = method.invoke(target, args);        extra.after();    }}

extra类的操作, 根据配置文档, 获得class, 再找到对应的method, 再调用方法就可以了… (= =)


扩展阅读:
动态代理模式: https://www.ibm.com/developerworks/cn/java/j-lo-proxy1/

吐槽: 本来不想改的..被面试官问到且无法流畅回答, 只能这样写, 以后被免的时候直接拿出来

0 0
原创粉丝点击