@ Component,@ Repository&和@Component之间的区别是什么? Spring中的@Service注释?

时间:2011-07-26 09:10:47

标签: java spring spring-mvc annotations

可以在Spring中互换使用@Component@Repository@Service注释,还是除了充当注释设备之外还提供任何特定功能?

换句话说,如果我有一个Service类并且我将注释从@Service更改为@Component,它仍会以相同的方式运行吗?

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

29 个答案:

答案 0 :(得分:1353)

来自Spring Documentation

  

在Spring 2.0及更高版本中,@Repository注释是标记   任何履行角色或刻板印象的类(也称为数据   存储库的Access Object或DAO)。这个标记的用途之一   是例外的自动翻译。

     

Spring 2.5引入了更多刻板印象注释:@Component,   @Service@Controller@Component是任何人的通用刻板印象   Spring管理的组件。 @Repository@Service@Controller是。@Component   @Component的特殊化用于更具体的用例   例如,在持久性,服务和表示层中,   分别

     

因此,您可以使用@Repository注释组件类,   但是使用@Service@Controller@Component对其进行注释   相反,您的类更适合按工具处理   或与方面联系。例如,这些刻板印象注释   为切入点制作理想的目标。

     

因此,如果您选择使用@Service@Service   您的服务层@Repository显然是更好的选择。同样的,   如上所述,┌────────────┬─────────────────────────────────────────────────────┐ │ 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) │ └────────────┴─────────────────────────────────────────────────────┘ 已被支持作为标记   持久层中的自动异常转换。

{{1}}

答案 1 :(得分:636)

由于许多答案已经说明了这些注释的用途,我们将在这里集中讨论它们之间的一些细微差别。

  

首先相似性

     

值得再次突出的第一点是关于扫描自动检测和BeanDefinition的依赖注入所有这些注释(即@Component,@ Service,   @ Repository,@ Controller)是一样的。 我们可以使用一个   另一个,仍然可以解决问题。

@ Component,@ Repository,@ Controller和@Service

之间的差异
  

<强> @Component

这是一个通用的构造型注释,表明该类是一个弹簧组件。

@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注释进行注释,这意味着它们也是@Component s。如果我们定义自己的自定义注释并使用@Component对其进行注释,那么它也会使用<context:component-scan>进行扫描

  

<强> @Repository

这表示该类定义了一个数据存储库。

@Repository有什么特别之处?

除了指出,这是一个基于注释的配置@Repository的工作是捕获平台特定的异常并将它们重新抛出作为Spring统一的未经检查的异常之一。为此,我们提供了PersistenceExceptionTranslationPostProcessor,我们需要在Spring的应用程序上下文中添加如下:

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

这个bean后处理器为任何带有@Repository注释的bean添加一个顾问程序,以便捕获任何特定于平台的异常,然后将其作为Spring未经检查的数据访问异常之一重新抛出。

  

<强> @Controller

@Controller注释表示特定类充当控制器的角色。 @Controller注释充当带注释的类的构造型,指示其角色。

@Controller有什么特别之处?

我们无法将此注释与@Service@Repository等任何其他注释切换,即使它们看起来相同。 调度程序扫描带有@Controller注释的类,并检测其中带有@RequestMapping注释的注释方法。我们只能在@RequestMapping上使用@Controller,其类别使用@Component进行注释,并且 NOT 可以使用@Service@Repository,{ {1}}等...

注意:如果某个类已通过任何替代方法注册为bean,例如通过@Bean@Component@Service等...注释,如果该类也使用@RequestMapping注释进行注释,则可以选择@RequestMapping。但这是一种不同的情况。

  

<强> @服务

@Service bean保存业务逻辑并调用存储库层中的方法。

@Service有什么特别之处?

除了它用于表示它持有业务逻辑的事实之外,这个注释中没有其他任何值得注意的东西;但是谁知道,Spring可能会在未来增加一些特殊功能。

  

还有什么?

