在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
正在按预期工作。但如果注释在界面上,它就不起作用。这是正常行为还是我做错了什么?
答案 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会强有力地添加代理。