文档章节

AOP初探

laichendong
 laichendong
发布于 2014/06/25 09:27
字数 570
阅读 1076
收藏 39
想说写一个系列,又不敢说写一个系列,害怕只有开头,却没有结尾。但不管怎么样,这篇还是要写下来,不然,就连开头都没有了。 这篇打算将两种实现AOP的技术的hello world写一下。 我们知道,Java实现AOP,一般采用两种技术:
  1. 使用JDK的动态代理,在代理类中拦截方法的调用,然后做些手脚
  2. 使用类似cglib之类的工具,将AOP的代码在编译期“织入”进去,就是修改字节码。(更深的我也不知道了……)
一、先说使用动态代理的。
  1. Java限制被代理的的类必须实现一个接口。(因为代理类也去实现这个接口,而方法的调用是通过实现接口来实现多态的。)
    public interface TagetService {
        void doSomething();
    }
  2. 再是我们要代理的目标类,即要用aop拦截的方法。
    public class TagetServiceImpl implements TagetService {
    
        /**
         * 需要被拦截的方法
         */
        @Override
        public void doSomething() {
            System.out.println("doing something.");
        }
    }
  3. 然后我们就要编写我们自己的aop逻辑了。实现InvocationHandler接口,在invoke方法中写自己的逻辑代码。
    public class TargetServiceInvocationHandler implements InvocationHandler {
        /**
         * 代理的目标对象
         */
        private Object target;
    
        public TargetServiceInvocationHandler(Object target) {
            this.target = target;
        }
    
        /**
         * 拦截方法调用
         *
         * @param proxy  代理
         * @param method 方法
         * @param args   参数
         * @return
         * @throws Throwable
         */
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("before do something.");
            Object result = method.invoke(target, args);
            System.out.println("after do something.");
            return result;
        }
    }
  4. 万事具备,组装起来,测试一下,(Spring AOP是不是帮我们优雅的组装了一下下?下一篇就研究一下他)
    public class Test {
    
        public static void main(String[] args) throws IllegalAccessException, InstantiationException {
            // service 实例
            TagetService instance = TagetServiceImpl.class.newInstance();
            // service 代理的实例
            TagetService tagetServiceProxy = (TagetService) Proxy.newProxyInstance(instance.getClass().getClassLoader(),
                    instance.getClass().getInterfaces(),
                    new TargetServiceInvocationHandler(instance));
            // 用代理的实例调用方法, 即会被handler拦截
            tagetServiceProxy.doSomething();
        }
    }
二、再来cglib的
  1. 这回被拦截的类不需要实现接口了
    public class TargetService {
        public void doSomething() {
            System.out.println("do something.");
        }
    }
  2. 通过实现cglig的MethodInterceptor接口,在intercept方法中实现我们的aop的逻辑
    public class TargetServiceInterceptor implements MethodInterceptor {
        @Override
        public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
            System.out.println("before do something.");
            Object result = proxy.invokeSuper(obj, args);
            System.out.println("after do something.");
            return result;
        }
    }
  3. 组装起来测试一下下
    public class Test {
        public static void main(String[] args) {
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(TargetService.class);
            enhancer.setCallback(new TargetServiceInterceptor());
            TargetService targetService = (TargetService) enhancer.create();
            targetService.doSomething();
        }
    }
     

© 著作权归作者所有

共有 人打赏支持
laichendong
粉丝 10
博文 85
码字总数 71483
作品 0
朝阳
程序员
加载中

评论(5)

黄勇
黄勇

引用来自“hww”的评论

引用来自“黄勇”的评论

引用来自“laichendong”的评论

引用来自“never_say”的评论

有“深”探吗?

酝酿中。。。
怎么才叫“深”探?我的结论是:工具一定要够长才行! http://my.oschina.net/huangyong/blog/161338

勇哥写的Java那点事系列博客不错
多谢!博主这篇言简意赅,抓住了 AOP 精髓,期待后续更优秀的博文!
已销号
已销号

引用来自“黄勇”的评论

引用来自“laichendong”的评论

引用来自“never_say”的评论

有“深”探吗?

酝酿中。。。
怎么才叫“深”探?我的结论是:工具一定要够长才行! http://my.oschina.net/huangyong/blog/161338

勇哥写的Java那点事系列博客不错
黄勇
黄勇

引用来自“laichendong”的评论

引用来自“never_say”的评论

有“深”探吗?

酝酿中。。。
怎么才叫“深”探?我的结论是:工具一定要够长才行! http://my.oschina.net/huangyong/blog/161338
laichendong
laichendong

引用来自“never_say”的评论

有“深”探吗?

酝酿中。。。
double9
double9
有“深”探吗?
极速开发,快就是这么任性,你不知道的Jfinal2.0新特性

Jfinal2.0新特性初探 Jfinal2.0发布了,我认为这个是里程碑式的发布,新加了不少好功能,这个博文主要是写个那些不想看文档,又想知道Jfinal2.0到底有什么新变动的同学们的,希望你们看完以后...

天蓬小猪
2015/06/19
0
10
C#进阶系列——DDD领域驱动设计初探(一):聚合

原文:C#进阶系列——DDD领域驱动设计初探(一):聚合 前言:又有差不多半个月没写点什么了,感觉这样很对不起自己似的。今天看到一篇博文里面写道:越是忙人越有时间写博客。呵呵,似乎有点...

杰克.陈
2017/12/19
0
0
[转] Java Instrument 初探

java在1.5引入java.lang.instrument,你可以由此实现一个java agent,通过此agent来修改类的字节码即改变一个类。本文中,会通过java instrument 实现一个简单的profiler。当然instrument并不...

小编辑
2011/01/05
2.6K
1
AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)

1、我所知道的AOP 初看起来,上来就是一大堆的术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等。一下让你不知所措,心想着:管不得很多人都和我说AOP多难多难。当我...

iphoenix
2016/09/06
48
0
初探java-agent

用了一下午总算把java agent给跑通了,本篇文章记录一下具体的操作步骤,以免遗忘。。。 通过java agent可以动态修改代码(替换、修改类的定义),进行AOP。 目标: ? 1 需要两个程序,一个是...

beibugulf
2016/10/21
89
0

没有更多内容

加载失败,请刷新页面

加载更多

Shiro | 实现权限验证完整版

写在前面的话 提及权限,就会想到安全,是一个十分棘手的话题。这里只是作为学校Shiro的一个记录,而不是,权限就应该这样设计之类的。 Shiro框架 1、Shiro是基于Apache开源的强大灵活的开源...

冯文议
今天
1
0
linux 系统的运行级别

运行级别 运行级别 | 含义 0 关机 1 单用户模式,可以想象为windows 的安全模式,主要用于修复系统 2 不完全的命令模式,不含NFS服务 3 完全的命令行模式,就是标准的字符界面 4 系统保留 5 ...

Linux学习笔记
今天
2
0
学习设计模式——命令模式

任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果。命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系。 解决了这...

江左煤郎
今天
3
0
字典树收集(非线程安全,后续做线程安全改进)

将500W个单词放进一个数据结构进行存储,然后进行快速比对,判断一个单词是不是这个500W单词之中的;来了一个单词前缀,给出500w个单词中有多少个单词是该前缀. 1、这个需求首先需要设计好数据结...

算法之名
昨天
15
0
GRASP设计模式

此文参考了这篇博客,建议读者阅读原文。 面向对象(Object-Oriented,OO)是当下软件开发的主流方法。在OO分析与设计中,我们首先从问题领域中抽象出领域模型,在领域模型中以适当的粒度归纳...

克虏伯
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部