Spring AOP中使用@pointcut("@within(xxxx)") 对没有public方法的类未生成proxy (模板模式的实现)

问题已发:
http://stackoverflow.com/questions/12559713/aspectj-expession-within-doesnt-effect-on-concrete-class-which-doesnt-have
纠结几天了, 谢谢~~

@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]

I found the instance of DefaultAgent was not proxied!

Tried the line as below:

applicationContext.getBeansOfType(AbstractAgent.class);
Proposed I could find something like 'DefaultAgent$$EnhancerByCGLIB$$ae10cb14', but still 'DefaultAgent'.

这种方法会自动调用目标对象的toString(),所以拿不到类似于DefaultAgent$$EnhancerByCGLIB$$ae10cb14, 可以输出getClass();

@Pointcut("@within(source.service.Broker)") 对protected应该也是没问题的,你的spring和aspectj版本是?

1、
[url]http://jinnianshilongnian.iteye.com/blog/1415606[/url]

2、
[url]http://www.iteye.com/topic/1125911#2368327[/url]