Spring AOP

1,982 阅读2分钟

AOP关键词解释

写AOP的步骤:

  1. 导包
  • spring AOP的核心包
spring-aop-4.3.18.RELEASE.jar
  • AOP的扩展包(导入扩展包后,被切面类不用实现任何接口,也可以被切面)
com.springsource.org.aspectj.weaver-1.7.2.RELEASE.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.net.sf.cglib-2.2.0.jar
  1. 在spring-config的xml文件中配置:启用aop注解功能 <aop:aspectj-autoproxy/>
  2. 随便写一个接口:
  3. 写两个类:切面类和被切面类,被切面类要实现上面的接口,才能在动态代理中创建代理对象
  4. 两个类加入spring容器中
  5. 给切面类注解@Aspect,表示这是一个切面类
  6. 告诉切面类的哪个方法需要切入到被切面类的哪个方法中:

@Before: 在方法运行之前
@After: 方法运行结束
@AfterReturning: 方法正常返回
@AfterThrowing: 方法出现异常

注解参数传入一个切入表达式:"execution()"

切入点表达式:对指定的方法进行拦截,并且生成代理表达式。

  1. 拦截所有public方法
<aop:pointcut expression="execution(public * *(..))" id="pt"/>
  1. 拦截所有save开头的方法
<aop:pointcut expression="execution(* save*(..))" id="pt"/>```
4. 拦截指定类的指定方法

```xml
<aop:pointcut expression="execution(public * 包名.类名.方法名(..))" id="pt"/>
  1. 拦截指定类的所有方法
<aop:pointcut expression="execution(* 包名.类名.*(..))" id="pt"/>
  1. 拦截指定包,以及其自包下所有类的所有方法
<aop:pointcut expression="execution(* cn..*.*(..))" id="pt"/>
  1. 多个表达式
<aop:pointcut expression="execution(* 包名.类名.方法名()) || execution(* 包名.类名(不同的类).方法名())" id="pt"/>
<aop:pointcut expression="execution(* 包名.类名.方法名()) or execution(* 包名.类名(不同的类).方法名())" id="pt"/>
  1. 取非值
<aop:pointcut expression="!execution(* 包名.类名.方法名())" id="pt"/>
<aop:pointcut expression=" not execution(* 包名.类名.方法名())" id="pt"/>