与上述类似,将来Spring可能会根据其分层约定为@Service@Controller@Repository添加特殊功能。因此,尊重惯例并将其与图层一致使用总是一个好主意。

答案 2 :(得分:412)

它们几乎相同 - 所有这些都意味着该类是一个Spring bean。 @Service@Repository@Controller是专门的@Component。您可以选择使用它们执行特定操作。例如:

    spring-mvc 使用
  • @Controller个bean
  • @Repository bean有资格进行持久性异常翻译

另一件事是你在语义上将组件指定给不同的层。

@Component提供的一件事是,您可以使用它注释其他注释,然后使用与@Service相同的方式。

例如最近我做了:

@Component
@Scope("prototype")
public @interface ScheduledJob {..}

因此,所有使用@ScheduledJob注释的类都是spring bean,除此之外还注册为quartz作业。您只需提供处理特定注释的代码。

答案 3 :(得分:348)

@Component相当于

<bean>

@ Service,@ Controller,@ Repository = {@Component +更多特殊功能}

这意味着服务,控制器和存储库在功能上是相同的。

这三个注释用于在您的应用中分离“图层”

  • 控制器只需执行调度,转发,呼叫服务方法等操作。
  • 服务保留业务逻辑,计算等。
  • 存储库是DAO(数据访问对象),它们直接访问数据库。

现在你可能会问为什么将它们分开:(我假设你知道AOP-Aspect Oriented Programming)

假设您只想监视DAO层的活动。您将编写一个Aspect(A类)类,在调用DAO的每个方法之前和之后执行一些日志记录,您可以使用AOP执行此操作,因为您有三个不同的层并且不会混合。

因此,您可以在DAO方法“周围”,“之前”或“之后”记录DAO。你可以这样做,因为你首先有一个DAO。您刚刚实现的是关注点或任务的分离。

想象一下,如果只有一个注释@Controller,那么这个组件将具有调度,业务逻辑和访问数据库的所有混合,所以脏代码!

上面提到的是一个非常常见的场景,为什么要使用三个注释还有更多用例。

答案 4 :(得分:208)

在Spring @Component中,@Service@Controller@Repository是用于以下内容的刻板印象注释:

@Controller:您的请求 从演示文稿页面完成映射,即表示层不会转到任何其他文件,直接转到@Controller类和检查@RequestMapping注释中请求的路径,如果需要,在方法调用之前写入。

@Service:所有业务逻辑都在这里,即与数据相关的计算和所有。这个业务层注释,我们的用户不直接调用持久性方法,因此它将使用此注释调用此方法。 它将根据用户请求

请求@Repository

@Repository:这是应用程序的持久层(数据访问层),用于从数据库中获取数据。即所有与数据库相关的操作都由存储库完成。

@Component - 使用组件构造型注释您的其他组件(例如REST资源类)。

  

表示带注释的类是“component”。这样的课程是   被认为是使用时自动检测的候选者   基于注释的配置和类路径扫描。

     

其他类级注释可以被视为标识a   组件,通常是一种特殊的组件:例如,该   @Repository注释或AspectJ的@Aspect注释。

enter image description here

答案 5 :(得分:66)

  

Spring 2.5引入了更多的构造型注释:@ Component,@ Service和@Controller。 @Component作为任何Spring管理组件的通用构造型;而@Repository,@ Service和@Controller用作更具体用例的@Component的特化(例如,分别在持久性,服务和表示层中)。这意味着您可以使用@Component注释组件类,但是通过使用@ Repository,@ Service或@Controller注释它们,您的类更适合通过工具处理或与方面相关联。例如,这些刻板印象注释成为切入点的理想目标。当然,在Spring Framework的未来版本中,@ Repository,@ Service和@Controller也可能带有额外的语义。因此,如果您在为服务层使用@Component或@Service之间做出决定,那么@Service显然是更好的选择。同样,如上所述,已经支持@Repository作为持久层中自动异常转换的标记。

@Component – Indicates a auto scan component.
@Repository – Indicates DAO component in the persistence layer.
@Service – Indicates a Service component in the business layer.
@Controller – Indicates a controller component in the presentation layer.

