Skip to main content
 首页 » 编程设计

java之从 Spring Aspect 调用不同的代理方法

2024年06月20日224think

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

相关代码如下:

内部方面:

@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 捕获。

请您参考如下方法:

你可以试试

AopContext.currentProxy() 

参见 Javadoc .

不过,先决条件是您激活代理曝光:

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