spring框架中AOP思想与各种配置详解

Spring中提供两种AOP支持:

  1.基于代理的经典AOP

  2.Aspectj注解配置AOP

  

  首先我们先了解什么是AOP,AOP(Aspect Oriented Programming)面向切面编程!AOP采用了横向抽取机制(可能有人会说啥叫横向抽取机制,在这里先引入一个纵向继承的概念),取代了纵向继承的重复性代码(例如权限控制、性能监视、缓存)

  spring AOP使用纯Java实现,主要通过代理方式向目标类(被代理的类织入增强代码)

  Aspectj 是一个基于Java语言的AOP框架

  纵向继承

                                     在图中,左边的传统的纵向继承方式,因为writelog在具体实现类userdao中无法被复用,所以此方法就被放到了所有的dao的父类BaseDao中

                                     多态的特性,所有子类dao要加强代码时,经过父类的writelog方法,类似一种从上到下的关系;然而右边的是AOP思想下的代码增强,因为不

                                     论是代理类UserDaoProxy,还是被代理类UserDao,都实现了同一个接口或是同一个父类,属于兄弟关系,实现了所谓的“横向”的切入机制!

而对于AOP中的一些术语,我觉得你们需要了解一下,以便于对下面的阅读有帮助!

针对这个图再补充一下,一个切点和一个advice的组合叫advisor!!

 

(1) 基于代理的经典AOP

  通知:advice

  Spring提供了 前置通知、环绕通知、后置通知、异常通知等等。

  这些advice分别对应要实现的接口:MethodBeforeAdvice、MethodInteceptor、AfterReturningAdvice、ThrowsAdvice

  就拿前置通知来举例子:

            

 这是在xml中的各个类的配置

      

   但其实你们会发现,我这里的advice没有指定要对哪个方法执行增强,因为dao可能会有好几种方法,但是有些并不需要增强,所以一,我们就需要一个带有特定切点的advice

基于以上的配置进行修改,带有切点的切面!!

  

  一个切点和一个advice的组合:advisor

  带有切点的切面,只需要在以上配置中再加一个:

      之后在配置代理类时,把interceptorname换位这个带有切点的切面id

   但是有没有发现前面的配置中,每一步生成代理类时,都需要主动去配置proxyFactoryBean来生成代理类,这样做很麻烦,所以这里又要引入自动代理的概念!!

        

         

 

          

      (2) Aspectj配置AOP(推荐使用)

     

    2.1基于Aspectj注解形式

    第一步:引入相应的jar包

      

     第二步:以Aspectj形式编写

     

     第三步:创建xml文档:

     

   2.2基于Aspectj的xml形式配置

     这是以xml形式编写的aspect配置

 

posted @ 2017-11-18 03:09  Booker808  阅读(4682)  评论(1编辑  收藏  举报