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

标签 java spring spring-aop

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

相关代码如下:

内部方面:

@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

关于java - 从 Spring Aspect 调用不同的代理方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49541007/

相关文章:

java - 接口(interface)与其实现类有什么样的关系?

java - NoClassDefFoundError 在协议(protocol)上需要其命名空间时

java - 部署在外部 tomcat 9 服务器上时,Spring Boot REST Controller 返回 404

java - Spring 4+ hibernate 4 : Could not obtain transaction-synchronized Session for current thread

spring - 为什么自调用不适用于 Spring 代理(例如使用 AOP)?

java - 无法检测 Spring AOP 中的类级别自定义注释

java - 使用 JPA 重新创建表结构

java - 如何使用 Struts2 在服务器启动时运行操作?

java - 如何使用 "size"作为 hibernate/jpa 实体中的字段名称?

java - 是否可以将 Spring Security 的 AOP 与 Java Security Manager 合并?