2条回答 默认 最新
jinnianshilongnian 2012-09-25 16:35关注@within() 是一种静态切入点 即在IoC容器初始化完毕后就能确定的
判断是否匹配通过
[url] public static boolean canApply(Pointcut pc, Class targetClass, boolean hasIntroductions) {
if (!pc.getClassFilter().matches(targetClass)) {
return false;
}MethodMatcher methodMatcher = pc.getMethodMatcher(); IntroductionAwareMethodMatcher introductionAwareMethodMatcher = null; if (methodMatcher instanceof IntroductionAwareMethodMatcher) { introductionAwareMethodMatcher = (IntroductionAwareMethodMatcher) methodMatcher; } Set classes = new HashSet(ClassUtils.getAllInterfacesForClassAsSet(targetClass)); classes.add(targetClass); for (Iterator it = classes.iterator(); it.hasNext();) { Class clazz = (Class) it.next(); Method[] methods = clazz.getMethods(); for (int j = 0; j < methods.length; j++) { if ((introductionAwareMethodMatcher != null && introductionAwareMethodMatcher.matches(methods[j], targetClass, hasIntroductions)) || methodMatcher.matches(methods[j], targetClass)) { return true; } } } return false; }[/url]而获取方法通过 Method[] methods = clazz.getMethods(); (即只能得到public方法)
因此如果你没有一个public方法 将不实施AOP代理,所以protected方法不能被代理,但是如果有一个public的则可以代理 而且能拦截成功。这个和我之前在论坛分析的一样 属于spring实现问题
[url]http://www.iteye.com/topic/1125911#2368327[/url]本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报