1、AOP,面向切面编程(aspect Oriental programing),使用aop,可以将处理切面aspect的代码注入到主程序,通常主程序的主要目的不是处理这些切面aspect,可以防止代码混乱。拦截机 interceptor是AOP的另一中叫法。(其中使用的模式为代理模式,动态代理模式)。

2、通知advise:在aspect的某个连接点(在Spring的aop中,一个连接点就是一个方法的执行)上执行的动作。

切入点pointcut:匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行。

目标对象:target object,被一个活多个切面所通知的对象。也称被通知对象。

3、spring中的aop

加入支持aop的jar包:

aopalliance.jar

aspectjrt.jar

aspectjweaver.jar

spring-aop.jar

spring-aspect.jar

(1)在xml中加入aop的命名空间:

<?xml version="1.0" encoding="UTF-8"?>
<beans
     xmlns="http://www.springframework.org/schema/beans"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     
     xmlns:aop="http://www.springframework.org/schema/aop"
     
     xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans.xsd
     
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    
</beans>

(2)写aspect类和切面的通知

<bean id="myAspect" class="com.spring1.util.Aspect"/>
    <aop:config>
        <!--切面 -->
        <aop:aspect ref="myAspect">
            <!-- 切入点 执行(方法访问修饰符? 方法返回类型   声明类? 方法名(方法参数类型) 抛出异常?) -->
            <aop:pointcut expression="execution(* com.spring1.dao..*.*(..))" id="point1"/>
            <aop:before method="beforeAdvise" pointcut-ref="point1"/>
            <aop:after method="afterAdvise" pointcut-ref="point1"/>
            <!-- 返回通知,最后的参数是通知参数的名 -->
            <aop:after-returning method="afterReturning" pointcut-ref="point1" returning="ret"/>
            <!-- 异常通知,最后参数是异常的参数的名 -->
            <aop:after-throwing method="afterThrowing" pointcut-ref="point1" throwing="e"/>
        </aop:aspect>
    </aop:config>

(3)将aspect类交给Spring管理,配置aspect类的bean

上边已配置过

(4)根据aop中的通知写通知函数:

//切面类
public class Aspect {
    //通知...
    void beforeAdvise(){
        System.out.println("before");
    }
    
    void afterAdvise(){
        System.out.println("after");
    }
    
    void afterReturning(Object ret){
        System.out.println("afterReturning " +ret.toString());
    }
    
    void afterThrowing(Exception e){
        System.out.println("afterThrowing " + e.getMessage());
    }
}

(5)当上边的都需要些的时候可以直接用 环绕通知代替:

<bean id="myAspect" class="com.spring1.util.Aspect"/>
    <aop:config>
        <!--切面 -->
        <aop:aspect ref="myAspect">
            <!-- 切入点 执行(方法访问修饰符? 方法返回类型   声明类? 方法名(方法参数类型) 抛出异常?) -->
            <aop:pointcut expression="execution(* com.spring1.dao..*.*(..))" id="point1"/>
            <aop:around pointcut-ref="point1" method="aroundAdvise"/>
        </aop:aspect>
    </aop:config>
    void aroundAdvise(ProceedingJoinPoint pjp){
        try {
            System.out.println("前置");
            Object object = pjp.proceed(); 
            System.out.println(object.toString());
        } catch (Throwable e) {
            e.printStackTrace();
            System.out.println("异常");
        }finally{
            System.out.println("最终");
        }
    }

后置通知就是返回后的通知

最终通知又叫finally通知。

posted on 2015-03-05 01:17  猿类的进化史  阅读(225)  评论(0编辑  收藏  举报