天天看點

講清楚 @Service @Component兩個注解

作者:java小悠
引言: 最近一直在寫Spring注解相關的文章,姑且這段時間就把這些項目開發過程當中的注解都好好複習一遍,希望對剛剛接觸開發的小夥伴有一些幫助,今天要講的是@Service、@Component兩個注解,一起來學習兩者的實際應用。在Java Spring架構中,有很多注解可以用來幫助我們自定義元件和服務。其中,@Service和@Component就是兩個非常常用的注解。那麼,這兩個注解有什麼差別呢?它們的使用場景和注意事項是什麼?接下來,我們将一起來探讨。
@Service和@Component的概述

  在Spring架構中,@Service和@Component都是用來标注元件的注解。它們都可以被用來定義一個類是一個元件,這個元件可以被其他元件所依賴。但是,它們有一些差別,如下所示:

@Service

  @Service注解用于辨別一個類作為服務層元件。服務層元件通常用于處理業務邏輯和資料通路。當我們希望在應用程式中使用某種服務時,使用@Service注解标記相關的類。該注解将類作為服務注冊到Spring的上下文中,并按需注入到其他元件中。

@Component

  @Component注解是Spring架構中最通用的注解之一,用于辨別一個類作為元件。在使用@Component注解時,不需要指定具體的角色或職責,它可以表示不同層次的元件。除非有更準确的注解可用,否則可以使用@Component注解來代替。

@Service和@Component的使用場景

  在Spring架構中,@Service和@Component注解的使用場景有所不同,如下所示:

@Service

  下面是一個使用@Service注解标注服務類的示例:

@Service複制代碼
public class CardServiceImpl implements CardService {

    @Autowired

    private CardDao cardDao;

    @Override

    public void addCard(Card card) {

        userDao.addCard(card);

    }

    @Override

    public Card getCardById(int id) {

        return cardDao.getCardById(id);

    }

}
           

  在上面的示例中,我們定義了一個CardServiceImpl類,它實作了CardService接口,并使用@Autowired注解将CardDao對象注入到了該類中。這樣,在調用CardServiceImpl類中的方法時,就可以自動地将CardDao對象注入到方法中,友善地進行資料操作。

  @Service注解的使用場景包括但不限于以下幾種情況:

  (1)作為業務邏輯層的元件:在複雜的應用程式中,通常需要将業務邏輯從控制器或其他元件中分離出來。使用@Service注解标記的類可以作為業務邏輯層元件,處理資料和業務操作。

  (2)作為遠端服務的代理:如果應用程式需要與其他遠端服務進行互動,可以使用@Service注解标記的類作為代理元件,通過網絡調用遠端服務。

  (3)作為資料通路層的元件:服務層元件經常需要通路資料庫或其他持久化存儲。使用@Service注解标記的類可以作為資料通路層元件,提供資料庫操作和資料查詢功能。

@Component

  @Component注解通常用于标注元件類。元件類可以是任何類型的類,包括服務類、控制器類、模型類等等。在Spring中,元件類并不會自動地被注冊到Spring容器中。需要使用@Autowired等注解手動将元件注入到其他元件中。下面是一個使用@Component注解标注元件類的示例:

@Component複制代碼
public class MyController {

    @Autowired

    private MyService myService;

    public void doSomething() {

        myService.doSomething();

    }

}
           

  在上面的示例中,我們定義了一個MyController類,它使用@Component注解标注了該類。在這個類中,我們使用@Autowired注解将MyService對象注入到了該類中。這樣,在調用MyController類中的方法時,就可以自動地将MyService對象注入到方法中,友善地進行資料操作。

  @Component注解的使用場景如下:

  (1)辨別一個普通的POJO類:當一個類不屬于特定角色或層次的元件時,可以使用@Component注解将其标記為普通元件。

  (2)聲明可重用的通用元件:如果一個類可以在應用程式的多個地方重用,可以使用@Component注解将其标記為一個可重用的通用元件。

  (3)擴充和定制Spring架構:使用@Component注解可以建立自定義的注解,用于擴充和定制Spring架構的行為。

@Service和@Component使用注意事項

  在使用@Service和@Component注解時,需要注意以下幾點:

  (1) @Service和@Component的作用域不同

  @Service注解的作用域是單例模式,即被标注的服務類隻會被執行個體化一次,并且在整個應用程式中隻有一個執行個體。而@Component注解的作用域可以是單例模式、原型模式或者 prototype模式,即被标注的元件類可以被執行個體化多次。

  (2) @Service和@Component的自動注冊方式不同

  @Service注解會将被标注的類自動注冊到Spring容器中,可以通過@Autowired等注解手動将元件注入到其他元件中。而@Component注解并不會自動地将被标注的類注冊到Spring容器中,需要使用@Autowired等注解手動将元件注入到其他元件中。

  (3) @Service和@Component的生命周期不同

  @Service注解的生命周期與Spring容器的生命周期相同,即在Spring容器啟動時被執行個體化,在Spring容器關閉時被銷毀。而@Component注解的生命周期與Spring容器的生命周期無關,即被标注的元件類可以在應用程式的任何地方被執行個體化和銷毀。

總結

  總結一下,@Service和@Component注解在Spring架構中使用廣泛,用于辨別類作為特定類型的元件。@Service注解通常用于辨別服務層元件,處理業務邏輯和資料通路,而@Component注解則是一個通用的注解,用于辨別各種類型的元件。在使用這兩個注解時,需要注意執行個體名稱的指定和作用域管理。這些注解的正确使用可以幫助我們建構清晰、可維護和可擴充的Spring應用程式。

原文連結:https://juejin.cn/post/7260499321984237629