SpringBoot系列之注解@Component VS @Bean(四)


前言

通過前面幾節內容得知,我們一直遺漏了注解@Component,本節我們來討論下注解@Component以及它和注解@Bean的區別所在。

@Component VS @Bean

 在講解注解@Component之前,在Spring中有這樣一個包【org.springframework.stereotype package.】我們稱之為Stereotype annotations(構造型注解),首先我們需要知道構造型注解的概念是什么,我們直接從該單詞所代表的含義入手,詳見解釋【https://www.merriam-webster.com/dictionary/stereotype】:符合固定或一般模式的事物; 特別是:小組成員共同擁有的標准化的心理圖景,代表過分簡化的觀點,偏見或不加批判的判斷。大致意思就是個人主觀臆斷和團隊共同一致的觀點,在實際生活中我們絕大多數人都會基於某個人的行為特征進行判斷,顯然這不是好的行為習慣,但在Spring中應用了此判斷,相當於指定了這樣一個標准,在程序開發中專用名詞為【約定】,我們知道在Spring MVC中,控制器(Controller)在MVC模式中的作用是控制路由請求,服務(Service)是我們可以放置所有業務邏輯的地方,最后,我們知道倉儲(Repository)是我們實現各種持久性存儲的數據訪問層的地方,根據類在應用程序中的作用對其進行分類至關重要。所以這才有了在上述給出的構造型包中所存在的注解@Controller、@Service和@Repository。注解@Component位於控制器、服務、倉儲的頂級,它是任何Spring托管組件的通用構造型注解,這也就意味着,如果要在應用程序上下文中注冊類,我們可以使用@Component注解進行注冊,而其他構造型(Controller,Service,Repository)只是@Component類的特例,如果我們查看它們的源代碼,就會看到它們本身帶有@Component注解,如下圖所示。那么為什么我們不就用@Component注解所有內容呢?它可以幫助開發人員對特定類進行分類,我們可以查看帶有@Controller注解的類,並立即了解其用途。

如果我們使用注解@Component或其他構造型注解之一標記一個類,則將使用類路徑掃描自動檢測這些類,並為每個這些類創建一個新bean。 

package com.demo.springboot;

import org.springframework.stereotype.Controller;

@Controller
public class HomeController {

    public String home(){
        return "Hello, World!";
    }
}

在如上帶注解@Controller的類和Bean之間存在隱式的一對一映射(即每個類一個Bean),我們需要注意的是:構造型注解是類級別的注解。注解@Bean用於顯式聲明單個bean,而不是像我們使用@Controller那樣讓Spring自動執行檢測,它使Bean的聲明與類定義完全脫鈎,使我們可以完全按照自己的選擇創建和配置Bean, 使用注解@Bean時,我們不能將此注解放在類級別,如果我們嘗試這樣做,則會收到如下無效的類型錯誤。Spring官方將其定義為:指示方法產生一個由Spring容器管理的bean。通常情況下,@ Bean方法在@Configuration類中聲明,這點在之前內容已經討論過。

到此關於注解@Component已講解完畢,我們依然對注解@Component和@Bean下一個結論:@Component是一個通用注解,可以應用於應用程序的任何類,以使其成為Spring托管組件(簡單來說,是任何Spring托管組件的通用構造型)。當通過spring的注解@ComponentScan功能掃描類路徑時,它將識別用@Component注釋注釋的類(在給定的包內),並創建此類的Bean,並將其注冊到ApplicationContext中,注解@Component是一個類級別的注解,其目的是使該類成為Spring托管組件和用於類路徑掃描功能的可自動檢測到的bean。而注解@Bean用於在方法返回的Spring IOC容器中顯式聲明和注冊一個Bean(作為配置Bean),由於@Bean是方法級別的注解,所以不能與類和對象聲明一起使用,它在用@Configuration注解的類中使用,簡單來說,注解@Bean用於將方法返回的bean注冊為IOC Container中的spring配置bean,@Bean注解指示方法產生應由Spring容器管理的bean,要聲明一個bean,只需使用@Bean對方法進行注解, 當Spring檢測到該注解方法時,它將執行該方法並將返回值注冊為ApplicationContext中的Bean, 默認情況下,bean名稱與方法名稱相同。

總結

本節我們敘述了注解@Component是什么,同時對比了注解@Component和@Bean的區別所在,好了,本文我到此為止,感謝您的閱讀,我們下節見。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM