1:
AOP中的概念:
Aspect(切面)
:指横切性关注点的抽象即为切面,它与类类似,只是两者关注点不一样,类是对物体特征的抽象,而切面是横切性关注点的抽象。
joinpoint(连接点)
:所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点,实际上joinpoint还可以是field或类构造器。
Pointcut(切入点)
:所谓切入点是指我们要对那些joinpoint进行拦截的定义。
Advice(通知)
所谓通知是指拦截到joinpoint之后所要做的事情就是通知。通知分为前置通知,后置通知,异常通知,最终通知,环绕通知。
Target(目标对象)
:代理的目标对象
Weave(织入)
:只讲aspects应用到target对象并导致proxy对象创建的过程成为织入。
Introduction(引入)
:在不修改类代码的前提下,Introduction可以再运行期为类动态的添加一些方法或Field
2:
加入Spring AOP的支持
(1):加入jar包,在配置文件中导入aop命名空间,加入<aop:aspectj-autoproxy/>元素
(2):定义切面类
(3):在切面类中加入注解:
: 在类前的注解
@Aspect
: 声明一个切入点
@Pointcut("execution(* cn.itcast.service..*.*(..))")
private void anyMethod() {} // 定义切入点的名称是通过方法的定义来定义的.
:定义前置通知
@Before("anyMethod() && args(userName)") 其中 userName 为限制方法的参数必须为String 类型的
public void doAccessCheck(String userName) {}
:定义后置通知
@AfterReturning(pointcut="anyMethod()",returning="revalue")
public void doReturnCheck(String revalue) {}
:定义例外通知
@AfterThrowing(pointcut="anyMethod()",throwing="ex")
public void doExceptionAction(Exception ex){}
:定义最终通知
@After("anyMethod()")
public void doReleaseAction() {}
:环绕通知
@Around("anyMethod()")
public doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
return pjp.proceed();
}
以上 anyMethod() 为切入点的名称, 为要应用的切入点
args 、returning、throwing 为可不定义的可选参数,但被标注方法也要跟着参数的有无而改变方法的参数.
环绕通知的方法的签名是死格式
3:
把类加入Spring管理:
在Spring配置文件中加入或用 @Component 组件注解进行标注即可.
4:
通知流程图:
// 环绕通知
// 前置通知
try{
// 方法执行
// 后置通知
}catch(Exception e){
// 例外通知
}finally{
// 最终通知
}
5:
第 19 集