0

我正在使用 Spring MVC 注释驱动配置。我有一个名为ProductRepository注释的存储库类@Repository。在我的ProductController课堂上,我有一个ProductRepository productRepository@Autowired.

  1. 以下是正确的吗?我想验证我的准确理解是否正确?是否有任何其他技术细节可以很好地补充这一点?现在,当 Web 应用程序初始化时,会为 <context:component-scan>. 在请求处理期间,当我访问productRepository对 Spring 库的调用时,会找到一个类型的 bean,ProductRepository然后返回对它的引用。
  2. 可能这个问题的答案是基于上一个问题的答案。当我有一个IProductRepository接口并且我将一个实例自动连接到这个接口时会发生什么。如果我有两个实现这个接口的类,那么自动装配如何找到正确的 bean?自动装配是否适用于接口?

我问第二个问题是因为目前我正在将 Repository bean 的实例自动装配到我的 Controller 类。作为一个好的设计实践,我发现我真的应该使用 DAO。我的理解是,在这种情况下,DAO(一个接口)将被自动装配,并且这个 DAO(Hibernate、JDBC)可以有多种实现。现在,如果我有多个 Repository 类实现这个 DAO 接口,并且我的 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)
4

1 回答 1

0

当按类型自动装配时,如果找到多个 bean,则 bean factory 会上升一个Exception. 您可以使用@Qualifier注释解决它,请参阅http://static.springsource.org/spring/docs/current/spring-framework-reference/html/beans.html#beans-autowired-annotation-qualifiers

@Resource或使用注释切换到按名称自动装配。

于 2013-05-03T08:47:38.467 回答