参考: - Spring Documentation - Classpath scanning, managed components and writing configurations using Java

答案 6 :(得分:43)

从数据库连接的角度来看,@Service@Repository注释的使用非常重要。

  1. 对所有Web服务类型的数据库连接使用@Service
  2. 对所有存储的proc数据库连接使用@Repository
  3. 如果您不使用正确的注释,则可能会遇到由回滚事务覆盖的提交异常。您将在压力负载测试期间看到与回滚JDBC事务相关的异常。

答案 7 :(得分:26)

技术上@Controller,@ Service,@ Repository都是一样的。所有这些都扩展了@Components。

来自Spring源代码:

表示带注释的类是&#34;组件&#34;。在使用基于注释的配置和类路径扫描时,此类被视为自动检测的候选者。

我们可以直接对每个bean使用@Component,但为了更好地理解和维护大型应用程序,我们使用@ Controller,@ Service,@ Repository。

每个注释的目的:

1)@Controller - &gt;用此注释的类旨在从客户端接收请求。第一个请求来到Dispatcher Servlet,它使用@RequestMapping注释的值将请求传递给特定控制器。

2)@Service - &gt;用此注释的类旨在操作我们从客户端接收的数据或从数据库中获取的数据。所有对数据的操作都应该在这一层完成。

3)@Repository - &gt;用此注释的类旨在与数据库连接。它也可以被视为DAO(数据访问对象)层。此层应仅限于CRUD(创建,检索,更新,删除)操作。 如果需要任何操作,则应将数据发送回@Service层。

如果我们交换位置(使用@Repository代替@Controller),我们的应用程序将正常工作。

使用三种不同的@annotations的主要目的是为企业应用程序提供更好的模块化。

答案 8 :(得分:26)

@Repository @Service @Controller 作为@Component的特化,在此基础上更具体地使用,您可以替换@Service到@Component,但在这种情况下你放松了专业化。

1. **@Repository**   - Automatic exception translation in your persistence layer.
2. **@Service**      - It indicates that the annotated class is providing a business service to other layers within the application.

答案 9 :(得分:25)

所有这些注释都是立体类型注释的类型,这三个注释之间的区别是

  
      
  • 如果我们添加@Component然后它告诉class的角色是一个组件类,它意味着它是一个包含一些逻辑的类,但它   不会告诉某个类是否包含特定的业务或   持久性或控制器逻辑,所以我们不直接使用它   @Component注释
  •   
  • 如果我们添加@Service注释,那么它会告诉包含业务逻辑的类的角色
  •   
  • 如果我们在类之上添加@Repository,那么它会告诉一个包含持久性逻辑的类
  •   
  • 此处@Component是@ Service,@ Repository和@Controller注释的基本注释
  •   

例如

package com.spring.anno;
@Service
public class TestBean
{
    public void m1()
    {
       //business code
    }
}

package com.spring.anno;
@Repository
public class TestBean
{
    public void update()
    {
       //persistence code
    }
}
  • 每当我们添加@Service@Repositroy@Controller注释时,默认@Component注释将存在于该类的顶部

答案 10 :(得分:20)

Spring提供了四种不同类型的自动组件扫描注释,它们是float dx12 = 1.2*dx; float dy12 = 1.2*dy; // filter steps float k0 = 0.375; float k1 = 0.3125; // filter constants vec4 filter(vec4 a, vec4 b, vec4 c) { return k1*a + k0*b + k1*c; } [...] vec2 a1 = vec2(x+dx12, y+dy12); vec2 a2 = vec2(x, y+dy12); vec2 a3 = vec2(x-dx12, y+dy12); vec4 a = filter(sample(t,a1), sample(t,a2), sample(t,a3)); vec2 b1 = vec2(x+dx12, y ); vec2 b2 = vec2(x, y ); vec2 b3 = vec2(x-dx12, y ); vec4 b = filter(sample(t,b1), sample(t,b2), sample(t,b3)); vec2 c1 = vec2(x+dx12, y-dy12); vec2 c2 = vec2(x, y-dy12); vec2 c3 = vec2(x-dx12, y-dy12); vec4 c = filter(sample(t,c1), sample(t,c2), sample(t,c3)); result = filter(a,b,c); @Component@Service@Repository。从技术上讲,它们之间没有区别,但每个自动组件扫描注释应该用于特定目的并在定义的层中。

