У меня два разных аспекта. Как я могу гарантировать, что при вызове метода с одного аспекта он все равно будет проходить через цепочку прокси?
Вот соответствующий код:
Внутренний аспект:
@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 () вернет исходный класс, поэтому repository.insert () не будет захвачен trackInsert.
Это не синглтон, есть несколько экземпляров AutoSaveRepository.




Можешь попробовать
AopContext.currentProxy()
См. Javadoc.
При этом необходимо, чтобы вы активировали доступ к прокси:
<aop:aspectj-autoproxy expose-proxy = "true"/>.@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true), Я видел это в других обсуждениях. Но разве AopContext.currentProxy() не считается чем-то вроде взломать?
Это задокументировано в Spring Javadoc. Что бы вы подумали? Но если у вас есть другой способ получить экземпляр компонента (прокси), используйте его. В качестве альтернативы используйте полный AspectJ с LTW и избавьтесь от прокси Spring.
Это немного похоже на взлом (см. Также этот ответ: stackoverflow.com/a/7482767/353563), но если это единственный способ, то у меня нет особого выбора. В идеале в ProceedingJoinPoint должен быть метод для получения исходного объекта, но я понимаю, почему этого трудно достичь.
Итак, потому что один человек в другом ответе сказал, что это означает, что это взлом? На самом деле у Spring AOP есть свои ограничения. По сравнению с AspectJ это скорее "AOP lite", но если вы не хотите переключаться, вы должны брать то, что предлагается. :-)
Что такое
...вAutoSaveRepository<MyEntity> repo = ...;?AutoSaveRepository- это одноэлементный компонент? Тогда должно быть легко получить компонент для этого с помощьюgetBean(..).