@Repository注释是满足存储库(也称为数据访问对象或 DAO)角色或原型的任何类的标记。此标记的用途之一是异常的自动翻译,如Exception Translation中所述。
Spring 提供了更多的原型注解:@Component、@Service和@Controller. @Component是任何 Spring 管理的组件的通用构造型。@Repository, @Service, 和@Controller是@Component针对更具体用例(分别在持久层、服务层和表示层)的特化。因此,您可以使用 注释组件类@Component,但是通过使用 、 注释它们@Repository,@Service或者@Controller 相反,您的类更适合工具处理或与方面关联。
例如,这些原型注释是切入点的理想目标。@Repository, @Service, 并且 @Controller还可以在 Spring 框架的未来版本中携带额外的语义。因此,如果您在使用 @Component或@Service用于您的服务层之间进行选择,@Service显然是更好的选择。同样,如前所述,@Repository已经支持作为持久层中自动异常转换的标记。
注解 | 意义 |
---|---|
@Component | 任何 Spring 管理的组件的通用构造型 |
@Repository | 持久层的原型 |
@Service | 服务层的构造型 |
@Controller | 表示层的构造型(spring-mvc) |
首先是相似度
值得再次强调的第一点是,对于 BeanDefinition 的扫描自动检测和依赖注入,所有这些注释(即,@Component、@Service、@Repository、@Controller)都是相同的。我们可以用一个代替另一个,并且仍然可以解决问题。
@Component
这是一个通用的原型注解,表明该类是一个spring组件。
@Component 的特别之处在于
context:component-scan只扫描@Component而不寻找@Controller,@Service和@Repository一般情况下。它们被扫描是因为它们本身带有注释@Component。
因此,说@Controller,@Service和@Repository是特殊类型的@Component注解并没有错。context:component-scan拾取它们并将它们的以下类注册为 bean,就像它们被注释一样@Component。
特殊类型的注解也会被扫描,因为它们本身是带有@Component注解的,也就是说它们也是@Components。如果我们定义自己的自定义注解并使用 进行注解@Component,它也会被扫描context:component-scan
@Repository
这是为了表明该类定义了一个数据存储库。
@Repository 有什么特别之处?
除了指出这是一个基于 Annotation 的 Configuration之外,它@Repository的工作是捕获特定于平台的异常并将它们作为 Spring 的统一未检查异常之一重新抛出。为此,我们提供了PersistenceExceptionTranslationPostProcessor,我们需要将其添加到 Spring 的应用程序上下文中,如下所示:
这个 bean 后处理器向任何带有注释的 bean 添加了一个顾问,@Repository以便捕获任何特定于平台的异常,然后作为 Spring 的未经检查的数据访问异常之一重新抛出。@Controller注释表明一个特定的类充当控制器的角色。@Controller注释充当被注释类的构造型,指示其角色。
@Controller 有什么特别之处?
我们不能用任何其他的类似@Serviceor来切换这个注解@Repository,即使它们看起来一样。调度程序扫描带有注释的类@Controller并检测其中带有@RequestMapping注释的方法。我们只能使用@RequestMappingon/in 那些类被注释的方法,@Controller并且它不能与@Component,@Service等一起使用@Repository…
注意:如果一个类已经通过任何替代方法注册为 bean,例如 through@Bean或 through@Component等@Service…注解,则@RequestMapping如果该类也使用注解进行注解,则可以选择该类@RequestMapping。但这是一个不同的场景。
@Service
bean 在存储库层中保存业务逻辑和调用方法。
@Service 有什么特别之处?
除了它用于指示它持有业务逻辑这一事实之外,此注释中没有其他值得注意的地方;但谁知道呢,Spring 将来可能会添加一些额外的异常。
还有什么?
与上面类似@Service,未来 Spring 可能会基于它们的分层约定添加特殊功能。因此,尊重约定并根据层使用它始终是一个好主意。@Controller@Repository
转自 https://stackoverflow.com/questions/6827752/whats-the-difference-between-component-repository-service-annotations-in