AOP关键词解释
写AOP的步骤:
- 导包
- 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
- 所有jar包都可以在Maven Repository中找到
- 在spring-config的xml文件中配置:启用aop注解功能
<aop:aspectj-autoproxy/> - 随便写一个接口:
- 写两个类:切面类和被切面类,被切面类要实现上面的接口,才能在动态代理中创建代理对象
- 两个类加入spring容器中
- 给切面类注解
@Aspect,表示这是一个切面类 - 告诉切面类的哪个方法需要切入到被切面类的哪个方法中:
@Before: 在方法运行之前
@After: 方法运行结束
@AfterReturning: 方法正常返回
@AfterThrowing: 方法出现异常
注解参数传入一个切入表达式:"execution()"
切入点表达式:对指定的方法进行拦截,并且生成代理表达式。
- 拦截所有public方法
<aop:pointcut expression="execution(public * *(..))" id="pt"/>
- 拦截所有save开头的方法
<aop:pointcut expression="execution(* save*(..))" id="pt"/>```
4. 拦截指定类的指定方法
```xml
<aop:pointcut expression="execution(public * 包名.类名.方法名(..))" id="pt"/>
- 拦截指定类的所有方法
<aop:pointcut expression="execution(* 包名.类名.*(..))" id="pt"/>
- 拦截指定包,以及其自包下所有类的所有方法
<aop:pointcut expression="execution(* cn..*.*(..))" id="pt"/>
- 多个表达式
<aop:pointcut expression="execution(* 包名.类名.方法名()) || execution(* 包名.类名(不同的类).方法名())" id="pt"/>
<aop:pointcut expression="execution(* 包名.类名.方法名()) or execution(* 包名.类名(不同的类).方法名())" id="pt"/>
- 取非值
<aop:pointcut expression="!execution(* 包名.类名.方法名())" id="pt"/>
<aop:pointcut expression=" not execution(* 包名.类名.方法名())" id="pt"/>