我使用的是Spring MVC annotation驅動的配置。我有一個名爲ProductRepository
的存儲庫類,註解爲@Repository
。在我的ProductController
班中,我有一個私人字段ProductRepository productRepository
,註解@Autowired
。spring mvc annotation如何驅動鏈接庫對象
- 以下是否正確?我想驗證我的確切理解是否正確?有沒有其他技術細節可以作爲這方面的一個很好的補充?現在,當web應用程序初始化時,將爲
<context:component-scan>
中的每個註釋類創建一個bean。在請求處理期間,當我訪問productRepository
時,對Spring庫的調用將找到類型爲ProductRepository
的bean,然後返回對其的引用。 - 可能是對這個問題的答案是對前一個答案的回答。當我有一個
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)
好的謝謝你的指針。我對1的理解是否正確? – 2013-05-03 15:39:33
沒有。自動裝配是通過BeanFactoryPostProcessor在bean實例化上完成的,而不是在每個請求中。 – 2013-05-03 15:48:14
好的...我的理解是基於一些異常堆棧跟蹤(請參閱更新後的問題),它指出了spring代碼中的一些行,這表明自動裝配是在運行時完成的。我刪除了Repository註釋,並看到服務器啓動時拋出的異常,這證實了你說的話。你能解釋爲什麼異常指向Spring框架內的代碼。自動裝配的對象是否由實現裝飾?是什麼原因? – 2013-05-03 16:07:55