【问题标题】:Aspectj Spring pointcut on interface doesn't work接口上的 Aspectj Spring 切入点不起作用
【发布时间】:2015-02-10 22:51:33
【问题描述】:

在 Spring 中将方面配置为:

@Configuration
@EnableAspectJAutoProxy
@EnableTransactionManagement
public class TestConfiguration {

    @Bean
    public TransactionAspect transactionAspect(){
        return new TransactionAspect();
    }

TransactionAspect是:

@Aspect
class TransactionAspect extends TransactionSynchronizationAdapter
{
private final Logger logger = LoggerFactory.getLogger(TransactionAspect.class);

@Before("@annotation(org.springframework.transaction.annotation.Transactional)")
public void registerTransactionSyncrhonization()
{
    TransactionSynchronizationManager.registerSynchronization(this);
}

@Override
public void afterCommit()
{
    logger.info("After commit!");
}

}

如果我用@Transactional 注释实现方法,TransactionAspect 将按预期工作。但是如果注释在接口上,它就不起作用。这是正常行为还是我做错了什么?

【问题讨论】:

    标签: spring aop aspectj spring-annotations


    【解决方案1】:

    方法上的注解不会被 Java 中的子类或实现类继承。这可以解释为什么它不起作用。您的期望可能是您的实现方法从其接口继承注释,但事实并非如此。

    更新:因为我之前已经多次回答过这个问题,所以我刚刚记录了这个问题以及Emulate annotation inheritance for interfaces and methods with AspectJ 中的解决方法。

    【讨论】:

    • 一个相关问题,我的服务接口用@Transactional注释,所有实现方法都使用自己的事务运行。但是如果注解不被继承,这怎么可能呢?
    • 我说方法上的注释 不是继承的。对于类,有一个适用于类的@Inherited meta annotation,但它由实现接口的类继承。 @Transactional is @Inherited,但仅限于从超类到子类。如果它适用于你的接口,这似乎是一个 Spring AOP 特性。
    【解决方案2】:

    要完成这项工作,您需要在 aop 配置中添加 proxyTargetClass=true,例如 @EnableAspectJAutoProxy(proxyTargetClass=true) 用于基于 java 的配置或 <aop:config proxy-target-class="true"></aop:config> 用于基于 xml 的配置。这样spring aop会强制添加代理。

    【讨论】:

      猜你喜欢
      • 2019-01-05
      • 2019-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多