AOP有标准化的定义.
通俗解释AOP:面向所关心方面的编程.(比如,在系统中如果需要对每个操作做RoleCheck,则可以建一个类RoleCheck,来管理这个方面)
Spring AOP是实现AOP的一种方式.
AOP的几个概念:
1 Advice:
即你在关注点所想做的一些动作,如你需要RoleCheck时进行的操作.( org.aopalliance.intercept.Advice)
分类:
MethodInterceptor (org.aopalliance.intercept.MethodInterceptor)
Advice org.aopalliance.aop.Advice
---BeforeAdvice
extends Advice org.springframework.aop.BeforeAdvice 在目标方法被调用之前调用
public Object invoke(MethodInvocation mi) throws Throwable {
//先调用before方法,这是实现BeforeAdvice接口的类, 然后再调用余下的advice
// before方法内容 即自定义在目标方法被调用之前要做动作
this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis() );
return mi.proceed();
}
---AfterAdvice extends Advice org.springframework.aop.AfterReturningAdvice 在目标方法被调用之后调用
public Object invoke(MethodInvocation mi) throws Throwable {
//先调用在这个advice之前的advice, 后调用afterReturning方法,这是实现AfterAdvice接口的类,
// afterReturning() 函数内容即自定义在目标方法被调用之后要做的动作
Object retVal = mi.proceed();
this.advice.afterReturning(retVal, mi.getMethod(), mi.getArguments(), mi.getThis());
return retVal;
}
---ThrowsAdvice extends Advice org.springframework.aop.ThrowsAdvice 在目标方法抛出异常时调用
2. PointCut
指的是需要关注的点.即需要增加所定义的advice的点.如你需要在调用viewlist()前进行RoleCheck,那这个viewlist()就是一个pointcut
3.Advisor
由定义切面的advice和定义切面在什么地方执行的pointcut而成的就是Advisor。
4.生成AopProxy
.....待
5.Spring AOP Interceptor 调用的过程.(jdk动态代理方式实现)
1当目标函数被调用时,由于jdk的动态代理. 进入JdkDynamicAopProxy.invoke(){
(1). 得到targetSource,即被关注的函数
(2). 得到 intercetion chain,即定义的advice
(3).判断chain,如果为空,直接invokeJoinpoint,否则生成invocation,然后invoke这些advice.
2. 进入 ReflectiveMethodInvocation.proceed(), 然后会一次进入beforeAdvice或afterAdvice,递归调用其中的proceed,
3.当递归进入到proceed(),发现所有interception chain中的advice已经处理完,调用 invokeJoinPoint(),
4. 完成后, 递归返回.