@Component和@Repository / @Service注释的处理方式有何区别?
今天我在Spring 3.0中偶然发现了一个相当奇怪的问题:
有一个抽象类A
及其具体实现A_Impl
。 A_Impl
注释为A_Impl
,由Spring自动扫描( 和
都在上下文中声明)。
A
和A_Impl
部署在单独的JAR中(不确定是否重要)。 一切正常。
现在,我正在审查代码, @Repository
在语义上看起来不太合适(这个类与持久性无关)所以 – 在我的无限智慧中 – 我决定将其更改为更通用的@Component
。 不用说,一切都爆炸了,让我看起来像一个完全白痴。 错误(在Spring上下文初始化期间发生)是Spring的ClassPathResource.getInputStream()
方法抱怨A
类不存在(它是,我手动检查;加上常规类加载器发现它很好)
没有其他改变 。 如果我将@Component
交换为@Repository
上下文初始化,如果我将它们交换回来,则不会出现上述错误。 Spring文档声称 @Component
和@Repository
之间没有区别 ,这显然是一个该死的谎言:-)所以我想知道 – 有什么区别?
我一直在使用@Component
没有麻烦。
我想到的唯一一件事(尽管不是那么聪明的人)可能是你的@Component
可能不是spring的。 例如,Tapestry有一个以相同方式命名的注释。 其他框架也可能有它。 所以检查你的import。
|Annotation | Meaning | +------------+-----------------------------------------------------+ | @Component | generic stereotype for any Spring-managed component | | @Repository| stereotype for persistence layer | | @Service | stereotype for service layer | | @Controller| stereotype for presentation layer (spring-mvc) |
从数据库连接的角度来看,使用@Service
和@Repository
注释很重要。
- 将
@Service
用于所有Web服务类型的数据库连接 - 将
@Repository
用于所有存储的proc数据库连接
如果您不使用正确的注释,则可能会遇到由回滚事务覆盖的提交exception。 您将在压力负载测试期间看到与回滚JDBC事务相关的exception。
- Java Spring:如何使用`@ Value`注释注入`Environment`属性?
- Guice @Provides方法与提供者类
- OpenEJB本地客户端注入失败
- ClassCastException:org.springframework.orm.jpa.EntityManagerHolder无法强制转换为org.springframework.orm.hibernate5.SessionHolder
- 使用guice作为注入类的框架,正确的初始化方法?
- Spring IoC – dependency injection – > NullPointerException
- 如何通过CDI实现命令模式?
- 使用基于注释的配置创建延迟初始化的Spring bean
- 为什么Mockito @InjectMocks可能是一个避免的事情?