`

对aop术语和原理上的一些总结

阅读更多
本文转载自http://cnduyi.cn/2009/02/chuxueaopduiaopshuyuheyuanlishangdeyixiezongjie.html

PS:本文通俗易懂,语言幽默,举例形象有趣!


作者blog地址: http://doubleeo.iteye.com/


对aop术语和原理上的一些总结
2009.02.01 21:50 by 北狼  
1.我所知道的aop
    初看aop,上来就是一大堆术语,而且还有个拉风的名字,面向切面编程,都说是OOP的一种有益补充等等。一下子让你不知所措,心想着:怪不得很多人都和我说aop多难多难。当我看进去以后,我才发现:它就是一些java基础上的朴实无华的应用,包括ioc,包括许许多多这样的名词,都是万变不离其宗而已。
2.为什么用aop
    1就是为了方便,看一个国外很有名的大师说,编程的人都是“懒人”,因为他把自己做的事情都让程序做了。用了aop能让你少写很多代码,这点就够充分了吧
    2就是为了更清晰的逻辑,可以让你的业务逻辑去关注自己本身的业务,而不去想一些其他的事情,这些其他的事情包括:安全,事物,日志等。
    3.那些aop的术语
    初看这么多术语,一下子都不好接受,慢慢来,很快就会搞懂。
    1.通知(Advice)
    就是你想要的功能,也就是上面说的 安全,事物,日志等。你给先定义好把,然后在想用的地方用一下。
    2.连接点(JoinPoint)
    这个更好解释了,就是spring允许你使用通知的地方,那可真就多了,基本每个方法的前,后(两者都有也行),或抛出异常时都可以是连接点,spring只支持方法连接点 .其他如aspectJ还可以让你在构造器或属性注入时都行,不过那不是咱关注的,只要记住,和方法有关的前前后后(抛出异常),都是连接点。
    3.切入点(Pointcut)
    上面说的连接点的基础上,来定义切入点,你的一个类里,有15个方法,那就有几十个连接点了对把,但是你并不想在所有方法附近都使用通知(使用叫织入,以后再说),你只想让其中的几个,在调用这几个方法之前,之后或者抛出异常时干点什么,那么就用切点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。
    4.切面(Aspect)
    切面是通知和切入点的结合。现在发现了吧,没连接点什么事情,连接点就是为了让你好理解切点,搞出来的,明白这个概念就行了。通知说明了干什么和什么时候干(什么时候通过方法名中的before,after,around等就能知道),而切入点说明了在哪干(指定到底是哪个方法),这就是一个完整的切面定义。
    5.引入(introduction)
    允许我们向现有的类添加新方法属性。这不就是把切面(也就是新方法属性:通知定义的)用到目标类中吗
    6.目标(target)
    引入中所提到的目标类,也就是要被通知的对象,也就是真正的业务逻辑,他可以在毫不知情的情况下,被咱们织入切面。而自己专注于业务本身的逻辑。
    7.代理(proxy)
    怎么实现整套aop机制的,都是通过代理,这个一会给细说。
    8.织入(weaving)
    把切面应用到目标对象来创建新的代理对象的过程。有3种方式,spring采用的是运行时,为什么是运行时,后面解释。
关键就是:切点定义了哪些连接点会得到通知

   4.我所理解的aop原理
    spring用代理类包裹切面,把他们织入到Spring管理的bean中。也就是说代理类伪装成目标类,它会截取对目标类中方法的调用,让调用者对目标类的调用都先变成调用伪装类,伪装类中就先执行了切面,再把调用转发给真正的目标bean。
    现在可以自己想一想,怎么搞出来这个伪装类,才不会被调用者发现(过JVM的检查,JAVA是强类型检查,哪里都要检查类型)。
    1.实现和目标类相同的接口,我也实现和你一样的接口,反正上层都是接口级别的调用,这样我就伪装成了和目标类一样的类(实现了同一接口,咱是兄弟了),也就逃过了类型检查,到java运行期的时候,利用多态的后期绑定(所以spring采用运行时),伪装类(代理类)就变成了接口的真正实现,而他里面包裹了真实的那个目标类,最后实现具体功能的还是目标类,只不过伪装类在之前干了点事情(写日志,安全检查,事物等)。
    这就好比,一个人让你办件事,每次这个时候,你弟弟就会先出来,当然他分不出来了,以为是你,你这个弟弟虽然办不了这事,但是他知道你能办,所以就答应下来了,并且收了点礼物(写日志),收完礼物了,给把事给人家办了啊,所以你弟弟又找你这个哥哥来了,最后把这是办了的还是你自己。但是你自己并不知道你弟弟已经收礼物了,你只是专心把这件事情做好。
  
    顺着这个思路想,要是本身这个类就没实现一个接口呢,你怎么伪装我,我就压根没有机会让你搞出这个双胞胎的弟弟,那么就用第2种代理方式,创建一个目标类的子类,生个儿子,让儿子伪装我

    2.生成子类调用,这次用子类来做为伪装类,当然这样也能逃过JVM的强类型检查,我继承的吗,当然查不出来了,子类重写了目标类的所有方法,当然在这些重写的方法中,不仅实现了目标类的功能,还在这些功能之前,实现了一些其他的(写日志,安全检查,事物等)。
   这次的对比就是,儿子先从爸爸那把本事都学会了,所有人都找儿子办事情,但是儿子每次办和爸爸同样的事之前,都要收点小礼物(写日志),然后才去办真正的事。当然爸爸是不知道儿子这么干的了。这里就有件事情要说,某些本事是爸爸独有的(final的),儿子学不了,学不了就办不了这件事,办不了这个事情,自然就不能收人家礼了。

   前一种兄弟模式,spring会使用JDK的java.lang.reflect.Proxy类,它允许Spring动态生成一个新类来实现必要的接口,织入通知,并且把对这些接口的任何调用都转发到目标类。

    后一种父子模式,spring使用CGLIB库生成目标类的一个子类,在创建这个子类的时候,spring织入通知,并且把对这个子类的调用委托到目标类。
    相比之下,还是兄弟模式好些,他能更好的实现松耦合,尤其在今天都高喊着面向接口编程的情况下,父子模式只是在没有实现接口的时候,也能织入通知,应当做一种例外。

分享到:
评论

相关推荐

    spring aop

    二、AOP术语解析 1. 切面(Aspect):切面是关注点的模块化,它可以包含多个通知(advice)。 2. 通知(Advice):通知定义了切面的具体行为,即在特定连接点(join point)上执行的代码。 3. 连接点(Join Point)...

    Spring AOP 工程样例

    **AOP术语** 1. **切面(Aspect)**:切面是关注点的模块化,包含了通知和切入点定义。 2. **通知(Advice)**:通知是在特定连接点上执行的动作,如方法调用前、后或异常发生时。 3. **连接点(Join Point)**:...

    spring2-aop入门实例教程

    ### Spring2-AOP入门实例教程知识点详解 #### 一、Spring框架...以上是基于《深入Spring2:轻量级J2EE开发框架原理与实践》一书中的知识点总结,希望能帮助初学者更好地理解和掌握Spring AOP的相关概念和使用方法。

    SpringP原理及拦截器.pdf

    5. 切点与切面:在AOP术语中,切点(Pointcut)定义了哪些连接点(joinpoint)会被拦截。而切面(Aspect)则是包含了切点定义以及在这些连接点上要执行的动作(advice)的模块。 6. 织入(Weaving):织入是AOP实现...

    阿里面试题总结

    - **案例分析**:通过实际面试经历,可以发现面试官往往会根据面试者的简历项目进行深入提问,考察其对项目的理解和对技术的掌握程度。 - **准备建议**:深入研究自己的项目经历,准备好针对项目中使用的技术和框架...

    spring03.pdf

    标题“spring03.pdf”和描述“spring03.pdf...总结而言,Spring框架中的AOP是一种强大的编程范式,它通过将横切关注点模块化,让开发者能够定义切面,并在适当的位置插入通知,以实现代码的简化和业务逻辑的清晰分离。

    spring 要点总结

    2. **AOP 主要原理** - **动态代理**:Spring 的 AOP 实现主要基于代理模式和修饰模式,使得可以在不修改原有代码的情况下,向业务逻辑中插入额外的处理行为。 3. **AOP 术语** - **Aspect(方面)**:一个关注点...

    Java语言基础下载

    目录 第一章:Java开始 1 学习目标 1 Java历史 2 Java技术概述 3 Java技术的优点 3 Java虚拟机 4 ...AOP的专业术语 715 Spring事务管理 718 Spring与Struts整合 719 Spring与Hibernate整合 721 独立实践 724

    JAVA面试题2019

    5. **AOP实现**:面向切面编程的实现原理,如织入机制和通知类型等。 6. **Spring事务管理**:Spring如何实现事务管理,如平台事务管理和编程式事务管理。 7. **设计模式**:Spring框架中使用的设计模式,如工厂模式...

    Java框架面试题总结

    AOP的概念和术语** - **切面**:代表一个关注点,例如日志记录。 - **连接点**:程序执行的某个位置,例如方法调用。 - **通知**:在连接点执行的动作。 - **引入**:添加新的方法或属性到已有类的过程。 - **织入...

    javaee框架SSM课堂笔记.docx

    - **AOP术语**:AOP涉及的主要术语包括切面(Aspect)、连接点(Joinpoint)、通知(Advice)、切点(Pointcut)等。 - **Spring支持AOP实现方式**:Spring支持基于XML的配置方式和基于注解的方式。 - **基于XML的...

    Java面试及简历相关,整理最全的

    总结,Java面试和简历准备不仅涉及技术知识的掌握,还包括对问题解决能力、团队合作精神和个人学习习惯的体现。只有全面而深入地理解和应用这些知识点,才能在竞争激烈的Java开发市场中脱颖而出。

    1.0-SNAPSHOT.zip

    标题 "1.0-SNAPSHOT.zip" 暗示这是一个软件开发相关的压缩包,其中包含了某个项目的特定版本(1.0-SNAPSHOT)的源码和构建...通过研究这个项目,不仅可以了解代码生成的实践,还可以加深对MyBatis和Spring框架的理解。

    mm440使用大全

    - **附录内容**:包含了额外的技术信息和参考资料,如术语解释、常见问题解答等。 #### 结论 MM440是一款功能强大的变频器,适用于各种工业应用场合。通过详细的文档资料,用户可以全面了解MM440的各项特性和使用...

    java程序员面试大纲错过了金三银四你还要错过2018吗.docx

    13. **Spring AOP术语**:包括切面、连接点、通知、切入点等,这些术语共同构成了Spring AOP的核心概念。 14. **Spring Controller并发安全**:通过线程安全的设计原则,如避免在控制器中使用实例变量,使用`...

    Spring.3.x企业应用开发实战(完整版).part2

    6.1.2 AOP术语 6.1.3 AOP的实现者 6.2 基础知识 6.2.1 带有横切逻辑的实例 6.2.2 JDK动态代理 6.2.3 CGLib动态代理 6.2.4 AOP联盟 6.2.5 代理知识小结 6.3 创建增强类 6.3.1 增强类型 6.3.2 前置增强 6.3.3 后置增强...

    Spring3.x企业应用开发实战(完整版) part1

    6.1.2 AOP术语 6.1.3 AOP的实现者 6.2 基础知识 6.2.1 带有横切逻辑的实例 6.2.2 JDK动态代理 6.2.3 CGLib动态代理 6.2.4 AOP联盟 6.2.5 代理知识小结 6.3 创建增强类 6.3.1 增强类型 6.3.2 前置增强 6.3.3 后置增强...

    javasprice一下案例

    5. **Spring框架**:Spring是目前最流行的Java企业级应用框架,提供了依赖注入、AOP(面向切面编程)、事务管理等功能,同时Spring Boot和Spring MVC简化了Web应用的开发。 【JavaSprice假设应用场景】 在我们的...

    西门子变频器MM420说明书.pdf

    - 提供了各种功能的图形表示,帮助用户理解系统的整体架构和工作原理。 #### 11. 二进制互联连接(BiCo) - BiCo功能允许用户通过配置参数来创建自定义信号路径,增强变频器的灵活性。 #### 12. 通讯 - 支持多种通讯...

Global site tag (gtag.js) - Google Analytics