Java 从Spring方面调用不同的代理方法
我有两个不同的方面。我如何确保当从一个方面调用方法时,它仍然会通过代理链 以下是相关代码: 内在方面: 外部方面: 用法:Java 从Spring方面调用不同的代理方法,java,spring,spring-aop,Java,Spring,Spring Aop,我有两个不同的方面。我如何确保当从一个方面调用方法时,它仍然会通过代理链 以下是相关代码: 内在方面: 外部方面: 用法: autosaverepositoryrepo=。。。; 回购保存(实体); 我的问题是,jp.getTarget()将返回原始类,因此trackInsert不会捕获repository.insert()。您可以尝试 AopContext.currentProxy() 看 先决条件是激活代理曝光,但: 在XML中,从Spring3.0.3开始,您可以通过 什么是自
autosaverepositoryrepo=。。。;
回购保存(实体);
我的问题是,jp.getTarget()将返回原始类,因此trackInsert不会捕获repository.insert()。您可以尝试
AopContext.currentProxy()
看
先决条件是激活代理曝光,但:
- 在XML中,从Spring3.0.3开始,您可以通过
自动储蓄回购=代码>?AutoSaveRepository
是单例bean吗?然后使用getBean(..)
就可以很容易地获得这个bean。它不是单例的,有多个AutoSaveRepository实例。我在其他线程中看到了这一点。但是AopContext.currentProxy()
不被认为是一种黑客行为吗?它在Spring的Javadoc中有记录。你会怎么想?但是,如果您有另一种获得bean实例(代理)的方法,请使用该方法。或者,在LTW中使用完整的AspectJ并去掉Spring的代理。它确实感觉有点像黑客(也可以看到这个答案:),但是如果这是唯一的方法,那么我没有太多选择。理想情况下,在处理JoinPoint时会有一种方法来获得原始对象,但我理解为什么这很难实现。所以,因为另一个答案中的一个人说这意味着这是一种黑客行为?实际上,Spring AOP确实有其局限性。与AspectJ相比,它相当于“AOP-lite”,但如果您不想切换,您必须接受它提供的功能。:-)
@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);