@Component、@Repository和@Service注释是否可以在Spring中互换使用,或者它们除了充当符号设备之外,是否提供任何特定功能?
换句话说,如果我有一个Service类,并且我将注释从@Service更改为@Component,它的行为是否仍然相同?
或者注释是否也会影响类的行为和功能?
@Component、@Repository和@Service注释是否可以在Spring中互换使用,或者它们除了充当符号设备之外,是否提供任何特定功能?
换句话说,如果我有一个Service类,并且我将注释从@Service更改为@Component,它的行为是否仍然相同?
或者注释是否也会影响类的行为和功能?
当前回答
用@Component注释其他组件,例如REST资源类。
@Component
public class AdressComp{
.......
...//some code here
}
@组件是任何Spring管理组件的通用原型。
@Controller、@Service和@Repository是@Component针对特定用例的专门化。
@弹簧中的部件
其他回答
Spring提供了四种不同类型的自动组件扫描注释,它们是@component、@Service、@Repository和@Controller。从技术上讲,它们之间没有区别,但每个自动组件扫描注释都应用于特定目的,并在定义的层中使用。
@组件:它是一个基本的自动组件扫描注释,它表示注释类是一个自动扫描组件。
@Controller:带注释的类表示它是一个控制器组件,主要用于表示层。
@服务:它表示带注释的类是业务层中的服务组件。
@存储库:您需要在持久性层中使用此注释,这就像数据库存储库一样。
在注释类时,应该选择一种更专业的@Component形式,因为该注释可能包含未来的特定行为。
@组件是顶级通用注释,它使带注释的bean能够被扫描并在DI容器中可用
@Repository是专门的注释,它具有转换DAO类中所有未检查的异常的功能
@服务是专门的注释。到目前为止,它没有带来任何新特性,但它阐明了bean的意图
@控制器是专门的注释,它使bean MVC意识到,并允许使用进一步的注释,如@RequestMapping等
以下是更多详细信息
@组件等效于
<bean>
@服务,@Controller,@Repository={@Component+一些更特殊的功能}
这意味着服务、控制器和存储库在功能上是相同的。
这三个注释用于分离应用程序中的“层”,
控制器只是做一些事情,比如调度、转发、调用服务方法等。服务保留业务逻辑、计算等。存储库是DAO(数据访问对象),它们直接访问数据库。
现在您可能会问为什么要将它们分开:(我假设您知道AOP面向方面编程)
假设您只想监视DAO层的活动。您将编写一个Aspect(A类)类,该类在调用DAO的每个方法之前和之后进行一些日志记录,您可以使用AOP来实现这一点,因为您有三个不同的层,并且没有混合。
因此,您可以在DAO方法的“周围”、“之前”或“之后”记录DAO。你可以这样做,因为你一开始就有一个DAO。您刚刚实现的是关注点或任务的分离。
想象一下,如果只有一个注解@Controller,那么这个组件的调度、业务逻辑和访问数据库都会混合在一起,代码太脏了!
上面提到的是一个非常常见的场景,还有很多使用三个注释的用例。
我们可以根据java标准回答这个问题
参考JSR-330,它现在被spring支持,您只能使用@Named来定义bean(不知何故,@Named=@Component)。因此,根据这个标准,似乎没有必要为类别bean定义原型(如@Repository、@Service、@Controller)。
但是spring用户在这些不同的注释中有不同的特定用途,例如:
帮助开发人员为胜任者定义更好的类别。这种分类在某些情况下可能会有所帮助。(例如,当您使用面向方面的时,这些可能是切入点的好候选)@存储库注释将为bean添加一些功能(为bean持久层添加一些自动异常转换)。如果您使用的是springMVC,则@RequestMapping只能添加到由@Controller注释的类中。
这里有足够好的答案来解释组件存储库服务注释之间的区别。我想分享@Controller和@RestController之间的区别
@控制器与RestController
@RestController(RestController):
此注释是@Controller的专用版本,它添加了@Controller和@ResponseBody自动注释。因此我们不必将@ResponseBody添加到映射方法中。这意味着@ResponseBody默认处于活动状态。如果使用@RestController,则无法返回视图(通过使用Spring/Spring Boot中的Viewresolver)@RestController还将响应自动转换为JSON/XML,因为@ResponseBody将返回的对象转换为可能在主体中的对象,例如JSON或XML
@控制器
@控制器用于将类标记为SpringMVC控制器。这注释只是@Component的一个专门版本允许基于类路径自动检测控制器类扫描。@控制器,您可以在SpringwebMVC中返回视图。
更详细的视图