2012-12-03 155 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節「代理機制」以討論代理類型的不同 。)