2013-05-03 41 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