@Controller:它是一个基本的自动组件扫描注释,它表示带注释的类是一个自动扫描组件。

@Component:带注释的类表示它是一个控制器组件,主要用于表示层。

@Controller:它表示带注释的类是业务层中的服务组件。

@Service:你需要在持久层中使用这个注释,这就像数据库存储库一样。

在注释他们的类时,应该选择更专业的@Repository形式,因为这个注释可能包含未来的特定行为。

答案 11 :(得分:18)

我们可以根据java标准来回答这个问题

引用现在由spring支持的JSR-330,您只能使用@Named来定义bean(以某种方式@Named=@Component)。因此,根据此标准,似乎没有用于定义类别bean的构造型(如@Repository@Service@Controller)。

但是弹簧用户可以根据具体用途使用不同的注释,例如:

  1. 帮助开发人员为主管人员定义更好的类别。在某些情况下,这种分类可能会有所帮助。 (例如,当您使用aspect-oriented时,这些可能是pointcuts
  2. 的良好候选者
  3. @Repository注释将为您的bean添加一些功能(对Bean持久层的一些自动异常转换)。
  4. 如果您使用的是Spring MVC,@RequestMapping只能添加到@Controller注释的类中。

答案 12 :(得分:18)

使用@Component注释其他组件,例如REST资源类。

@Component
public class AdressComp{
    .......
    ...//some code here    
}

@Component是任何Spring托管组件的通用构造型。

@Controller,@ Service和@Repository是特定用例的@Component特化。

Spring中的@Component

"Component Specialization"

答案 13 :(得分:15)

在Spring 4中,最新版本:

  

@Repository注释是任何满足该类的类的标记   存储库的角色或构造型(也称为数据访问对象)   或DAO)。这个标记的用途之一是自动翻译   第20.2.2节“异常翻译”中描述的例外情况。

     

Spring提供了进一步的构造型注释:@Component,@ Service,   和@Controller。 @Component是任何的通用构造型   Spring管理的组件。 @ Repository,@ Service和@Controller都是   对于更具体的用例,@ Component的特化   例如,在持久性,服务和表示层中,   分别。因此,您可以使用注释组件类   @Component,但是用@ Repository,@ Service或者注释它们   相反,@ Controller更适合你的类   通过工具处理或与方面相关联。例如,这些   构造型注释成为切入点的理想目标。也是   @Repository,@ Service和@Controller可能会携带   Spring框架的未来版本中的其他语义。从而,   如果您选择使用@Component或@Service作为您的   服务层,@ Service显然是更好的选择。同样,如   如上所述,已经支持@Repository作为标记   持久层中的自动异常转换。

答案 14 :(得分:14)

即使我们交换@Component或@Repository或@service

它的行为相同,但有一个方面是,如果我们使用component或@ service,它们将无法捕获与DAO相关的特定异常而不是Repository

答案 15 :(得分:12)

@ Component,@ Service,@ Controller,@ Repository之间没有区别。 @Component是表示MVC组件的Generic注释。但是作为我们的MVC应用程序的一部分,将有几个组件,如服务层组件,持久层组件和表示层组件。所以为了区分它们Spring人们也给了其他三个注释。

表示持久层组件:@Repository

表示服务层组件:@Service

表示表示层组件:@Controller

或者你可以将@Component用于所有这些。

答案 16 :(得分:11)

@Component是顶级通用注释,它使得带注释的bean在DI容器中被扫描并可用

@Repository是专门的注释,它带来了从DAO类转换所有未经检查的异常的功能

@Service是专门的注释。它现在没有带来任何新功能,但它澄清了bean的意图

