Spring的AOP详解



【SSH进阶之路】Spring的AOP逐层深入——AOP的基本原理(六)

        经过我们对Spring的IOC不断的深入学习,Spring的面貌逐渐变得清晰,我们对Spring的了解也更加的深入。从这篇博文开始我们学习Spring的第二大核心内容:AOP。


什么是AOP


        AOP(Aspect Oriented Programming),意思是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP基于IoC基础,是对OOP(Object Oriented Programming,面向对象)的延续。同时,AOP实际是GOF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,提高代码的灵活性和可扩展性,AOP可以说也是这种目标的一种实现。

       AOP将应用系统分为两部分,核心业务逻辑(Core business concerns)及横向的通用逻辑,也就是所谓的方面Crosscutting enterprise concerns,例如,所有大中型应用都要涉及到的持久化管理(Persistent)、事务管理(Transaction Management)、安全管理(Security)、日志管理(Logging)和调试管理(Debugging)等。


                   

AOP与OOP的区别


        AOP、OOP在字面上虽然非常类似,但却是面向不同领域的两种设计思想。OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。

        而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有着本质的差异。

        上面的陈述可能过于理论化,举个简单的例子,对于“雇员”这样一个业务实体进行封装,自然是OOP/OOD的任务,我们可以为其建立一个“Employee”类,并将“雇员”相关的属性和行为封装其中。而用AOP设计思想对“雇员”进行封装将无从谈起。

        同样,对于“权限检查”这一动作片断进行划分,则是AOP的目标领域。而通过OOD/OOP对一个动作进行封装,则有点不伦不类。

       换而言之,OOD/OOP面向名词领域,AOP面向动词领域。


基本概念


           要想真正的了解AOP,首先要了解几个重要的基本概念:

1、切面(Aspect):对横切性关注点的模块化,其实就是共有功能的实现。如日志切面、权限切面等。

2、连接点(JoinPoint):就是程序在运行过程中能够插入切面的地点。例如,方法调用、异常抛出或字段修改等,但Spring只支持

方法级的连接点。

3、通知(Advice):在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型,其中包

括”around”、”before”和”after”等通知。许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截

器链。

4、切入点(Pointcut):用于定义通知(Advice)应该切入到哪些连接点(JoinPoint)上。不同的通知通常需要切入到不同的连接点上,这种精准的匹配是由切入点的正则表达式来定义的。

5、目标对象(Target):就是那些即将切入切面的对象,也就是那些被通知的对象。

6、代理对象(Proxy):将通知应用到目标对象之后被动态创建的对象。可以简单地理解为,代理对象的功能等于目标对象的核心

业务逻辑功能加上共有功能。代理对象对于使用者而言是透明的,是程序运行过程中的产物。

7、织入(Weaving):将切面应用到目标对象从而创建一个新的代理对象的过程。这个过程可以发生在编译期、类装载期及运行

期,当然不同的发生点有着不同的前提条件。譬如发生在编译期的话,就要求有一个支持这种AOP实现的特殊编译器;发生在类装

载期,就要求有一个支持AOP实现的特殊类装载器;只有发生在运行期,则可直接通过Java语言的反射机制与动态代理机制来动态

实现。

      我们用一张图将这些概念串联起来,具体的代码在后面的博文中:



通知(Advice)类型


       为了符合现实的各种需求,通知类型提供了5种,可以对目标方法进行全方位处理;

1、Before advice:在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。

      ApplicationContext中在<aop:aspect>里面使用<aop:before>元素进行声明。

2、After advice:当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。

      ApplicationContext中在<aop:aspect>里面使用<aop:after>元素进行声明。

3、After returnadvice:在某连接点正常完成后执行的通知,不包括抛出异常的情况。

      ApplicationContext中在<aop:aspect>里面使用<aop:after-returning>元素进行声明。

4、Around advice:包围一个连接点的通知,类似Web中Servlet规范中的Filter的doFilter方法。可以在方法的调用前后完成自定义的

