Spring IOC官方文檔學習筆記(十)之類路徑掃描與組件管理

来源:https://www.cnblogs.com/shame11/archive/2023/02/13/17117066.html
-Advertisement-
Play Games

譯者:kefate 原文:https://github.com/google/guice/wiki/Overview 大家好,我是kefate。今天開始我將會把Google Guice的官方文檔陸續翻譯一遍,水平有限,若有翻譯不妥之處,還望各位不吝指出。OK,話不多說,下麵開始今天的正文~ Guic ...


1.@Component註解與其衍生註解

(1) 在Spring中,@Component註解用於說明某個類是一個bean,之後Spring在類路徑掃描過程中會將該bean添加至容器中;@Component註解還有很多衍生註解,如@Repository, @Service和@Controller,它們分別用於三層架構中的持久層,業務層和控制層,因此,對於一個業務層的普通Service類,一般情況下用@Component或@Service都是可行的,但更推薦用@Service註解,因為該註解不僅能清晰的指明被標註的類是一個業務類,此外,這些註解還是Spring AOP的理想切入目標,能方便的對某一層進行切入(例如:切入控制層,進行許可權校驗)

(2) Spring提供的許多註解都可以用作元註解,如Spring的@RestController註解,它就是將@Controller和@ResponseBody註解組合出來的一個新註解,使用該註解,在我們期望類中所有方法都返回json格式數據時,就不用在每一個方法上都標註@ResponseBody註解了,因此,Spring推薦我們根據業務需要,結合元註解來實現自定義註解

2.自動掃描並註冊bean

(1) 上文我們提到了@Component註解等,那麼,Spring該如何掃描到這些註解並將它們註入進容器中呢? 這就需要類路徑掃描註解@ComponentScan了,我們需要把它添加到有@Configuration註解標註的配置類上,在容器啟動後,Spring就會掃描指定包下的bean並將其註入進容器中,如下所示

//聲明3個類,這三個類均位於cn.example.spring.boke同一個包下,其中ExampleA和ExampleB被註解標註,表明它們是bean,需要被註入進容器中,ExampleC是一個普通的類
@Service
public class ExampleA { }

@Component
public class ExampleB { }

public class ExampleC { }

//使用@Configuration註解定義一個配置類,在該配置類上,使用@ComponentScan註解指定包掃描路徑為cn.example.spring.boke,這時,Spring就會掃描該包以及該包的子包下所有符合條件的bean,並將它們註入容器中,該註解等同於在之前提到過的<context:component-scan base-package="..."/>標簽
@Configuration
@ComponentScan("cn.example.spring.boke")
public class Config { }

//啟動容器,註意這裡使用的是AnnotationConfigApplicationContext容器,而非之前的ClassPathXmlApplicationContext容器,而我們也不再需要xml配置文件,實現了完全的基於註解的配置
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);
Arrays.stream(ctx.getBeanDefinitionNames()).forEach(System.out::println);

//列印結果如下,可以看到,容器掃描到了exampleA和exampleB以及我們的配置類config,而忽略了exampleC(其他的bean是Spring隱式自動添加的)
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
config
exampleA
exampleB

3.使用過濾器來自定義組件掃描規則

(1) 預設情況下,Spring僅檢測被@Component、@Repository、@Service、@Controller、@Configuration和以@Component等作為元註解的自定義註解(如:@RestController)標註的類,不過,我們可以通過自定義@ComponentScan註解中的過濾器屬性includeFilters和excludeFilters來修改這一預設行為,如下

//只修改上面例子中的配置類,此處假設我們只掃描被@Service註解標註的類,其自定義過濾規則如下
//includeFilters:要被註入的    excludeFilters:不要被註入的  @ComponentScan.Filter:指定過濾類型
@Configuration
@ComponentScan(basePackages = "cn.example.spring.boke",
                includeFilters = @ComponentScan.Filter(Component.class),
                excludeFilters = @ComponentScan.Filter(Service.class))
public class Config {
}

//輸出結果如下,可見我們的exampleA已被排除在外
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
config
exampleB
exampleC

過濾類型:

過濾類型 說明
annotation(預設,按照註解過濾) 如上面例子中的屬性excludeFilters = @ComponentScan.Filter(Service.class),就是排除掉所有被@Service註解標註的類
assignable( 按照類型過濾) 例如:excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = ExampleA.class),就是排除掉ExampleA這個類型的bean
aspectj(按照切麵表達式過濾) 例如:cn.example..*Service+,這是一個切入點表達式,會對所有符合這個切入點表達式的bean進行過濾
regex(按照正則表達式過濾) 同上,只不過滿足的是正則表達式
custom(自定義過濾器) 實現org.springframework.core.type.TypeFilter介面來自定義過濾器,實現自定義過濾規則

(2) 設置@ComponentScan註解中的useDefaultFilters屬性值為false,來禁用預設過濾器,即關閉Spring對於那些預設註解(如@Component等)的自動掃描檢測

4.定義組件的配置元數據

未完待續...


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • html基礎入門 1. 什麼是html Hypertext Markup Language 超文本標記語言 2. 基本結構 <!DOCTYPE html> <!-- 註釋:此為html5的聲明方式 --> <html> <head></head> <body></body> </html> 順序 聲 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 前言 您或許會疑惑,網上那麼多去重方法,這篇文章還有什麼意義? 彆著急,這篇文章只節選了簡單的,好玩的,古老的,有實際講解意義的去重方法,除了去重的實現以外,我還將和您分享這其中的其他細節和拓展。 您或許不理解,為什麼只有五種? 當然,我 ...
  • 摘要:本文帶大家學習一下關於CSS屬性的繼承。 本文分享自華為雲社區《關於CSS有哪些屬性可以繼承?》,作者:黛琳ghz。 前言 今天遇到一個很有意思的題目,通過題目可以順便學習一下關於CSS屬性的繼承。(答案是ACD) 關於CSS屬性繼承 字體系列屬性 font:組合字體font-family:規 ...
  • #1、安裝 highcharts npm install highcharts --save #2、頁面引用 // 引入 import Highcharts from 'highcharts/highcharts-gantt.src.js' // 引入拖拽 import factory from ' ...
  • 回顧第一篇文章中談到的組件庫的幾個方面,只剩下最後的、也是最重要的組件庫的打包構建、本地發佈、遠程發佈了。 1 組件庫構建 組件庫的入口是 packages/yyg-demo-ui,構建組件庫有兩個步驟: 添加 TypeScript 的配置文件: tsconfig.json 添加 vite.conf ...
  • 任務平臺是科技內各業務方開展互動玩法的中心化平臺,支撐科技內拉新、促活、交易等業務場景,包含基礎任務、基於任務的通用活動玩法和業務投放能力。提供了任務玩法的創建、投放、曝光、完成等全生命周期的精細化管理,打造了基於任務的裂變、時間軸等通用活動玩法的規則化運營,致力於提升在多場景、多玩法、多頻次的業務... ...
  • 電商網站Web自動化測試實戰( 編寫京東搜索腳本) 1,打開京東頁 京東首頁地址:https://www.jd.com/,故進入京東首頁如下: 2,打開瀏覽器開發者模式 定位元素前需先打開瀏覽器開發者模式,查看頁面源碼 例-打開chrome開發者模式: windows:快捷鍵F12 Mac ios ...
  • 《Terraform 101 從入門到實踐》這本小冊在南瓜慢說官方網站和GitHub兩個地方同步更新,書中的示例代碼也是放在GitHub上,方便大家參考查看。 簡介 Azure是微軟的公有雲,它提供了一些免費的資源,具體可以查看: https://azure.microsoft.com/en-us/ ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...