换个角度理解之AOP与IOC

老生常谈的话题,所以我这里所说的内容当然不能是一些老掉牙,被人咀嚼了无数次的残渣。

我争取从一个特别的角度给你留下别样的印象。现在无法理解没关系,只需要记住这些话,在以后的工作和训练中反复回味即可。等你悟出自己的道,欢迎到时候来一起讨论。

1. IOC

控制反转,一般被和DI混淆。在我们试图明白这些概念前,来思考下这个问题:

”OOP中我们通过构造不同的对象来完成不同的功能,最终在这些实例的共同努力下完成既定的任务。那么我们以主体或者说调度者的视野来看,我真的关心我拿到的这些实例到底是个什么吗?

答案显而易见,我并不关心,我一点都不关心, 我不关心你是个什么,我不关心你里面装了什么,我不关心你是怎么被构建出来的,我仅仅只关心你是否能正确完成我要求你完成的那几个功能(即我只关心你是否能正确完成你所声明的那几个方法(接口定义),更极端点说,就算这几个方法里,你只要把我们关心(即调用)的那个方法实现对,哪怕其他的方法你全给实现错了,我也认为你合格了,我不关心你的'品质','出生','思想觉悟'等等其他一切事情。)。在《七周七语言》这本书里里有这样一个词:“鸭子类型”—— 用蹼走路,会呱呱叫,它就是鸭子。用在这里应该非常合适吧。

这里举一个让我顿悟的例子,这个例子来自于《Mastering Ninject for Dependency Injection》(这书只有英文版, 当初咬牙把英文版的看完了, 紧接着放该电子文件的U盘坏了, 靠!三年了, 至今记得当时那个恨啦!)。文中以木匠和手术的主刀医生为例,木匠在干活时他所使用的工具都需要自己去取;而主刀医生在干活时工具都是由助手递过去的,主刀医生根本不需要关心工具的来源。他只需要关注于自己的本质工作即可,而木匠除了本质工作之外,还得负责找出合适的工具来完成这件事。

那好,既然我这么多不关心,那么对象的构造工作完全没必要放在我这里,我想要的是一个"容器", 在“真正需要”的时候从中取出那个实现了我想要的功能的那个对象,仅此而已。另外《Clean Code》里就专门有一章来讲解我们应该将对象的构建对象的使用区分开。

所以:

  1. 想清楚自己真正需要的到底是什么?
  2. 相比较应该知道什么,知道自己不该知道什么也很重要。

2. AOP

在讨论AOP之前,请先看看下面这句“优秀框架的基本素质之一就是在关键的过程中设置拦截性接口,越通用的框架就越不应该对用户的行为进行任何假设性的约束,包括框架自身的行为都最好是以扩展的方式并入”。

如果你很好奇我为什么突然说这句?那么接下来就是重点:其实这段话里的关键字就是那个“拦截性接口”;现在让我们回想下AOP的使用场景,是否可以概括为这样一句话:我希望在xx方法执行的前后进行某些操作,甚至可以根据操作的结果来决定是否执行这个方法的实际逻辑。联系前后两个,是不是非常非常相似!具体的代码我就不重复,网上一堆。这里我就贴一下Java中的两种实现方式吧:

a. Java实现AOP之动态代理

动态代理有以下特点:

  1. 代理类所在包:java.lang.reflect.Proxy
  2. 代理对象,不需要实现接口。
  3. 代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型)
  4. 动态代理也叫做JDK代理,接口代理。

b. Java实现AOP之Cglib子类代理

Cglib子类代理实现方法:
1.需要引入cglib的jar文件,但是Spring的核心包中已经包括了Cglib功能,所以直接引入spring-core-3.x.x.jar即可。
2.引入功能包后,就可以在内存中动态构建子类。
3.代理的类不能为final,否则报错。
4.目标对象的方法如果为final/static,那么就不会被拦截,即不会执行目标对象额外的业务方法。

关于AOP的好处我就不多说了。下面是开涛大神的链接地址,代码什么都有。

3. 联系

IOC和AOP相辅相成;因为你不关心拿到的是什么,所以我可以在你拿到这个实现所需功能的对象之前,我可以对它进行修改,附加上一些东西,甚至整个将它们替换掉,而这些附加的功能最终会在特定时刻发生效果,而这些特定时刻就是我们在设置AOP时的约束。

具体实例就是Spring容器了,其思想和sql类似——你告诉我对象有些啥,以及它们之间的关系,剩下的工作就交给我了。也是因为实际的构建过程由Spring负责,而你又不关心实际的对象(你关心的是功能是否如期实现),那么AOP就顺理成章了。

再做一点引申阅读吧。这是不是有点像JVM所处理的class文件,JVM只要求你传递的文件符合既定要求,至于这个文件是何处而来,传递给JVM之前是否有过二次转换,JVM其实一点都不关心,这就给了各种编译器以无限大的自由度去进行各种自定制,关于这一点大家可以阅读《深入理解Java虚拟机》,我这里就不越疱代俎了。

4. Links

  1. 《SICP》—— 会当凌绝顶一览众山小,不多解释了!
  2. 《Clean Code》—— 此书之后,再无代码规范。
  3. 《优秀框架的基本素质》—— 这是一篇博客;作者是阿里的梁飞。
  4. 我对AOP的理解 -- 开涛大神的,里面有示例代码等。我就不再自己重复一遍了。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,585评论 4 365
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,923评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,314评论 0 248
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,346评论 0 214
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,718评论 3 291
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,828评论 1 223
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,020评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,758评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,486评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,722评论 2 251
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,196评论 1 262
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,546评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,211评论 3 240
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,132评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,916评论 0 200
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,904评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,758评论 2 274

推荐阅读更多精彩内容