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.
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
}
}
@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.
24 回答
这些都是StereoType注释 . 如果我们把@controller放在课堂上 . 它不会成为基于我们可以用这个注释注释的不同层(组件)的控制器类,但编译器不会对此做任何事情只是为了开发人员的理解目的我们可以根据我们必须编写的注释组件进行选择
来自Spring Documentation:
使用@Component注释其他组件,例如REST资源类 .
@Component是任何Spring托管组件的通用构造型 .
@ Controller,@ Service和@Repository是特定用例的@Component的特化 .
@Component in Spring
@Repository @Service 和 @Controller 用作@Component的特化,以便在此基础上更具体地使用,您可以将@Service替换为@Component,但在这种情况下,您将失去专门化 .
它们几乎相同 - 所有这些都意味着该类是一个Spring bean .
@Service
,@Repository
和@Controller
是专门的@Component
. 您可以选择使用它们执行特定操作 . 例如:spring-mvc使用
@Controller
beans@Repository
beans有资格进行持久性异常转换另一件事是你在语义上将组件指定给不同的层 .
@Component
提供的一件事是你可以用它来注释其他注释,然后以与@Service
相同的方式使用它们 .例如最近我做了:
因此,所有使用
@ScheduledJob
注释的类都是spring bean,除此之外还注册为quartz作业 . 您只需提供处理特定注释的代码即可 .从数据库连接的角度来看,使用
@Service
和@Repository
注释很重要 .对所有Web服务类型的数据库连接使用
@Service
对所有存储的proc DB连接使用
@Repository
如果您不使用正确的注释,则可能会遇到由回滚事务覆盖的提交异常 . 您将在压力负载测试期间看到与回滚JDBC事务相关的异常 .
@Service
引用spring文档,如果你看看eric evans的域驱动设计,
和Eric Evans一样
Repository
,@ Component,@ Service,@ Controller,@ Repository之间没有区别 . @Component是表示MVC组件的Generic注释 . 但是,作为MVC应用程序的一部分,将有几个组件,如服务层组件,持久层组件和表示层组件 . 所以要区分它们Spring人们也给了其他三个注释 .
表示持久层组件:@Repository
表示服务层组件:@Service
表示表示层组件:@Controller
否则你可以将@Component用于所有这些 .
参考: - Spring Documentation - Classpath scanning, managed components and writing configurations using Java
即使我们交换@Component或@Repository或@service
它的行为相同,但有一个方面是,如果我们使用组件或@服务,它们将无法捕获与DAO相关的特定异常而不是Repository
Spring提供了四种不同类型的自动组件扫描注释,它们是
@Component
,@Service
,@Repository
和@Controller
. 从技术上讲,它们之间没有区别,但每个自动组件扫描注释应该用于特殊目的并在定义的层中 .@Component
:它是一个基本的自动组件扫描注释,它表示带注释的类是一个自动扫描组件 .@Controller
:带注释的类表示它是控制器组件,主要用于表示层 .@Service
:它表示带注释的类是业务层中的服务组件 .@Repository
:您需要在持久层中使用此批注,这就像数据库存储库一样 .在注释他们的类时,应该选择更专业的
@Component
形式,因为这个注释可能包含未来的特定行为 .Explanation of stereotypes :
@Service
- 使用@Service注释所有服务类 . 该层知道工作单元 . 您的所有业务逻辑都将在Service类中 . 通常,服务层的方法包含在事务中 . 您可以从服务方法进行多个DAO调用,如果一个事务失败,则所有事务都应该回滚 .@Repository
- 使用@Repository注释所有DAO类 . 您的所有数据库访问逻辑都应该在DAO类中 .@Component
- 使用组件构造型注释您的其他组件(例如REST资源类) .@Autowired
- 让Spring使用@Autowired注释将其他bean自动连接到您的类中 .@Component
是任何Spring管理组件的通用构造型 . 对于更具体的用例,@Repository
,@Service
和@Controller
是@Component
的特化,例如,分别在持久性,服务和表示层中 .原来回答here .
@Component :你注释了一个@Component类,它告诉hibernate它是一个Bean .
@Repository :你注释了一个类@Repository,它告诉hibernate它是一个DAO类并将其视为DAO类 . 意味着它使未经检查的异常(从DAO方法抛出)有资格转换为Spring DataAccessException .
@Service :这告诉hibernate它是一个Service类,你将拥有@Transactional等服务层注释,因此hibernate将其视为服务组件 .
加上@Service是@Component的进步 . 假设bean类名称是CustomerService,因为您没有选择XML bean配置方式,因此您使用@Component注释bean将其表示为Bean . 因此在获取bean对象时
CustomerService cust = (CustomerService)context.getBean("customerService");
默认情况下,Spring会将组件的第一个字符小写 - 从“CustomerService”到“customerService” . 您可以使用名称“customerService”检索此组件 . 但是如果对bean类使用@Service注释,则可以提供特定的bean名称并且您可以通过获取bean对象
在Spring
@Component
中,@Service
,@Controller
和@Repository
是Stereotype注释,用于:@Controller:
其中 request mapping from presentation page 完成,即表示层将不会转到任何其他文件,它直接转到@Controller
类,并检查@RequestMapping
注释中的请求路径,如果需要,在方法调用之前写入 .@Service
:所有业务逻辑都在这里,即与数据相关的计算和所有 . 这个业务层注释,我们的用户不直接调用持久性方法,因此它将使用此注释调用此方法 . It will request @Repository as per user request@Repository
:这是应用程序的持久层(数据访问层),用于从数据库中获取数据 . 即 all the Database related operations are done by the repository.@Component
- 使用组件构造型注释您的其他组件(例如REST资源类) .我们可以根据java标准来回答这个问题
引用现在由spring支持的
JSR-330
,您只能使用@Named
来定义bean(以某种方式@Named=@Component
) . 所以根据这个标准,似乎没有用于定义类别bean的构造型(如@Repository
,@Service
,@Controller
) .但是 spring 用户将这些不同的注释用于特定用途,例如:
帮助开发人员为主管人员定义更好的类别 . 在某些情况下,这种分类可能会有所帮助 . (例如,当您使用
aspect-oriented
时,这些可能是pointcuts
的良好候选者)@Repository
注释将为您的bean添加一些功能(一些自动异常转换到您的bean持久层) .如果您使用的是Spring MVC,则
@RequestMapping
只能添加到由@Controller
注释的类中 .@Component相当于
@Service, @Controller, @Repository = {@Component + some more special functionality}
这意味着服务,控制器和存储库在功能上是相同的 .
这三个注释用于在您的应用程序中分隔 "Layers" ,
控制器只是执行调度,转发,调用服务方法等操作 .
服务保持业务逻辑,计算等
存储库是DAO(数据访问对象),它们直接访问数据库 .
现在您可能会问为什么将它们分开:(我假设你知道AOP-Aspect Oriented Programming)
假设您只想监视DAO层的活动 . 您将编写一个Aspect(A类)类,在调用DAO的每个方法之前和之后执行一些日志记录,您可以使用AOP执行此操作,因为您有三个不同的层并且不会混合 .
因此,您可以记录DAO "around","before"或"after" DAO方法 . 你可以这样做,因为你首先有一个DAO . 你刚才取得的成就是 Separation of concerns or tasks.
想象一下,如果只有一个注释@Controller,那么这个组件将具有调度,业务逻辑和访问数据库的所有混合,所以脏代码!
上面提到的是一个非常常见的场景,为什么要使用三个注释有更多的用例 .
@Component
是顶级通用注释,它使得带注释的bean在DI容器中被扫描并可用@Repository
是专门的注释,它带来了转换所有未经检查的功能来自DAO类的例外@Service
是专门的注释 . 它现在没有带来任何新功能,但它澄清了bean的意图@Controller是专门的注释,它使bean知道MVC并允许使用像
@RequestMapping
这样的进一步注释这里有更多details
由于许多答案已经说明了这些注释的用途,我们将在这里集中讨论它们之间的一些细微差别 .
@ Component,@ Repository,@ Controller和@Service之间的差异
这是一个通用的构造型注释,表明该类是一个spring组件 .
What’s special about @Component
<context:component-scan>
仅扫描@Component
并且一般不查找@Controller
,@Service
和@Repository
. 扫描它们是因为它们本身用@Component
注释 .只需看看
@Controller
,@Service
和@Repository
注释定义:因此,说
@Controller
,@Service
和@Repository
是@Component
注释的特殊类型并没有错 .<context:component-scan>
选择它们并将它们的后续类注册为bean,就像它们用@Component
注释一样 .扫描它们是因为它们本身带有
@Component
注释注释 . 如果我们定义自己的自定义注释并使用@Component
注释它,那么它也将被<context:component-scan>
扫描这是为了表明该类定义了一个数据存储库 .
What’s special about @Repository?
除了指出这是一个基于注释的配置之外,
@Repository
的工作是捕获特定于平台的异常并将它们重新抛出为Spring的统一未经检查的异常之一 . 为此,我们提供了PersistenceExceptionTranslationPostProcessor
,我们需要在Spring的应用程序上下文中添加如下:这个bean后处理器为任何使用
@Repository
注释的bean添加一个顾问程序,以便捕获任何特定于平台的异常,然后将其作为Spring未经检查的数据访问异常之一重新抛出 .@Controller
注释表示特定类充当控制器的角色 .@Controller
注释充当带注释的类的构造型,指示其角色 .What’s special about @Controller?
我们无法将此注释与
@Service
或@Repository
等任何其他注释切换,即使它们看起来相同 . 调度程序扫描使用@Controller
注释的类,并检测其中的@RequestMapping
注释 . 我们只能在@Controller
注释类上使用@RequestMapping
.@Services
在存储库层中保存业务逻辑和调用方法 .What’s special about @Service?
除了它用于表明它持有业务逻辑这一事实之外,这个注释没有明显的特点,但是谁知道,spring可能在未来增加一些额外的特殊功能 .
与上面类似,将来Spring可能会根据它们的分层约定选择为
@Service
,@Controller
和@Repository
添加特殊功能 . 因此,尊重惯例并将其与层一致使用始终是一个好主意 .所有这些注释都是立体类型注释的类型,这三个注释之间的区别是
例如
@Service
或@Repositroy
或@Controller
注释时@Component
注释将存在于该类的顶部在spring框架中提供了一些特殊类型的注释,称为构造型注释 . 以下是: -
上面声明的注释是特殊的,因为当我们将
<context:component-scan>
添加到xxx-servlet.xml文件中时,spring将自动创建那些在上下文创建/加载阶段用上面的注释注释的类的对象 .从技术上讲,@ Controller,@ Service,@ Repository都是一样的 . 所有这些都扩展了@Components .
来自Spring的源代码:
表示带注释的类是“组件” . 当使用基于注释的配置和类路径扫描时,这些类被视为自动检测的候选者 .
我们可以直接对每个bean使用@Component,但为了更好地理解和维护大型应用程序,我们使用@ Controller,@ Service,@ Repository .
每个注释的目的:
1)@Controller - >用此注释的类,旨在接收来自客户端的请求 . 第一个请求来到Dispatcher Servlet,它使用@RequestMapping注释的值将请求传递给特定控制器 .
2)@Service - >用这个注释的类,用于操作我们从客户端接收或从数据库中获取的数据 . 所有数据操作都应该在这一层完成 .
3)@Repository - >用此注释的类,旨在与数据库连接 . 它也可以被视为DAO(数据访问对象)层 . 此层应仅限于CRUD(创建,检索,更新,删除)操作 . 如果需要任何操作,则应将数据发送回@Service层 .
如果我们交换它们的位置(使用@Repository代替@Controller),我们的应用程序将正常工作 .
使用三种不同的@annotations的主要目的是为企业应用程序提供更好的模块化 .
在Spring 4中,最新版本:
存储库和服务是组件注释的子级 . 所以,所有这些都是组件 . 存储库和服务只是扩展它 . 究竟怎么样?服务只有意识形态上的差异:我们将其用于服务 . 存储库有特殊的异常处理程序 .
@Component,@ Repository,@ Service,@ Controller:
@Component是由Spring @ Repository管理的组件的通用构造型,@ Service和@Controller是@Component特化,用于更具体的用途:
@Repository用于持久化
@服务和交易服务
@ Controller用于MVC控制器
为什么在@Component上使用@ Repository,@ Service,@ Controller?我们可以使用@Component标记我们的组件类,但是如果我们使用适合预期功能的替代方法 . 我们的类更适合于每种特定情况下的预期功能 .
使用“@Repository”注释的类使用org.springframework.dao.DataAccessException具有更好的转换和可读错误处理 . 非常适合实现访问数据的组件(DataAccessObject或DAO) .
带有“@Controller”的带注释的类在Spring Web MVC应用程序中扮演控制器角色
带有“@Service”的带注释的类在业务逻辑服务中起作用,例如DAO Manager(Facade)的Facade模式和事务处理