我正在使用 Spring MVC 注释驱动配置。我有一个名为ProductRepository
注释的存储库类@Repository
。在我的ProductController
课堂上,我有一个ProductRepository productRepository
用@Autowired
.
- 以下是正确的吗?我想验证我的准确理解是否正确?是否有任何其他技术细节可以很好地补充这一点?现在,当 Web 应用程序初始化时,会为
<context:component-scan>
. 在请求处理期间,当我访问productRepository
对 Spring 库的调用时,会找到一个类型的 bean,ProductRepository
然后返回对它的引用。 - 可能这个问题的答案是基于上一个问题的答案。当我有一个
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)