文档章节

AOP初探

laichendong
 laichendong
发布于 2014/06/25 09:27
字数 570
阅读 1075
收藏 39
点赞 1
评论 5
想说写一个系列,又不敢说写一个系列,害怕只有开头,却没有结尾。但不管怎么样,这篇还是要写下来,不然,就连开头都没有了。 这篇打算将两种实现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
粉丝 8
博文 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”的评论

有“深”探吗?

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

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

天蓬小猪 ⋅ 2015/06/19 ⋅ 10

C#进阶系列——DDD领域驱动设计初探(一):聚合

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

杰克.陈 ⋅ 2017/12/19 ⋅ 0

[转] Java Instrument 初探

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

小编辑 ⋅ 2011/01/05 ⋅ 1

AOP那些学术概念—通知、增强处理连接点(JoinPoint)切面(Aspect)

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

iphoenix ⋅ 2016/09/06 ⋅ 0

WinForms UI控件初探:Grid Control 、Data Grid、TreeList

Grid Control 、Data Grid、Spreadsheet、Data Editor、TreeList: 超乎你想象!WinForms Grid Control处理100万行数据到底有多快? WinForms界面控件初探:处理速度飞快的WinForms Data Gri...

百mumu ⋅ 2016/07/13 ⋅ 0

初探设计:Java接口和类

今天犯了个错: “接口变动,伤筋动骨,除非你确定只有你一个人在用”。哪怕只是throw了一个新的Exception。哈哈,这是我犯的错误。 一、接口和抽象类 类,即“物以类聚”中的类,物则为一个...

泥沙砖瓦浆木匠 ⋅ 2015/12/05 ⋅ 20

初探java-agent

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

beibugulf ⋅ 2016/10/21 ⋅ 0

初探spring roo

第一篇技术的博客哦~ 哈哈 鸡蛋各种来吧 公司打算重构,老大看好springroo与maven的配合,所以这几天小小的研究下。跑了一个例子,真的感觉很强大。但是突感维护成本貌似很大很大.... 不说废...

Hero_Q ⋅ 2012/01/14 ⋅ 5

聊聊Dubbo - Dubbo可扩展机制源码解析

摘要: 在Dubbo可扩展机制实战中,我们了解了Dubbo扩展机制的一些概念,初探了Dubbo中LoadBalance的实现,并自己实现了一个LoadBalance。是不是觉得Dubbo的扩展机制很不错呀,接下来,我们就...

阿里云云栖社区 ⋅ 06/05 ⋅ 0

【HTML5初探之本地存储】如果没有数据库。。。

导航 【初探HTML5之使用新标签布局】用html5布局我的博客页! 【HTML5初探之form标签】解放表单验证、增加文件上传、集成拖放 【HTML5初探之绘制图像(上)】看我canvas元素引领下一代web页面...

范大脚脚 ⋅ 2017/12/07 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 38分钟前 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

Linux系统日志

linux 系统日志 /var/log/messages /etc/logrotate.conf 日志切割配置文件 https://my.oschina.net/u/2000675/blog/908189 logrotate 使用详解 dmesg 命令 /var/log/dmesg 日志 last命令,调......

Linux学习笔记 ⋅ 昨天 ⋅ 0

MVC——统一报文格式的异常处理响应

在我们写controller层的时候,常常会有这样的困惑,如果需要返回一个数据是,可能为了统一回去构造一个类似下列的数据格式: { status:true, msg:"保存成功!", data:[]} 而且在写...

alexzhu592 ⋅ 昨天 ⋅ 0

[知乎]SSH框架

网上图书馆管理系统包括管理员管理和图书管理,图书借阅,查询模块等等,网上商城包括前台页面和后台管理页面,两个都是以前别人的实际项目,只是别人用的不是SSH,我把他们改用SSH了,除了S...

颖伙虫 ⋅ 昨天 ⋅ 0

android -------- 打开本地浏览器或指定浏览器加载,打电话,打开第三方app

开发中常常有打开本地浏览器加载url或者指定浏览器加载, 还有打开第三方app, 如 打开高德地图 百度地图等 在Android程序中我们可以通过发送隐式Intent来启动系统默认的浏览器。 如果手机本身...

切切歆语 ⋅ 昨天 ⋅ 0

linux 安装docker

通过以下命令下载安装docker wget -qO- https://get.docker.com | sh 执行以上命令后输出以下内容说明安装成功,注意红框中的内容,docker安装成功后默认只有root能使用,红框中给出的提示是...

haoyuehong ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部