首页 > 代码库 > spring AOP

spring AOP

AOP面向切面编程

切面(Aspect ):一个关注点的模块化 ,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子

通知(Advice ):在切面的某个特定的连接点上执行的动作。

连接点(Joinpoint ):在程序执行过程中某个特定的点 ,比如某方法调用的时候或者处理异常的时候。在SpringAOP中 ,一个连接点总是表示一个方法的执行。

切入点(Pointcut ):匹配连接点的断言。通知和一个切入点表达式关联 ,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。切入点表达式如何和连接点匹配是AOP的核心 :Spring缺省使用AspectJ切入点语法。

引入(Introduction ):用来给一个类型声明额外的方法或属性(也被称为连接类型声明(inter-type declaration ))。Spring允许引入新的接口(以及一个对应的实现 )到任何被代理的对象。

<bean id="myAspect" class="test.Aspect"></bean>    <aop:config>        <aop:aspect ref="myAspect">            <aop:pointcut expression="execution(* dao..*.*(..))" id="mypointcut"/>            <!-- 前置通知  这里 mypointcut 是一个顶级切入点(<aop:config>)的id。 要定义内置切入点,可将 pointcut-ref 属性替换为 pointcut 属性-->            <aop:before method="before" pointcut-ref="mypointcut"/>            <!-- 后置通知,  return为返回值的参数名  afterreturn方法必须声明一个名字叫 val 的参数 -->            <aop:after-returning method="afterreturn" pointcut-ref="mypointcut" returning="val"/>            <!-- 异常通知 ,throwing异常的名称,获取异常,exception方法必须声明一个名字为 ex 的参数 -->            <aop:after-throwing method="exception" pointcut-ref="mypointcut" throwing="ex"/>            <!-- 最终通知 -->            <aop:after method="after" pointcut-ref="mypointcut"/>        </aop:aspect>            </aop:config>
public void afterreturn(Object val) {        System.out.println("后置通知" +val);    }    public void     exception(Exception ex) {        System.out.println("异常通知"+ ex.getClass().getName());    }

环绕通知(Around adivce)

Around通知在匹配方法运行期的“周围”执行。 它有机会在目标方法的前面和后面执行,并决定什么时候运行,怎么运行,甚至是否运行。 Around通知经常在需要在一个方法执行前或后共享状态信息,并且是线程安全的情况下使用

<aop:config>        <aop:aspect ref="myAspect">            <aop:pointcut expression="execution(* dao..*.*(..))" id="mypointcut"/>            <!-- 环绕通知 -->            <aop:around method="around" pointcut-ref="mypointcut"/>        </aop:aspect>    </aop:config>
import org.aspectj.lang.ProceedingJoinPoint;public Object around(ProceedingJoinPoint poj) {        Object obj=null;        try {            System.out.println("around前置通知");            obj=poj.proceed();//被代理方法执行            System.out.println("around后置通知" );        } catch (Throwable e) {            System.out.println("around异常通知");        }finally{            System.out.println("around最终通知");        }        return obj;    }