@Controller是专门的注释,它使bean能够识别MVC并允许使用像@RequestMapping这样的所有其他注释

以下是更多details

答案 17 :(得分:10)

引用spring文档的@Service

  

表示带注释的类是“服务”,最初定义   通过领域驱动设计(Evans,2003)作为“作为一个提供的操作   在模型中独立的接口,没有封装状态。“   也可能表明一个班级是“商业服务门面”(在   核心J2EE模式感觉)或类似的东西。这个注释是一个   通用刻板印象和个别团队可能会缩小他们的范围   语义和适当的使用。

如果你看看eric evans的域驱动设计,

  

服务是一种独立于界面的操作   模型,没有封装状态,作为ENTITIES和VALUE OBJECTS   做。服务是技术框架中的常见模式,但它们   也可以在域层中应用。名称服务强调   与其他对象的关系。它与ENTITIES和VALUE OBJECTS不同   纯粹根据它可以为客户做什么来定义。服务   倾向于以活动命名,而不是实体 - 动词   而不是名词。服务仍然可以有一个抽象的,有意的   定义;它只是有一种不同于a的定义的味道   宾语。服务部门仍然应该有明确的责任   责任和履行它的界面应定义为   域模型的一部分。操作名称应来自   UBIQUITOUS LANGUAGE或介绍它。参数和结果   应该是域对象。服务应该谨慎使用而不是   允许剥夺他们所有行为的ENTITIES和VALUE OBJECTS。   但是当一个操作实际上是一个重要的领域概念时,a   SERVICE是MODEL-DRIVEN DESIGN的自然组成部分。宣告中   模型作为服务,而不是作为一个没有的虚假对象   实际上代表任何东西,独立操作不会误导   任何人。

根据Eric Evans,

Repository

  

REPOSITORY将某种类型的所有对象表示为概念   设置(通常模拟)。它的作用就像一个集合,除了更多   精心设计的查询功能。适当类型的对象是   添加和删​​除,以及REPOSITORY插入后面的机器   他们或从数据库中删除它们。这个定义收集了一个   提供访问根源的一套有凝聚力的责任   从早期生命周期到结束聚集。

答案 18 :(得分:9)

@Component :你注释了一个@Component类,它告诉hibernate它是一个Bean。

@Repository :您注释了一个类@Repository,它告诉hibernate它是一个DAO类并将其视为DAO类。意味着它使未经检查的异常(从DAO方法抛出)有资格转换为Spring DataAccessException。

@Service :这告诉hibernate它是一个Service类,你将拥有@Transactional等服务层注释,因此hibernate将其视为服务组件。

Plus @Service是@Component的进步。假设bean类名称是CustomerService,因为您没有选择XML bean配置方式,因此您使用@Component注释bean以将其指示为Bean。因此,在获取bean对象CustomerService cust = (CustomerService)context.getBean("customerService");时,默认情况下,Spring会将组件的第一个字符 - 从“CustomerService”更改为“customerService”。您可以使用名称“customerService”检索此组件。 但是如果对bean类使用@Service注释,则可以通过

