我使用的是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