【发布时间】:2018-03-28 17:45:03
【问题描述】:
我有两个不同的方面。如何保证从某一方面调用方法时,还是要经过代理链?
相关代码如下:
内在方面:
@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<MyEntity> repo = ...;是什么?AutoSaveRepository是单例 bean 吗?那么使用getBean(..)应该很容易得到这个bean。 -
不是单例,AutoSaveRepository 有多个实例。
标签: java spring spring-aop