2

这是我的示例类:

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吗?我该如何解决它,因为我在实际业务中有许多具体的子类,并且它是模式“模板”的标准实现。

4

2 回答 2

0

找到解决方案:@target 适合这种情况。

完美地描述了@within 和@target 之间的区别。

我是多么愚蠢!

于 2012-09-25T11:58:55.827 回答
0

在没有分析问题的情况下(我通常在没有 Spring 的情况下使用 AJ)并且没有太多时间,我建议您在 AJ 用户邮件列表中提出您的问题。那里的人真的很能干,可能会发现它是否是一个错误。如果您很确定它是一个,请打开 Bugzilla 票证。

于 2012-09-24T10:59:59.123 回答