提供特定的bean名称
@Service("AAA")
public class CustomerService{

你可以通过

获取bean对象
CustomerService cust = (CustomerService)context.getBean("AAA");

答案 19 :(得分:8)

存储库 Service Component 批注的子级。因此,它们都是 Component 存储库服务进行扩展。 到底如何 Service 仅在意识形态上有所不同:我们将其用于服务。 存储库具有特定的异常处理程序。

答案 20 :(得分:6)

这里给出的答案在很大程度上在技术上是正确的,但是即使响应列表很长而且位于底部,我认为也值得在这里放入一个实际上正确的响应,以防万一有人偶然发现它并学到有价值的东西。并非其他答案都是错误的,只是它们是不正确的。而且,为阻止巨魔,是的,我知道从技术上讲这些注释实际上是同一件事,甚至在Spring 5之前都是可以互换的。现在,对于正确的答案:

这三个注释是完全不同的东西,并且不能互换。您可以说出来,因为它们只有三个而不是三个。它们并非旨在互换,只是出于优雅和方便的目的而实现。

现代编程是发明,艺术,技术和交流的不同比例。通信位通常非常重要,因为代码读取的频率通常比其写入的频率高。作为程序员,您不仅要解决技术问题,而且还试图将自己的意图传达给将来阅读代码的程序员。这些程序员可能不会共享您的母语,也不会共享您的社交环境,并且有可能在未来的50年内阅读您的代码(这并不像您想象的那样少)。如此遥远的未来很难有效沟通。因此,至关重要的是,我们要使用可用的最清晰,最有效,正确和可交流的语言。我们精心选择了自己的语言,以产生最大的影响,并尽可能清楚地了解我们的意图。

例如,至关重要的是在编写存储库时使用@Repository,而不是@Component。后者对于存储库的注解是非常差的选择,因为它并不表示我们正在查看存储库。我们可以假设存储库也是一个spring-bean,但不能假设组件是存储库。使用@Repository,我们的语言变得清晰明确。我们清楚地表明这是一个存储库。使用@Component,我们将它留给读者来决定他们正在阅读哪种类型的组件,他们将必须阅读整个类(可能还包括子类和接口的树)以推断含义。这样一来,很可能在不久的将来,该类可能会被读者误解为不是存储库,并且我们会对这个错误承担部分责任,因为我们深知这是一个存储库,但未能在我们的语言中明确并有效地传达我们的意图。

我不会去看其他示例,但是会尽可能清楚地声明:这些注释是完全不同的东西,应根据其意图适当使用。 @Repository用于存储库,没有其他正确的注释。 @Service用于服务,没有其他正确的注释。 @Component适用于既不是存储库也不不是服务的组件,并且在其中使用这两个组件也不正确。它可以编译,甚至可以运行并通过您的测试,但这是错误的,如果您要这样做,我会(专业地)认为您会少一些。

在整个春季都有这样的例子(通常是编程)。编写REST API时,请勿使用@Controller,因为@RestController可用。如果@RequestMapping是有效的替代方法,则不能使用@GetMapping。等等等等。您必须选择最具体,准确和正确的语言,以便与您的读者交流您的意图,否则,您会在系统中引入风险,并且风险是有代价的。 / p>

答案 21 :(得分:5)

@ Component,@ Repository,@ Controller和@Service批注之间的区别

  

@Component –通用,可以在整个应用程序中使用。
@Service   –在服务层级别注释类。
@Controller –注释   表示层级别的类,主要在Spring MVC中使用。
  @Repository –在持久层注释类,它将充当   数据库存储库。

@Controller = @Component(内部注释)+表示层要素
@Service = @Component(内部注释)+服务层功能
@Component =实际组件(Beans)
@Repository = @Component(内部注释)+数据层功能(用于处理域Bean)

答案 22 :(得分:4)

刻板印象的解释:

  • @Service - 使用@Service注释所有服务类。该层知道工作单元。您的所有业务逻辑都将位于服务类中。通常,服务层的方法包含在事务中。您可以从服务方法进行多个DAO调用,如果一个事务失败,则所有事务都应该回滚。
  • @Repository - 使用@Repository注释所有DAO类。所有数据库访问逻辑都应该在DAO类中。
  • @Component - 使用组件构造型注释您的其他组件(例如REST资源类)。
  • @Autowired - 让Spring使用@Autowired注释将其他bean自动连接到您的类中。

@Component是任何Spring管理组件的通用构造型。对于更具体的用例,@Repository@Service@Controller@Component的特化,例如,分别在持久性,服务和表示层中。

最初回答here

答案 23 :(得分:2)

@ Component,@存储库,@服务,@ Controller:

@Component是由Spring @ Repository,@ Service和@Controller管理的组件的通用构造型,是@Component专长,用于更特定的用途:

