这是我的示例类:
public abstract class AbstractAgent {
public void count(List<Movie> movies) {
sum(movies);
}
protected abstract void sum(List<Movie> movies);
}
@Broker
public class DefaultAgent extends AbstractAgent {
@Override
protected void sum(List<Movie> movies) {
Validate.notNull(movies);
}
}
方面定义:
@Aspect
@Component
public class DaoObserver {
@Pointcut("@within(source.service.Broker)")
public void withinBroker() {
}
@AfterReturning("withinBroker()")
public void alertBroker(JoinPoint jp) {
System.out.println("Cached broker execution of {"
+ jp.getSignature().toShortString() + "}");
}
}
我发现 DefaultAgent 的实例没有被代理!
试行如下:
applicationContext.getBeansOfType(AbstractAgent.class);
建议我可以找到类似“DefaultAgent$$EnhancerByCGLIB$$ae10cb14”的东西,但仍然是“DefaultAgent”。
然后我发现如果我将一个公共方法添加到类'DefaultAgent'中它会起作用。
进一步挖掘我发现根本原因在于 aspectj weaver:
org.aspectj.weaver.patterns.WithinAnnotationPointcut.matchInternal(阴影)
@Override
protected FuzzyBoolean matchInternal(Shadow shadow) {
ResolvedType enclosingType = shadow.getIWorld().resolve(shadow.getEnclosingType(), true);
if (enclosingType.isMissing()) {
shadow.getIWorld().getLint().cantFindType.signal(new String[] { WeaverMessages.format(
WeaverMessages.CANT_FIND_TYPE_WITHINPCD, shadow.getEnclosingType().getName()) }, shadow.getSourceLocation(),
new ISourceLocation[] { getSourceLocation() });
}
annotationTypePattern.resolve(shadow.getIWorld());
return annotationTypePattern.matches(enclosingType); **<--- AbstractAgent**
}
是aspectj weaver的bug吗?我该如何解决它,因为我在实际业务中有许多具体的子类,并且它是模式“模板”的标准实现。