2013-05-03 44 views
0

我使用的是Spring MVC annotation驅動的配置。我有一個名爲ProductRepository的存儲庫類,註解爲@Repository。在我的ProductController班中,我有一個私人字段ProductRepository productRepository,註解@Autowiredspring mvc annotation如何驅動鏈接庫對象

  1. 以下是否正確?我想驗證我的確切理解是否正確?有沒有其他技術細節可以作爲這方面的一個很好的補充?現在,當web應用程序初始化時,將爲<context:component-scan>中的每個註釋類創建一個bean。在請求處理期間,當我訪問productRepository時,對Spring庫的調用將找到類型爲ProductRepository的bean,然後返回對其的引用。
  2. 可能是對這個問題的答案是對前一個答案的回答。當我有一個IProductRepository接口時,會發生什麼情況,我會自動將一個實例連接到此接口。如果我有兩個類實現這個接口,那麼自動裝配將如何找到合適的bean?自動裝配是否與接口一起工作?

我在問第二個問題,因爲目前我正在向我的Controller類自動裝入Repository bean的實例。作爲一個好的設計實踐,我發現我應該真的使用DAO。我的理解是,在這種情況下,DAO(一個接口)將被自動裝配,並且這個DAO(Hibernate,JDBC)可以有多個實現。現在,如果我有多個實現此DAO接口的Repository類,並且我的Controller有一個DAO接口的自動裝配字段,它將如何注入適當的DAO實現?

我必須求助於XML配置嗎?這裏我有什麼選擇依賴注入的選項?

更新:

java.lang.NullPointerException 
    at repository.ProductRepository.findProductByCollectionNumber(ProductRepository.java:179) 
    at repository.ProductRepository$$FastClassByCGLIB$$ecfba3d5.invoke(<generated>) 
    at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
    at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:689) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622) 
    at repository.ProductRepository$$EnhancerByCGLIB$$b45a8183.findProductByCollectionNumber(<generated>) 
    at controller.ProductController.findProductPagination(ProductController.java:198) 

回答

0

當類型自動裝配,如果超過一個bean被發現bean工廠上升一個Exception。 可以解決使用@Qualifier標註它,看到http://static.springsource.org/spring/docs/current/spring-framework-reference/html/beans.html#beans-autowired-annotation-qualifiers

或名稱與@Resource註釋切換到自動裝配。

+0

好的謝謝你的指針。我對1的理解是否正確? – 2013-05-03 15:39:33

+0

沒有。自動裝配是通過BeanFactoryPostProcessor在bean實例化上完成的,而不是在每個請求中。 – 2013-05-03 15:48:14

+0

好的...我的理解是基於一些異常堆棧跟蹤(請參閱更新後的問題),它指出了spring代碼中的一些行,這表明自動裝配是在運行時完成的。我刪除了Repository註釋,並看到服務器啓動時拋出的異常,這證實了你說的話。你能解釋爲什麼異常指向Spring框架內的代碼。自動裝配的對象是否由實現裝飾?是什麼原因? – 2013-05-03 16:07:55