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

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

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


当前回答

存储库和服务是组件注释的子级。所以,它们都是组件。存储库和服务只是扩展它。具体如何?服务只有意识形态上的区别:我们把它用于服务。存储库具有特定的异常处理程序。

其他回答

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

现在让我们来看看每一个;first@Service,如果您正在为特定的业务案例构建一些逻辑,则需要在包含您的业务逻辑的地方将其分离,该服务是普通的Class,或者您可以根据需要将其用作接口,其编写方式如下

@Service
public class Doer {
   // Your logic 
}

要在另一个类中使用它,请假设在Controller中

@Controller
public class XController {
    // You have to inject it like this 
    @Autowired 
    private Doer doer;

    // Your logic
}

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

例如:

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

最后,@Component,这是Spring中注册bean的通用形式,也就是说,Spring总是在寻找标记有@Component的bean来注册,那么@Service和@Repository都是@Component的特例,然而,组件的常见用例是当您制作一些纯技术性的东西而不是直接的业务案例时!比如格式化日期或处理特殊的请求序列化机制等等。

Spring2.5引入了更多的原型注释:@Component、@Service和@Controller@组件充当任何Spring管理组件的通用原型;而@Repository、@Service和@Controller作为@Component的特殊化,用于更具体的用例(例如,分别在持久性、服务和表示层)。这意味着你可以用@component来注释你的组件类,但是通过用@Repository、@Service或@Controller来注释它们,你的类更适合由工具处理或与方面关联。例如,这些原型注释是切入点的理想目标。当然,@Repository、@Service和@Controller也有可能在未来的Spring Framework版本中携带额外的语义。因此,如果您在服务层使用@Component或@Service之间做出决定,@Service显然是更好的选择。类似地,如上所述,@Repository已经被支持作为持久层中自动异常转换的标记。@组件–表示自动扫描组件。@Repository–表示持久层中的DAO组件。@服务–表示业务层中的服务组件。@控制器–表示表示层中的控制器组件。

参考:-Spring Documentation-Classpath扫描、托管组件和使用Java编写配置

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

对所有web服务类型的DB连接使用@Service将@Repository用于所有存储过程数据库连接

如果没有使用正确的注释,则可能会遇到回滚事务覆盖的提交异常。您将在压力负载测试期间看到与回滚JDBC事务相关的异常。

存储库和服务是组件注释的子级。所以,它们都是组件。存储库和服务只是扩展它。具体如何?服务只有意识形态上的区别:我们把它用于服务。存储库具有特定的异常处理程序。

Spring提供了四种不同类型的自动组件扫描注释,它们是@component、@Service、@Repository和@Controller。从技术上讲,它们之间没有区别,但每个自动组件扫描注释都应用于特定目的,并在定义的层中使用。

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

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

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

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

在注释类时,应该选择一种更专业的@Component形式,因为该注释可能包含未来的特定行为。