1
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”。当我implements service从 MyService 中删除时,一切正常。

我已经搜索并<aop:aspectj-autoproxy proxy-target-class="true"/>在 applicationContext.xml 中找到了成功自动装配的地方,并且它有效。我还发现当使用@Transactional 时,spring 使用 JDK 代理。

我有一些困惑,

  1. @Transactional 如何与代理相关
  2. 为什么 spring 对实现接口的 bean 使用 JDK 代理。
  3. 为什么我需要放置<aop:aspectj-autoproxy proxy-target-class="true"/>在 applicationContext.xml

谁能解释一下?或向我推荐任何文章或博客

4

1 回答 1

1

代理是 Spring 实现声明式事务管理的方式。Spring reference是解决您对此问题的最佳场所。

关于 Spring 框架的声明式事务支持,最重要的概念是这种支持是通过 AOP 代理启用的,并且事务建议是由元数据驱动的(目前是基于 XML 或基于注释的)。AOP 与事务元数据的组合产生了一个 AOP 代理,它使用 TransactionInterceptor 和适当的 PlatformTransactionManager 实现来驱动围绕方法调用的事务。

和上<aop:aspectj-autoproxy proxy-target-class="true"/>

元素上的 proxy-target-class 属性控制为使用 @Transactional 注释注释的类创建什么类型的事务代理。如果 proxy-target-class 属性设置为 true,则创建基于类的代理。如果 proxy-target-class 为 false 或省略该属性,则会创建基于标准 JDK 接口的代理。(有关不同代理类型的讨论,请参见第 8.6 节,“代理机制”。)

于 2012-12-03T08:39:47.720 回答