Spring Aop源码学习--PointCut切入点
2017-07-07 18:29
357 查看
PointCut切入点简单来说就是用来指明Advice(增强)所作用的地方(一般指方法),PointCut简单来说是一个基于表达式的拦截条件。
PointCut接口及实现类:
PointCut接口提供了两个接口分别对类和方法进行匹配过滤,如果类及方法匹配成功则Advice就可以作用在方法上。
public interface Pointcut {
/**
* Return the ClassFilter for this pointcut.
* @return the ClassFilter (never {@code null})
*/
//通过pointcut表达式对类进行过滤
ClassFilter getClassFilter();
/**
* Return the MethodMatcher for this pointcut.
* @return the MethodMatcher (never {@code null})
*/
//通过pointcut表达式对方法进行过滤
MethodMatcher getMethodMatcher();
/**
* Canonical Pointcut instance that always matches.
*/
//匹配所有的类及方法,默认返回true
Pointcut TRUE = TruePointcut.INSTANCE;
}在PointCut的子类AspectJExpressionPointcut中提供了两个方法对类和方法进行匹配判断,其最后的过滤的处理操作还是在aspectjweaver(aspectJ类库,AspectJ是一个专门用来实现动态代理(AOP编程)的类库,AspectJ是面向切面编程的框架,Spring使用就是这个类库实现动态代理的)这个jar中完成的。
//对类进行过滤匹配
@Override
public boolean matches(Class<?> targetClass) {
checkReadyToMatch();
try {
try {
return this.pointcutExpression.couldMatchJoinPointsInType(targetClass);
}
catch (ReflectionWorldException ex) {
logger.debug("PointcutExpression matching rejected target class - trying fallback expression", ex);
PointcutExpression fallbackExpression = getFallbackPointcutExpression(targetClass);
if (fallbackExpression != null) {
return fallbackExpression.couldMatchJoinPointsInType(targetClass);
}
}
}
catch (Throwable ex) {
logger.debug("PointcutExpression matching rejected target class", ex);
}
return false;
}
//对方法进行过滤匹配
@Override
public boolean matches(Method method, Class<?> targetClass, boolean beanHasIntroductions) {
checkReadyToMatch();
Method targetMethod = AopUtils.getMostSpecificMethod(method, targetClass);
ShadowMatch shadowMatch = getShadowMatch(targetMethod, method);
if (shadowMatch.alwaysMatches()) {
return true;
}
else if (shadowMatch.neverMatches()) {
return false;
}
else {
if (beanHasIntroductions) {
return true;
}
RuntimeTestWalker walker = getRuntimeTestWalker(shadowMatch);
return (!walker.testsSubtypeSensitiveVars() || walker.testTargetInstanceOfResidue(targetClass));
}
}总结:PointCut接口及其实现类就是根据我们配置的类及方法的过滤规则在调用Advice之前进行过滤,看看是否需要调用Advice。
PointCut接口及实现类:
PointCut接口提供了两个接口分别对类和方法进行匹配过滤,如果类及方法匹配成功则Advice就可以作用在方法上。
public interface Pointcut {
/**
* Return the ClassFilter for this pointcut.
* @return the ClassFilter (never {@code null})
*/
//通过pointcut表达式对类进行过滤
ClassFilter getClassFilter();
/**
* Return the MethodMatcher for this pointcut.
* @return the MethodMatcher (never {@code null})
*/
//通过pointcut表达式对方法进行过滤
MethodMatcher getMethodMatcher();
/**
* Canonical Pointcut instance that always matches.
*/
//匹配所有的类及方法,默认返回true
Pointcut TRUE = TruePointcut.INSTANCE;
}在PointCut的子类AspectJExpressionPointcut中提供了两个方法对类和方法进行匹配判断,其最后的过滤的处理操作还是在aspectjweaver(aspectJ类库,AspectJ是一个专门用来实现动态代理(AOP编程)的类库,AspectJ是面向切面编程的框架,Spring使用就是这个类库实现动态代理的)这个jar中完成的。
//对类进行过滤匹配
@Override
public boolean matches(Class<?> targetClass) {
checkReadyToMatch();
try {
try {
return this.pointcutExpression.couldMatchJoinPointsInType(targetClass);
}
catch (ReflectionWorldException ex) {
logger.debug("PointcutExpression matching rejected target class - trying fallback expression", ex);
PointcutExpression fallbackExpression = getFallbackPointcutExpression(targetClass);
if (fallbackExpression != null) {
return fallbackExpression.couldMatchJoinPointsInType(targetClass);
}
}
}
catch (Throwable ex) {
logger.debug("PointcutExpression matching rejected target class", ex);
}
return false;
}
//对方法进行过滤匹配
@Override
public boolean matches(Method method, Class<?> targetClass, boolean beanHasIntroductions) {
checkReadyToMatch();
Method targetMethod = AopUtils.getMostSpecificMethod(method, targetClass);
ShadowMatch shadowMatch = getShadowMatch(targetMethod, method);
if (shadowMatch.alwaysMatches()) {
return true;
}
else if (shadowMatch.neverMatches()) {
return false;
}
else {
if (beanHasIntroductions) {
return true;
}
RuntimeTestWalker walker = getRuntimeTestWalker(shadowMatch);
return (!walker.testsSubtypeSensitiveVars() || walker.testTargetInstanceOfResidue(targetClass));
}
}总结:PointCut接口及其实现类就是根据我们配置的类及方法的过滤规则在调用Advice之前进行过滤,看看是否需要调用Advice。
相关文章推荐
- spring aop学习2:切面表达式(Pointcut express)
- spring aop 学习小插曲 IllegalArgumentException: error at ::0 can't find referenced pointcut xx
- 5.3 AOP的3个关键概念 & 5.4 Spring的3种切入点(Pointcut)实现
- spring aop pointcut 切入点是类的公共方法(私有方法不行),还是接口的方法
- SpringAOP学习第一天 @Pointcut注解
- Spring学习(十六)----- Spring AOP实例(Pointcut(切点),Advisor)
- Spring Aop源码学习--JoinPoint连接点
- Spring源码学习(二)------ AOP
- Spring事务管理—aop:pointcut expression解析
- Spring3系列10- Spring AOP——Pointcut,Advisor拦截指定方法
- spring源码学习之路---深入AOP(终)
- Spring源码学习(二)------ AOP
- spring 学习笔记 pointcut&advisor
- Spring AOP 之 RegexpMethodPointcutAdvisor
- spring源码学习之路---深入AOP(终)
- Spring源码学习 ------ IoC——AOP
- spring源码学习之路---AOP初探(六)
- AOP实现——Spring 2.0中Pointcut的定义
- Spring《注解实现aop: can't find referenced pointcut..可能出现错误的原因》
- Spring AOP:使用NameMatchMethodPointcutAdvisor实现切面编程