Spring Bean实现了接口

时间:2012-12-03 07:08:59

标签: spring spring-mvc

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代理。

我有一些困惑,

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

    任何人都可以解释一下吗?或者推荐我任何文章或博客

1 个答案:

答案 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节“代理机制”讨论了不同的内容   代理类型。)