1.Spring AOP框架相关概念
Aspect(切面): 是通知和切入点的结合,通知和切入点共同定义了关于切面的全部内容---它的功能、在何时和何地完成其功能。
joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点。如personService的add方法之前。
Pointcut(切入点): 指一堆连接点的集合。比如所有名字为add*的方法之前。有一种表达式语言描述这个切入点。Spring使用AspectJ的切入点描述语法,有点类似于正则表达式。execution(*cn.itcast.gz.service..add*(..))。
Advice(通知): 指在连接点(切入点)的什么位置,做什么事情。
Target(目标对象):代理的目标对象。即对哪个对象进行切入其它方面的代码。
Weaving(织入): 把几个切面的代码切入核心业务组件的过程。静态织入,在编译的时候就织入(支持aop特殊编译器,AspectJ)。动态织入,编译使用的普通的java编译器,在运行的时候通过代理来进行织入(Spring)。静态织入比动态织入运行性能高。
Introduction(引入): 在不修改代码的情况下,给一个已经存在的业务组件动态添加一些方法,字段,增加功能。(动态让其去实现一些接口。)
2.Spring AOP框架的基本应用
2.1 AOP简单应用
1)引入aop相关的jar包
aopalliance.jar aop 联盟
aspectjweaver.jar AspectJ
cglib-nodep-2.1_3.jar 生成代理类
org.springframework.aop-3.1.1.RELEASE.jar aop 核心包
2)在beans.xml配置文件中加入aop命名空间
3)配置切面Bean
4)配置切面
5)配置切入点
6)配置通知
配置文件:
< xml version="1.0"encoding="UTF-8" >
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
切面Bean:
publicclass SecurityAspect {
publicboolean checkPermission() {//无参数的方法
System.out.println("执行权限检查....----------");
boolean flag = false;
if(!"admin".equals(UserContext.getUser())){
System.out.println("无权限。。。--------");
thrownew RuntimeException("没有权限!");
}else {
flag= true;
System.out.println("有权限。。。--------");
}
return flag;
}
}
全局切入点的配置:
但有多个切面要织入一个同一个切入点的时候,可以将切入点配置成全局的切入点,即将其提取到切面外面。
< xml version="1.0"encoding="UTF-8" >
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">
2.2AOP通知详解—基于XML配置
1)前置通知 aop:before
2)后置通知 aop:after-running
3)异常通知 aop:after-throwing
4)最终通知 aop:after
5) 环绕通知(可以替代前面四种通知) aop:around
5) 环绕通知(可以替代前面四种通知) aop:around
所谓的环绕通知是指环绕在切入点四周的方法。用环绕通知可以在切入点方法的前面后面,任意位置执行执行自己的代码,由自己控制要不要调用目标对象的方法。
使用环绕通知时,对切面Bean中的方法是有要求的,方法必须返回Object类,并有一个ProceedingJoinPoint类型的参数。如:
public Object check(ProceedingJoinPointpoint) {
.....
Objectret = ....
returnret
}
切面Bean:
publicclass AroundAspect {
/**
* 方法必须返回Object类型且有一个ProceedingJoinPoint类型的参数
*/
public Objectcheck(ProceedingJoinPoint point) {