  • @持久性存储库
  • @服务和交易服务
  • @用于MVC控制器的控制器

为什么在@Component上使用@ Repository,@ Service,@ Controller? 我们可以用@Component标记我们的组件类,但是如果相反,我们将使用适合预期功能的替代方法。我们的类更适合每种情况下预期的功能。

使用“ @Repository”注释的类通过org.springframework.dao.DataAccessException具有更好的翻译和可读错误处理。实现访问数据(DataAccessObject或DAO)的组件的理想选择。

带有“ @Controller”的带注释的类在Spring Web MVC应用程序中扮演控制器的角色

带有“ @Service”的带注释的类在业务逻辑服务中起作用,例如DAO管理器的Facade模式(Facade)和事务处理

答案 24 :(得分:2)

spring框架中提供了一些特殊类型的注释,称为构造型注释。 这些是:-

@RestController- Declare at controller level.
@Controller – Declare at controller level.
@Component – Declare at Bean/entity level.
@Repository – Declare at DAO level.
@Service – Declare at BO level.

上面声明的注释是特殊的,因为当我们将<context:component-scan>添加到xxx-servlet.xml文件中时,spring将在上下文创建/加载阶段自动创建那些带有上述注释的类的对象。

答案 25 :(得分:1)

为了简化此说明,让我们按用例考虑技术性,这些注释用于注入,正如我所说的“ 用于注入”一样,这意味着,如果您知道如何使用依赖注入“ DI” ,您应该始终寻找这些注释,并通过使用这些立体声类型注释类,来通知< em> DI 容器扫描它们以准备在其他地方进行注射,这是实际的目标。

现在让我们移动到每个;首先 @Service ,如果您要为特定的业务案例构建一些逻辑,则需要在包含业务逻辑的地方将其分开,该服务属于普通类,或者您可以将其用作接口想要,它是这样写的

// For example
public interface DoerRepository implements JpaRepository<Long, XEntity> {}

注入它们的方式都是相同的, @Repository 是一个接口,适用于存储库模式Repository design pattern的实现,通常在处理某些数据存储时使用或数据库,您会发现它包含多个现成的实现供您处理数据库操作;可以是 CrudRepository JpaRepository 等。

Key

最后是 @Component ,这是Spring中已注册bean的通用形式,即Spring一直在寻找标记有@Component的bean,然后@Service和@Repository都是特殊的@Component的情况,但是组件的常见用例是当您制作纯粹是技术性的内容而不是涵盖直接业务用例时!例如格式化日期或处理特殊请求序列化机制等等。

答案 26 :(得分:0)

这里有足够好的答案来解释组件存储库服务注释之间的区别。我想分享@Controller & @RestController

之间的区别

@Controller RestController

@RestController

enter image description here

  • 此注释是@Controller的专用版本,其中添加了 @Controller@ResponseBody自动注释。因此我们不必在我们的映射方法中添加@ResponseBody。那意味着 @ResponseBody是默认活动状态。
  • 如果您使用@RestController,则无法返回视图(通过使用 Viewresolver(春季/春季启动)
  • @RestController还将响应转换为JSON/XML automatically,因为@ResponseBody使返回的对象成为可能在体内的对象e.g. JSON or XML

@Controller

enter image description here

  • @Controller用于将类标记为Spring MVC Controller。这个 注释只是@Component的专用版本, 允许基于类路径自动检测控制器类 扫描。
  • @Controller,您可以在Spring Web MVC中返回视图。

More Detailed View

答案 27 :(得分:0)

@Component 用作配置类中的@Bean批注,在spring上下文中注册bean。它也是@ Service,@ Repository和@Controller批注的父级。

@Service ,扩展了@Component注释,并且只有命名差异。

@Repository -扩展@Component注释并将所有数据库异常转换为 DataAccessException

@Controller -在MVC模式中充当控制器。调度程序将扫描此类带注释的类以查找映射的方法,并检测@RequestMapping注释。

答案 28 :(得分:-7)

@component
@controller
@Repository
@service
@RestController

这些都是StereoType注释。对于将我们的类作为ioc容器中的spring bean来说,这很有用