Spring-AOP-增强
Spring AOP 又称 面向切面编程,要实现AOP就要有切点,增强,织入,连接点,切面...
增强又分为:前置增强,后置增强,异常抛出增强,环绕增强,后置增强,最终增强
编写配置文件中的增强代码之前我们先创建一个增强类,用于存放增强的代码:
import org.apache.log4j.Logger; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; public class UserAdvice { private Logger log=Logger.getLogger(UserAdvice.class); //前置增强 public void before(JoinPoint j) { String methodName=j.getSignature().getName(); String className=j.getTarget().getClass().getName(); log.info(className+"类"+methodName+"方法的前置增强"); } //异常抛出增强 public void afterThrowing(JoinPoint j,Exception e) { String methodName=j.getSignature().getName(); String className=j.getTarget().getClass().getName(); log.info(className+"类"+methodName+"方法异常:"+e.getMessage()); } //后置增强 public void afterreturning(JoinPoint j) { String methodName=j.getSignature().getName(); String className=j.getTarget().getClass().getName(); log.info(className+"类"+methodName+"方法的后置增强"); } //最终增强 public void after(JoinPoint j){ String methodName=j.getSignature().getName(); String className=j.getTarget().getClass().getName(); log.info(className+"类"+methodName+"方法的最终增强"); } //环绕增强 public Object around(ProceedingJoinPoint j) { Object resoult=null; log.info("环绕前"); try { resoult=j.proceed(); log.info("环绕后"); } catch (Throwable e) { e.printStackTrace(); } return resoult; } }
配置文件中:
<!--创建增强类的bean-->
<bean id="adv" class="cn.bdqn.dao.UserAdvice"></bean> <aop:config>
<!--定义切点 expression允许使用的范围--> <aop:pointcut expression="execution(* cn.bdqn.service..*.*(..))" id="p1"/>
<!--引用增强类--> <aop:aspect ref="adv">
<!--method对应的是增强类中对应的方法,pointcut-ref对应的是切点-->
<aop:before method="before" pointcut-ref="p1" /><!--前置增强 在方法执行前执行-->
<!--后置增强 在方法执行完执行--> <aop:after-returning method="afterreturning" pointcut-ref="p1"/>
<!--异常抛出增强 在方法执行处错误时执行--> <aop:after-throwing method="afterThrowing" pointcut-ref="p1" throwing="e"/>
<!--最终增强 无论方法是否出现异常都会执行--> <aop:after method="after" pointcut-ref="p1"/>
<!--环绕增强 在方法执行前和方法执行后执行--> <aop:around method="around" pointcut-ref="p1"/> </aop:aspect> </aop:config>