Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从Spring方面调用不同的代理方法_Java_Spring_Spring Aop - Fatal编程技术网

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);