从Spring Aspect

时间:2018-03-28 17:45:04

标签: java spring spring-aop

我有两个不同的方面。如何确保从一个方面调用方法时,它仍将通过代理链?

以下是相关代码:

内部方面:

@Around("withinReplicatedRepository() && entityMethod() && insertMethod()")
public Object trackInsert(ProceedingJoinPoint jp) throws Throwable {
    return trackChange(jp, ChangeType.INSERT, jp.getArgs()[0]);
}

方面:

@Around("withinReplicatedRepository() && entityMethod() && autoSaveRepository() && saveMethod()")
public Object saveEntity(ProceedingJoinPoint jp) throws Throwable {
    TransactionUtil.ensureTransactional();

    Object entity = jp.getArgs()[0];
    AutoSaveRepository repository = (AutoSaveRepository)jp.getTarget();
    if (repository.exists(entity)) {
        repository.update(entity);
    } else {
        repository.insert(entity);
    }
    return null;
}

使用方法:

AutoSaveRepository<MyEntity> repo = ...;
repo.save(entity);

我的问题是jp.getTarget()将返回原始类,因此trackInsert不会捕获repository.insert()。

1 个答案:

答案 0 :(得分:3)

你可以尝试

AopContext.currentProxy()

请参阅Javadoc

前提条件是您激活代理曝光,但是:

  • 在XML中,您可以通过
    <aop:aspectj-autoproxy expose-proxy="true"/>
  • 从Spring 3.0.3开始执行此操作
  • 在注释式配置中,您可以通过
    @EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true),见Javadoc
  • 从4.3.1开始执行此操作