spring的AOP配置
切入点表达式
关键字:execution(表达式)
表达式写法:```
- cn.imust.service.impl..(…)
# 基于XML的配置步骤
1. 把通知bean也交给spring来管理
2. 使用aop:config标签表明开始AOP配置
3. 使用aop:aspect标签表明配置切面
- id属性:给切面提供一个唯一标识
- ref属性:是指定通知类的id(**即增强方法的类**)
4. 在aop:aspect标签的内部使用对应的标签来配置统治的类型
- **aop:before**:表示配置前置通知
method属性:用于指定增强类中的哪个方法是前置通知
pointcut属性:指定切入点表达式(指对应业务层中的哪个方法)
- **加粗样式**
<aop:config>
<!--配置切面-->
<aop:pointcut id="pt1" expression="execution(* cn.imust.service.impl.AccountServiceImpl.saveAccount())"></aop:pointcut>
<aop:aspect id="logAdvice" ref="logger">
<!--配置通知的类型,并且建立通知方法和切入点的关联-->
<!--<aop:before method="beforePrintLog" pointcut-ref="pt1"></aop:before>-->
<!--<aop:after-returning method="afterReturningPrintLog" pointcut-ref="pt1"></aop:after-returning>-->
<!--<aop:after-throwing method="afterThrowingPrintLog" pointcut-ref="pt1"></aop:after-throwing>-->
<!--<aop:after method="afterPrintLog" pointcut-ref="pt1"></aop:after>-->
//环绕类型
<aop:around method="aroundPrintLog" pointcut-ref="pt1"></aop:around>
</aop:aspect>
</aop:config>
在增强类中,编写环绕方法
//环绕通知
//问题:配置好以后,切入点方法没有执行,而通知方法执行了
//分析:发现动态代理中环绕通知有明确的切入点方法调用,而这个没有
//解决:spring提供了一个接口:ProceedingJoinPoint
// 这个接口提供了一个方法,proceed();
//环绕通知:它是spring框架为我们提供的一种可以在代码中手动控制增强方法何时执行的方式
public Object aroundPrintLog (ProceedingJoinPoint pjp){
Object rtValue=null;
try {
Object[] args = pjp.getArgs();
System.out.println(“aroundPrintLog方法开始记录日志。。。前置”);
rtValue = pjp.proceed(args);//调用业务层方法
System.out.println(“aroundPrintLog方法开始记录日志。。。后置”);
return rtValue;
} catch (Throwable t) {
System.out.println("aroundPrintLog方法开始记录日志。。。异常");
throw new RuntimeException(t);
}finally {
System.out.println("aroundPrintLog方法开始记录日志。。。最终");
}
}
# 基于注解的AOP步骤
1. @Aspect表示表示当前类为增强类及切面类
2. @Before()前置
3. @AfterReturning后置通知
4. @AfterThrowing异常通知
5. @After最终通知
6. @Around()环绕通知