XML方式实现Spring的AOP
1、编写切面类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | package com.fz.annotation.aop; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.AfterThrowing; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; public class LogInterceptor { public void before(){ System.out.println( "方法之前执行...." ); } public void afterRutting(){ System.out.println( "方法正常执行之后...." ); } public void afterThrowing(){ System.out.println( "方法抛出异常之后...." ); } public void around(ProceedingJoinPoint pjp) throws Throwable{ System.out.println( "方法执之前around......" ); pjp.proceed(); //向下继续方法的执行:(包括执行其他切面的拦截,如果当中抛出异常,则不会向下继续执行) System.out.println( "方法执之后around......" ); //这里会在@AfterReturning执行之后执行 } } |
2、编写applicationContext.xml文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <? xml version = "1.0" encoding = "UTF-8" ?> xsi:schemaLocation="http://www.springframework.org/schema/beans < context:annotation-config /> < context:component-scan base-package = "com.fz.annotation" /> < bean id = "logInterceptor" class = "com.fz.annotation.aop.LogInterceptor" > </ bean > < aop:config > < aop:pointcut expression = "execution(public void com.fz.annotation.service.impl.UserServiceImpl.userAdd(com.fz.xml.entity.User))" id = "servicePointcut" /> < aop:aspect id = "logAspect" ref = "logInterceptor" > < aop:before method = "before" pointcut-ref = "servicePointcut" /> </ aop:aspect > </ aop:config > </ beans > |
其中:<aop:pointcut>标签和<aop:aspect>同级,表示<aop:pointcut>是一个全局的pointcut
也可以让pointcut只供某一个逻辑使用,像下面这样写
1 2 3 4 5 6 7 | < aop:config > < aop:aspect id = "logAspect" ref = "logInterceptor" > < aop:pointcut id = "servicePointcut" expression = "execution(public void com.fz.annotation.service.impl.UserServiceImpl.userAdd(com.fz.xml.entity.User))" /> < aop:before method = "before" pointcut-ref = "servicePointcut" /> </ aop:aspect > </ aop:config > |
还有可以这样写,注意:直接在before里写pointcut属性的时候需要将pointcut-ref属性去掉
1 2 3 4 5 | < aop:config > < aop:aspect id = "logAspect" ref = "logInterceptor" > < aop:before method = "before" pointcut = "execution(public void com.fz.annotation.service.impl.UserServiceImpl.userAdd(com.fz.xml.entity.User))" /> </ aop:aspect > </ aop:config > |