麻绳先生

做一些记录性的工作

spring基于XML的AOP

配置步骤

  1. 把通知bean也交给spring管理;
  2. 使用aop:config标签表明开始AOP配置;
  3. 使用aop:aspect标签表明配置切面;
    • id属性:给切面提供一个唯一标识
    • ref属性:指定通知类bean的id
  4. 在aop:aspect标签的内部使用对应标签配置通知的类型;
    • aop:before:表示配置前置通知
      • method:用于指定切面中哪个方法是前置通知;
      • pointcut:用于指定切入点表达式,该表达式的含义是指对业务层中哪些方法进行增强
    • 切入点表达式的写法:
      • 关键字:execution(表达式)
      • 表达式:访问修饰符 返回值 类名.方法名(参数列表)
        • 访问修饰符可以省略
        • 返回值可以使用通配符,表示任意返回类型
        • 包名可以使用通配符,但包的层级需要和通配符一致
        • 包名可以使用..表示包名及其子包
        • 类名和方法名可以使用通配符
        • 全通配写法:* *..*.*(..)
1
2
3
4
5
6
7
8
9
<beans>
<bean id="accountService" class="com.service.impl.AccountServiceImpl></bean>
<bean id="logger" class="com.utils.Logger"></bean>
<aop:config>
<aop:aspect id="logAdvice" ref="logger">
<aop:before method="printlog" pointcut="execution(public void com.service.AccountServiceImpl.saveAccount())"></aop:before>
</aop:aspect>
</aop:config>
</beans>

四种常用通知类型

  • aop:before:前置通知,再切入点方法之前执行;
  • aop:after-returning:后置通知,在切入点方法正确执行之后执行,它和异常通知永远只有一个执行;
  • aop:after-throwing:异常通知,在切入点方法执行产生异常之后执行,它和后置通知永远只能执行一个;
  • aop:after:最终通知,无论切入点方法是否正确执行它都会在其后面执行;
  • aop:pointcut:配置切入点表达式,id属性用于指定表达式的唯一标识,expression属性用于指定表达式的内容;此标签写在aop:aspect内部时只能当前切面使用,将其写在aop:aspect外面时,所有前面可用;
  • aop:around:配置环绕通知;