zoukankan      html  css  js  c++  java
  • SpringAOP

       武汉最近突然就变冷了,我也坐在冷冷的公司敲着代码,这让我非常怀恋在以前公司开着暖气coding的日子。现在公司为撒不开暖气呢?肯定是电费太贵,这样只能苦了我们。要是能少交电费就好了。想想我们平时是怎么叫电费的:抄表员或者电子记录表通过电表定时的记录我们每个月使用的电量,然后根据每°电的价格得出我们的电费。试想如果没有电表该怎么办呢?或许我们每个家庭可以自己估算自己的用电量,或者凭良心记录,这样交电费多好啊。(不过电力公司可能就破产了)想一想这个例子,家里只要有电器使用,电表就回走表,而且当你使用电器的时候似乎根本不知道电表的存在。此时的电表多么像一个通知(advice),而电器用电就是一个切点(cutpoint),而组合起来就是一个切面(aspect)了。

      其实面向切面就是这么的简单,它可能就在你的身边。那么现在就讲讲面向切面的基本术语:

      横切关注点:分布于应用中多处的功能;

      切面:横切关注点可以被模块化为特殊的类,这些类被称为切面;

      通知(advice):定义切面是什么以及何时使用;(5中类型)

              1.Before---在方法被调用之前调用通知;

              2.After-----在方法完成之后调用通知,无论方法是否执行成功;

              3.After-returning---在方法成功执行之后调用通知;

              4.After-throwing----在方法抛出异常后调用通知;

              5.Around----通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为;

      连接点(Joinpoint):在应用执行过程中能够插入切面的一个点。

      切点(Pointcut):通知起作用的连接点。

      切面(Aspect):切点和通知的结合。(通知定义了何时,做什么;切点定义了何处)

      引入(Introduction):引入允许我们向现有的类添加新方法或属性;

      织入(weaving):织入是将切面应用到目标对象来创建新的代理对象的过程。

              编译期:切面在目标类编译时织入。这种方法需要特殊的编译期。(AspectJ的织入编译期就是以这种方式织入切面的)

              类加载期:切面在目标类加载到JVM时被织入。这种方式需啊哟特殊的类加载器,它可以在目标类被引用之前增强目标类的字节码。

              运行期:切面在应用运行的某个时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态地创建一个代理对象。Spring AOP就是以这种方式织入切面的

    Spring提供了4种各具特色的AOP支持:

    • 基于代理的经典AOP
    • @AspectJ注解驱动的切面
    • 纯POJO切面
    • 注入式AspectJ切面

      前三种都是spring基于代理的AOP变体,Spring对AOP的支持局限于方法拦截。如果AOP需求超过了简单方法拦截的范畴(比如构造器或属性拦截),那么应该考虑在AspectJ里实现切面,里哦用Spring的DI把Spring Bean注入到AspectJ切面中。

    Spring在运行期通知对象,只支持方法连接点。

    下面是一个简单的例子:

      <bean id="advice" class="com.maxvison.springStudy.aspect.MyAdvice" />
        <bean id="perform" class="com.maxvison.springStudy.beans.Performer" />
        
        <aop:config>
            <aop:aspect ref="advice">
                <aop:after-returning method="haveShow" pointcut-ref="myadvice"/>
                <aop:after method="afterShow" pointcut-ref="myadvice"/>
                <aop:before method="beforeShow" pointcut-ref="myadvice"/>
                <aop:pointcut expression="execution(* com.maxvison.springStudy.beans.Performer.show(..))" id="myadvice"/>
            </aop:aspect>     
        </aop:config>

     

      Spring的AOP配置元素:

    <aop:config>          顶层的AOP配置元素,大多数的<aop:*>元素必须包含在<aop:config>元素内
    <aop:aspect>          定义切面
    <aop:before>          定义前置通知
    <aop:after>            定义后置通知
    <aop:after-returning>    定义AOP after-returning通知
    <aop:after-throwing>     定义AOP  after-throwing通知
    <aop:around>             定义AOP around通知
    <aop:pointcut>           定义切点
    <aop:advisor>            定义AOP通知器
    <aop:aspectj-autoproxy>  启用@AspectJ注解驱动的切面
    <aop:declare-parents>    为被通知的对象引入额外的接口,并透明地实现

      在定义切点时,Spring借助AspectJ的切点表达式语言来定义Spring切面。

     详细内容可参考:http://blog.csdn.net/bzhang19841212/article/details/2647582

      

      

  • 相关阅读:
    [C++]Linux之进程间通信小结【待完善】
    [转] thrift的使用介绍
    [转] splice系列系统调用
    [转] gdb中忽略信号处理
    [转] 确定性投资的框架
    [转] 投资策略及投资体系
    [转] 为什么医疗咨询服务公司Evolent Health仅用4年就华丽上市?
    [转] When exactly does the virtual table pointer (in C++) gets set for an object?
    [转] Linux写时拷贝技术(copy-on-write)
    [转] .bss段和.data段的区别
  • 原文地址:https://www.cnblogs.com/gongdi/p/4953829.html
Copyright © 2011-2022 走看看