public interface Service {
public void doSomething();
}
@Service
public class MyService implements service{
@Transactional
public void doSomething(){
}
}
@Controller
public class MyController {
@Autowired
private MyService service;
}
在上面的场景中,自动装配失败,异常为“illegalArgumentException : argument type mismatch
”。当我从MyService中删除implements service
时,一切正常。
我已经搜索并在applicationContext.xml中找到了<aop:aspectj-autoproxy proxy-target-class="true"/>
,以便成功进行自动装配,并且可以正常工作。
我还发现spring在使用@Transactional时使用JDK代理。
我有一些困惑,
<aop:aspectj-autoproxy proxy-target-class="true"/>
醇>
任何人都可以解释一下吗?或者推荐我任何文章或博客
答案 0 :(得分:1)
代理是Spring如何实现声明式事务管理。 Spring reference是您提出所有问题的最佳地点。
关于Spring Framework的声明式事务支持,最重要的概念是通过AOP代理启用此支持,并且事务性建议由元数据驱动(当前基于XML或基于注释)。 AOP与事务元数据的组合产生一个AOP代理,该代理使用TransactionInterceptor和适当的PlatformTransactionManager实现来驱动围绕方法调用的事务。
和<aop:aspectj-autoproxy proxy-target-class="true"/>
上的proxy-target-class属性 element控制为哪种类型的事务代理创建 使用@Transactional注释注释的类。如果 proxy-target-class属性设置为true,基于类的代理是 创建。如果proxy-target-class为false或属性为false 省略,创建基于标准JDK接口的代理。 (看到 第8.6节“代理机制”讨论了不同的内容 代理类型。)