Spring-day08-AOP

#Spring AOP

##AOP概念
AOP全称:Aspect Oriented Programming,面向方面编程/面向切面编程  
OOP:Object Oriented Programming,面向对象编程  

概念层次:以对象为基础编程、将需求抽象成对象  
对象是怎么来的?类是怎么抽象来的?

OOP编程重点在于对象;AOP编程重点是方面为中心。  
AOP编程特点:在一堆组件中寻找共通处理,然后将共通处理独立封装成一个组件,之后通过配置方式将组件动态作用到传统业务组件方法中。

    //原有编程,是将共通处理逻辑和传统业务逻辑混编在一起
    public void f1()
     try{
      //将A账户前减去
      //将B账户钱加上
       //提交事务
      }catch(){
       //回滚事务
     }
    }

    //AOP编程,将共通处理逻辑和传统业务逻辑隔离开,然后通过配置关联上

    //利用XML或注解配置将XXX事务控制组件作用到f1方法上
    public void f1(){
      //将A账户前减去
      //将B账户钱加上
    }

    public class xxx{
        //峰装事务控制逻辑
    }

1. 方面 Aspect


      在系统组件中,共通时机执行的共通的处理逻辑。例如事务控制、异常日志、权限控制、操作日志等。
  共通逻辑组件被称为方面组件,在AOP配置中可以作用到其他普通的Bean组件对象方法上。

2. 切入点 Pointcut

      切入点是用于指定哪些Bean组件成为目标,将来追加共通的方面组件处理。Spring中切入点采用一个表达式指定。

      - 方法限定表达式

        **execution(修饰符? 返回类型 方法名(方法参数)throws 异常?)**

            //匹配方法名以load开始的组件方法
            execution(* load*(..))
            //匹配DeptController组件中以load开始的方法
            execution(* com.xdl.controller.DeptController.load*(..))
            //匹配com.xdl.controller包下所有类所有方法
            execution(* com.xdl.controller.*.*(..))
            //匹配com.xdl.controller包及子包下所有类所有方法
            execution(* com.xdl.controller..*.*(..))

    - 类型限定表达式
        
        **within(包名.类名)**

            //匹配DeptController所有方法
            within(com.xdl.controller.DeptController)
            //匹配com.xdl.controller包所有类所有方法
            within(com.xdl.controller.*)
            //匹配com.xdl.controller包及子包中所有类所有方法
            within(com.xdl.controller..*)

    - bean名称限定

        **bean(bean的id名)**
        
            //匹配id=deptController的组件对象所有方法
            bean(deptController)
            //匹配所有id以Controller结尾的组件对象所有方法
            bean(*Controller)

3. 通知 Advice

    用于指定方面组件切入的时机,例如目标方法前、目标方法后、目标方法前后等。Spring有以下类型通知,不同类型对应不同的切入时机。

        try{
            切入方面处理----前置通知<aop:before>
            //执行目标方法
            切入方面处理----后置通知<aop:after-returning>
        }catch(){
            切入方面----异常通知<aop:after-throwing>
        }finally{
            切入方面处理----最终通知<aop:after>
        }

        环绕通知:环绕前置部分--执行目标方法--环绕后置部分 <aop:around>

4. 目标 Target

      要使用方面组件共通处理的Bean对象。

5. 动态代理 AutoProxy

    SpringAOP是采用动态代理技术实现的。

    房子--》中介   代理:中介
    组件--》代理组件   
    动态代理技术:可以根据现有组件动态生成一个代理组件。  


   当使用Spring AOP之后,从容器中获取目标组件时,容器给我们返回的是一个代理组件对象。
该代理组件对象是原有组件的子类,重写了父类的所有方法,在重写方法中调用父类原有功能并追加方面组件功能。
![](http://i.imgur.com/Ujs7F0F.png)

   Spirng生成代理类技术有两种:JDK Proxy API技术和CGLIB技术。
   默认情况下目标组件有接口就会采用JDK Proxy技术;如果没有接口采用CGLIB技术。
   如果想强制性使用CGLIB技术,可以做配置修改,(推荐采用CGLIB技术)

    <aop:aspectj-autoproxy proxy-target-class="true"/>
  
    


    

























##AOP使用方法

1. 分析设计,寻找方面、切入点、通知

    - 方面组件:要追加什么功能?
    - 切入点:给哪些组件追加?
    - 通知:追加的时机?

2. 案例:进入所有Controller方法前打印一个信息

    - 方面组件:打印"进入Controller处理"信息

    - 切入点:所有Controller方法

    - 通知:选择前置通知<aop:before>

    
    - 编写方面组件

            package com.xdl.aspect;
            
            //给组件打桩
            public class LoggerBean {
            
                public void logController(){
                    System.out.println("请求进入Controller处理");
                }
                
            }


    - AOP配置

            <!-- AOP配置 -->
            <bean id="logbean" class="com.xdl.aspect.LoggerBean">
            </bean>
        
            <aop:config>
                <aop:aspect ref="logbean">
                    <!-- <aop:before method="logController" pointcut="within(com.xdl.web.controller..*)"/> -->
                    <aop:before method="logController" pointcut="execution(* deleteDept(..))"/>
                </aop:aspect>
            </aop:config>


3. AOP注解配置

    - 开启组件扫描,替代原有<bean>定义

            <context:component-scan base-package="com.xdl.aspect"/>
            //在方面组件中追加@Component标记

    - 开启AOP注解配置

            <aop:aspectj-autoproxy />
            //在方面组件中使用@Aspect、@Before、@After等标记

##AOP案例1

1. 异常日志

    需求:在程序发生异常后,将异常信息记录到日志文件中。

2. 分析

    - 切面:将异常信息写入文件,每天一个文件。
    - 切入点:所有Controller方法
    - 通知:选择异常通知

    
##AOP案例2

1. 记录用户操作

    需求:用户执行的各种操作进行记录。

2. 分析

    - 切面:根据用户执行的Controller方法,将所做的操作信息写入数据库表
    - 切入点:所有Controller
    - 通知:环绕通知

欢迎转载:海阔天空 » Spring-day08-AOP

评论 沙了个发

换个身份

取消评论