2012-12-03 108 views
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”。当我从MyService中删除implements service时,一切正常。弹簧豆执行接口

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

我有一些困惑,

  1. 如何@Transactional涉及到代理
  2. 为什么Spring使用JDK代理为它实现的接口豆。
  3. 为什么我需要把<aop:aspectj-autoproxy proxy-target-class="true"/>在applicationContext.xml中

任何人都可以请解释?或向我推荐任何文章或博客

+0

服务 - >服务? – abalogh

回答

1

代理是Spring如何实现声明式事务管理。 Spring reference是所有关于此问题的最佳地点。

掌握关于Spring框架的声明式事务管理最重要的概念,这是通过AOP代理实现的(目前基于XML或注解为主)的事务通知由元数据驱动。 AOP与事务性元数据的结合产生了AOP代理,该代理使用TransactionInterceptor和适当的PlatformTransactionManager实现来驱动方法调用周围的事务。

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

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