问题已发:
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]