如何区分spring中的@Component、@Reposi

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看<活动链接>

提问:如何区分spring中的@Component、@Repository、@Service注解?

@Component、@Repository和@Service注解在Spring中是否可以互换使用,或者它们除了充当注解外,是否还提供了任何特定的功能?

换句话说,如果我有一个服务类,并且我将注解从@Service更改为@Component,它的行为是否仍然相同?

或者注解是否也会影响类的行为和功能?

回答一

@Repository注解是任何满足存储角色或原型(也称为数据访问对象或DAO)的类的标记。该标记的用途之一是自动翻译异常。

Spring提供了进一步的构造型注解:@Component、@Service和@Controller。@Component是任何spring管理组件的通用原型。@Repository、@Service和@Controller是@Component的专门化,用于更具体的分类(分别在持久层、服务层和表示层中)。因此,你可以使用@Component来注解组件类,但是,通过使用@Repository、@Service或@Controller来注解它们,你的类将会被其它工具或Aop切面更好的处理。

例如,这些原型注解是切入点的理想目标。@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
public @interface Service {
    ….
}
复制代码
@Component
public @interface Repository {
    ….
}
复制代码
@Component
public @interface Controller {
    …
}
复制代码

因此,可以说@Controller、@Service和@Repository是@Component注解的特殊类型。<context:component-scan>选取它们并将它们的这些类注册为bean,就像它们都被@Component注解一样。

特殊类型注解也会被扫描,因为它们本身是用@Component注解的,这意味着它们也是@Components。如果我们定义自己的自定义注解,并使用@Component对其进行注解,那么它也将会被<context:component-scan>扫描到。

@Repository

这个注解定义该类为数据存储类

  • @Repository有什么特别之处?

除了指出这是一个基于注解的配置之外,@Repository的任务是捕获特定于平台的异常,并将它们作为Spring的未检查异常重新抛出。为此,提供了PersistenceExceptionTranslationPostProcessor,需要将其添加到Spring application context

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
复制代码

这个bean处理器向任何带有@Repository注解的bean添加一个advisor,以便捕获任何特定于平台的异常

@Controller

@Controller注解表示特定类充当控制器的角色。

  • @Controller有什么特别之处?

我们不能将此注解与@Service或@Repository等任何其它注解进行切换,即使它们看起来相同。调度器扫描用@Controller注解的类,并检测其中用@RequestMapping注解的方法。我们只能在那些用@Controller注解的类上的方法上用@RequestMapping注解,它不能与@Component、@Service、@Repository等一起使用

@Service

@Service主要编写业务逻辑。

  • @Service有什么特别之处?

它除了用来表示被注解的类是用来写业务逻辑外,在这个注解里没有什么其它特别的东西。但是也许Spring会在将来给它添加更多特性。

如上所说,Spring也许会根据@Service、@Controller和@Repository的分层约定添加特殊功能。因此,尊重约定并且分层使用它总是一个好主意。

文章翻译自Stack Overflow:stackoverflow.com/questions/6…