行为,也可以选择不执行。

      ApplicationContext中在<aop:aspect>里面使用<aop:around>元素进行声明。

5、Afterthrowing advice:在方法抛出异常退出时执行的通知。

      ApplicationContext中在<aop:aspect>里面使用<aop:after-throwing>元素进行声明。


AOP 2种代理的区别


AOP支持2种代理,Jdk的动态代理和CGLIB实现机制。二者有什么区别呢:

Jdk基于接口实现:JDK动态代理对实现了接口的类进行代理。

CGLIB基于继承:CGLIB代理可以对类代理,主要对指定的类生成一个子类,因为是继承,所以目标类最好不要使用final声明。 

通常情况下,鼓励使用jdk代理,因为业务一般都会抽象出一个接口,而且不用引入新的东西。如果是遗留的系统,以前没有实现接口,那么只能使用CGLIB。


AOP配置


Spring AOP配置有两种风格:

      XML风格 = 采用声明形式实现Spring AOP 

      AspectJ风格 = 采用注解形式实现Spring AOP


     下篇博文,会分别使用两种风格实践一下Spring AOP,敬请关注。



                </div>
</article>
  <div class="readall_box csdn-tracking-statistics readall_box_nobg" data-mod="popu_376" style="display: none;">
      <div class="read_more_mask"></div>
      <a class="btn btn-large btn-gray-fred read_more_btn" target="_self">阅读全文</a>
  </div>
  <div class="article_copyright">
    版权声明:本文为博主原创文章,未经博主允许不得转载。      </div>
  <ul class="article_collect clearfix csdn-tracking-statistics" data-mod="popu_378">
      <li class="tit">本文已收录于以下专栏:</li>


  • ssh进阶之路








  • hy6688_
    hejingyuan6
    u013249019
    • u013249019
      2015-03-30 15:21 6楼
    • aop很好的学习材料 还需要好好研究啊

      <div class="more_comment" style="display: block;">
          <div id="comment_bar" class="trackgin-ad" data-mod="popu_385" style="display: block;"><a id="load_comments" class="btn btn-large more_comment_btn" page="2">查看 <span>8</span> 条热评<i class="icon iconfont icon-xiajiantou"></i></a></div>
      </div>
    
      <h3 class="recommend_tit" id="related">相关文章推荐</h3>
      <div class="recommend_list clearfix" id="rasss">
                                                                                      <dl class="clearfix csdn-tracking-statistics" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
                      <dd>
                          <h2><a href="http://blog.csdn.net/MoreeVan/article/details/11977115" target="_blank" strategy="BlogCommendFromBaidu_0">Spring AOP 实现原理</a></h2>
                          <div class="summary">
                              什么是AOP
    

    AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入…






    SSM框架 之 Spring-AOP(面向切面编程)



    1AOP概述
    AOP(Aspect-Oriented Programming,面向切面编程):是一种新的方法论,是对传统 OOP(Object-Oriented Programming,面向对象编程)…





    (function() {
    var s = "_" + Math.random().toString(36).slice(2);
    document.write('
    ');
    (window.slotbydup=window.slotbydup || []).push({
    id: '4765209',
    container: s,
    size: '808,120',
    display: 'inlay-fix'
    });
    })();





    就刚刚,Python圈发生一件大事!

    都说人生苦短,要学Python!但刚刚Python圈发生的这件事,你们怎么看?真相在这里…







    AOP技术介绍--(.Net中关于AOP的实现)



     一、AOP实现初步       AOP将软件系统分为两个部分:核心关注点和横切关注点。核心关注点更多的是业务逻辑,关注的是系统核心的业务;而横切关注点虽与核心的业务实现无关,但它却是一种更通用的业务…






    Spring实现AOP的4种方式



    Spring实现AOP的4种方式   先了解AOP的相关术语:1.通知(Advice):通知定义了切面是什么以及何时使用。描述了切面要完成的工作和何时需要执行这个工作。2.连接点(Joinpoint)…


    • udbnny
    • udbnny
    • 2010年09月08日 09:54
    • 197547





    Spring3.0 AOP 详解



    一、什么是 AOP。
    AOP(Aspect Orient Programming),也就是面向切面编程。可以这样理解,面向对象编程(OOP)是从静态角度考虑程序结构,面向切面编程(AOP)是从动态角…






    (function() {
    var s = "_" + Math.random().toString(36).slice(2);
    document.write('
    ');
    (window.slotbydup=window.slotbydup || []).push({
    id: '4983339',
    container: s,
    size: '808,120',
    display: 'inlay-fix'
    });
    })();





    程序员跨越式成长指南

    完成第一次跨越,你会成为具有一技之长的开发者,月薪可能翻上几番; 完成第二次跨越,你将成为拥有局部优势或行业优势的专业人士,获得个人内在价值的有效提升和外在收入的大幅跃迁……







    面向切面编程(AOP)的理解



    回家上网不方便,回头补上!祝大家过年好!






    Aop实现原理详解



    一、什么是 AOP

    AOP(Aspect-OrientedProgramming,面向切面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。…






    shiro多系统单点登录



    shiro多系统单点登录最近做项目遇到了多个系统权限用的是shiro框架,需要做成单点登录,虽然shiro为单点登录提供了shiro-cas的方案,但是不太符合我们现有项目的框架,现在和大家分享一下我…






    iOS 下的 AOP 编程



    在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,是函数式编程的一种衍生范型。通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。主要的功…






    深入理解Android之AOP



    深入理解Android之AOP格式更加精美的PDF版请到: http://vdisk.weibo.com/s/z68f8l0xTgCLK&nbsp;下载一、闲谈AOP大家都知道OOP,即ObjectOriente…


    • Innost
    • Innost
    • 2015年10月24日 19:48
    • 45609





    深入理解Aop编程思想



    Aop(Aspect-Oriented Programming,面向切面编程),可以说是oop(面向对象编程)的一个补充和完善,为啥这样说呢?我们都知道oop将我们的程序很好的用继承,封装,多态实现了…






    SSH学习之——Spring面向方面编程AOP



    一:概述
    众所周知,Spring是一个轻量级的、非侵入式的、独立于各种应用服务器的开源框架。它的两大方面被人们所熟知,也应用很广。那就是IOC(控制反转)和AOP(面向方面编程)。
    IOC是开发者…


    • CYXLZZS
    • CYXLZZS
    • 2012年09月13日 10:50
    • 3685





    实现aop思想的多种方法



    含义:

    AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

    AOP是OOP的延续,是…






    Spring AOP 之编译期织入、装载期织入、运行时织入



    一   前言
                   AOP 实现的关键就在于 AOP 框架自动创建的 AOP 代理,AOP 代理则可分为静态代理和动态代理两大类,其中静态代理是指使用
    AOP 框架提供的…






    SSM深入理解



    配置文件spring:

      xmlns:aop=”http://www.springframework.org/schema/aop” 
      xmlns:tx=”http://www.spri…






    深入理解SpringMVC-基础篇



    深入理解SpringMVC-入门篇
    SpringMVC是一个轻量级的MVC框架,SpringMVC由于其轻量级的实现以及与Spring框架的无缝整合等诸多优势,近年来在MVC框架中脱颖而出,受到诸多开…






    【SSH进阶之路】Spring的IOC逐层深入——Spring的IOC原理[通俗解释一下](三)



    1. IoC理论的背景
    我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。
    图1:软件系统中耦合的对象
    如果我们打开机…






    面向切面编程(2):AOP深入探索



    AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面编程。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可…






    SSH中各个框架的作用以及Spring AOP,IOC,DI详解



    在SSH框假中spring充当了管理容器的角色。我们都知道Hibernate用来做持久层,因为它将JDBC做了一个良好的封装,程序员在与数据库进行交互时可以不用书写大量的SQL语句。Struts是用来…








    Delphi7高级应用开发随书源码




    • 2003年04月30日 00:00
    • 676KB
    • 下载






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值