界面上的Aspectj Spring切入点并不起作用

时间:2014-12-12 08:59:48

标签: spring aop aspectj spring-annotations

在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正在按预期工作。但如果注释在界面上,它就不起作用。这是正常行为还是我做错了什么?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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