您的位置:首页 > 编程语言 > Java开发

小鸦-spring AOP的小模拟

2016-03-23 21:25 405 查看
首先, 为什么要用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/

吐槽: 本来不想改的..被面试官问到且无法流畅回答, 只能这样写, 以后被免的时候直接拿出来
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring