深入理解Spring中的核心注解:@Controller、@Component、@Service、@Repository、@Configuration及其擴展

在現代Java開發中,Spring框架以其強大的依賴注入(DI)和面向切面編程(AOP)功能深受開發者喜愛。Spring提供了一系列注解來簡化配置和管理Bean。本文將詳細探討Spring中的核心注解,包括@Controller@Component@Service@Repository@Configuration,以及一些擴展注解,幫助您深入理解它們的作用、用途、實例、適用場景及其背后的原理。

@Component:通用組件注解

作用@Component 是一個通用注解,用于將類標識為Spring管理的Bean。

用途:適用于任何需要被Spring容器管理的組件。

實例

@Component
public class MyComponent {// 業務邏輯
}

適用場景:當類不屬于特定層(例如服務層、數據訪問層)時,可以使用@Component

原理:Spring容器在啟動時會掃描帶有@Component注解的類,并將其實例化、配置并加入到應用上下文中。這一過程由ClassPathBeanDefinitionScanner類實現,掃描路徑由@ComponentScan注解或XML配置指定。

@Service:服務層組件注解

作用@Service 用于標識服務層組件,通常包含業務邏輯。

用途:表示這是一個服務類,有助于團隊協作和代碼維護。

實例

@Service
public class MyService {// 業務邏輯
}

適用場景:業務邏輯處理類使用@Service注解,以明確其在應用層中的角色。

原理@Service@Component的特殊化形式,Spring掃描時將其識別為服務層組件,便于管理和維護。

@Repository:數據訪問層組件注解

作用@Repository 用于標識數據訪問層組件,通常用于數據庫操作。

用途:提供數據訪問層的異常轉換機制。

實例

@Repository
public class MyRepository {// 數據庫操作
}

適用場景:與數據庫交互的類使用@Repository注解,以便Spring能夠識別并處理數據訪問層的異常。

原理@Repository@Component的特殊化形式,Spring在掃描到此注解時,會為該組件提供特定的數據訪問異常處理機制。

@Controller:控制器層組件注解

作用@Controller 用于標識Spring MVC的控制器。

用途:處理HTTP請求,返回視圖或數據。

實例

@Controller
public class MyController {@RequestMapping("/home")public String home() {return "home";}
}

適用場景:處理Web請求的類使用@Controller注解,以標識其為控制器組件。

原理@Controller@Component的特殊化形式,Spring MVC掃描此注解以識別控制器類,并通過HandlerMappingHandlerAdapter將請求映射到相應的方法。

@Configuration:配置類注解

作用@Configuration 用于定義配置類,包含Bean定義和配置。

用途:替代傳統的XML配置文件,提供更靈活的配置方式。

實例

@Configuration
public class MyConfiguration {@Beanpublic MyBean myBean() {return new MyBean();}
}

適用場景:定義Spring配置類時使用@Configuration注解,將配置和Bean定義集中在一個類中。

原理@Configuration注解的類在Spring容器啟動時會被處理,內部的@Bean注解的方法返回值會被注冊為Spring容器中的Bean。這一過程由ConfigurationClassPostProcessor類實現,處理配置類中的方法并將其作為Bean定義注冊到容器中。

其他擴展注解

@RestController:RESTful Web服務控制器注解

作用@RestController 組合了 @Controller@ResponseBody

用途:用于創建RESTful Web服務,方法返回值直接作為HTTP響應體。

實例

@RestController
public class MyRestController {@GetMapping("/api/data")public MyData getData() {return new MyData();}
}

適用場景:創建RESTful API的控制器使用@RestController注解,以簡化響應數據的返回。

原理@RestController繼承了@Controller的功能,并自動將方法返回值作為HTTP響應體返回,通過MappingJackson2HttpMessageConverter將對象轉換為JSON格式。

@Bean:Bean定義注解

作用@Bean 用于方法上,聲明一個Spring管理的Bean。

用途:在 @Configuration 類中定義Bean對象。

實例

@Configuration
public class AppConfig {@Beanpublic MyService myService() {return new MyService();}
}

適用場景:在配置類中定義Bean時使用@Bean注解。

原理@Bean注解的方法會被Spring容器調用,其返回值會被注冊為Spring中的Bean,方法名默認為Bean的ID。Spring通過BeanDefinition對象管理這些Bean。

@ComponentScan:自動掃描組件注解

作用@ComponentScan 用于自動掃描指定包下的Spring組件。

用途:配置類或XML中使用,掃描指定包及其子包下的組件。

實例

@Configuration
@ComponentScan("com.example")
public class AppConfig {// ...
}

適用場景:自動掃描和注冊組件時使用@ComponentScan注解。

原理@ComponentScan配置Spring容器掃描指定的包路徑,尋找帶有@Component@Service@Repository@Controller等注解的類,并自動注冊為Spring Bean。由ClassPathBeanDefinitionScanner類實現掃描和注冊。

@Conditional:條件注解

作用@Conditional 用于根據某些條件進行Bean的注冊。

用途:有條件地創建Bean。

實例

@Configuration
public class AppConfig {@Bean@Conditional(DatabaseTypeCondition.class)public DataSource dataSource() {// 返回適合數據庫類型的數據源}
}

適用場景:根據不同的條件創建特定的Bean,例如根據不同的數據庫類型選擇不同的數據源。

原理@Conditional注解的條件類需要實現Condition接口,定義條件邏輯。在Spring容器啟動時,會根據條件類的評估結果決定是否創建并注冊對應的Bean。

@Scope:Bean作用域注解

作用@Scope 用于定義Bean的作用域。

用途:指定Spring Bean的作用域,例如單例、原型等。

實例

@Component
@Scope("prototype")
public class MyPrototypeBean {// ...
}

適用場景:需要指定Bean作用域時使用@Scope注解。

原理@Scope注解定義Bean的生命周期范圍。常見的作用域有單例(singleton,默認)和原型(prototype)。Spring通過ScopeMetadataScopeMetadataResolver類處理Bean作用域,根據配置的作用域類型創建和管理Bean實例。

@Lazy:懶加載注解

作用@Lazy 用于標識Bean懶加載。

用途:在第一次需要時才創建Bean。

實例

@Service
@Lazy
public class MyService {// ...
}

適用場景:需要延遲初始化Bean時使用@Lazy注解。

原理@Lazy注解在Bean定義時不會立即創建實例,只有在第一次訪問該Bean時才進行實例化。Spring通過LazyInitializationExcludeFilterLazyInitializationPostProcessor類實現懶加載功能。

選擇合適的注解

選擇合適的注解取決于類的角色和功能:

  • 通用組件:使用@Component
  • 業務邏輯:使用@Service
  • 數據訪問:使用@Repository
  • Web控制器:使用@Controller@RestController(RESTful API)。
  • 配置類:使用@Configuration

總結

Spring框架提供的這些注解極大地簡化了Bean的管理和配置,使得代碼更加模塊化和易于維護。每個注解都有其特定的作用和原理,開發者可以根據應用需求選擇合適的注解來標識和管理組件。通過深入理解這些核心注解及其擴展,可以更好地利用Spring框架的功能,提升項目的可維護性和擴展性。希望本文能幫助您更加深入地掌握Spring框架中注解的應用和原理。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/36551.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36551.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/36551.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【智能算法應用】麻雀搜索算法在物流配送中心選址的應用(無待選配送中心)

目錄 1.算法原理2.數學模型3.結果展示4.參考文獻5.代碼獲取 1.算法原理 【智能算法】麻雀搜索算法(SSA)原理及實現 2.數學模型 模型假設 待定物流配送中心的庫存總能滿足需求點的需求不考慮從工廠到待定物流配送中心的運輸成本不考慮選定區域內待確定…

Vue 解決報錯 VM6290:1 Uncaught SyntaxError: Unexpected identifier ‘Promise‘

Vue 報錯 VM6290:1 Uncaught SyntaxError: Unexpected identifier ‘Promise’ 排查 控制臺報了一個錯誤 , Uncaught SyntaxError: Unexpected identifier ‘Promise’,網上查到的方法是 缺少符號,語法寫法錯誤,但這些都沒有解決我的問題&am…

RTDETR更換優化器——Lion

RTDETR更換Lion優化器 論文:https://arxiv.org/abs/2302.06675 代碼:https://github.com/google/automl/blob/master/lion/lion_pytorch.py 簡介: Lion優化器是一種基于梯度的優化算法,旨在提高梯度下降法在深度學習中的優化效果…

MyBatis~配置解析, 屬性(properties)、設置(settings)

注意, 對應的名稱一定要相同, 比如username就要對應username, 而且如果同時使用外部配置文件和property, 優先級是外部配置文件優先級更高 設置(settings) 這是 MyBatis 中極為重要的調整設置,它們會改變 MyBatis 的運行時行為。 下表描述了…

prompt:我是晚餐盲盒,只要你問出“今晚吃什么”我就將為你生成美妙的食物推薦。

使用方法:在ChatGP粘貼下面提示詞模型,點擊輸出。然后再問“晚餐有什么好吃的?”,AI輸出豐種食物供你選擇。抽到什么吃什么,極大的解決選擇困難的問題。 客戶需要生成1000條俏皮靈動,趣味盎然,比…

基于機器學習的網頁摘要生成算法的研究與實現

摘要:隨著互聯網的迅猛發展,網頁信息量呈爆炸式增長,用戶往往難以在海量信息中快速獲取所需內容。因此,開發一種能夠自動生成網頁摘要的算法,對于提高信息檢索效率具有重要意義。本文將對基于機器學習的網頁摘要生成算…

pytest測試框架pytest-order插件自定義用例執行順序

pytest提供了豐富的插件來擴展其功能,本章介紹插件pytest-order,用于自定義pytest測試用例的執行順序。pytest-order是插件pytest-ordering的一個分支,但是pytest-ordering已經不再維護了,建議大家直接使用pytest-order。 官方文…

華為云安全防護,九河云綜合分解優劣勢分析

隨著全球化的發展,越來越多的企業開始尋求在國際市場上擴展業務,這一趨勢被稱為企業出海。然而,企業在海外擴張面臨諸多隱患與安全挑戰,其中因為地域的不同,在安全性方面與國內相比會變得薄弱,從而導致被黑…

如何在瀏覽器中查看網頁的HTML源代碼?

如何在瀏覽器中查看網頁的HTML源代碼? 瀏覽html網頁,查看其源代碼,可以幫助我們了解該版網頁的信息以及架構,每個瀏覽器都是允許用戶查看他們訪問的任何網頁的HTML源代碼的。以下編程獅小師妹就介紹幾個常見瀏覽器的查看網頁 HTM…

mysql安裝創建數據庫防止踩坑

為了安裝MySQL的家人們走彎路,稍微有些啰嗦,講述我安裝的時遇到的問題,如何解決。仔細看看離成功不遠。 mysql下載鏈接 MySQL :: Download MySQL Community Server windows下安裝mysql-8.0.29-winx64,下載安裝包后解壓到文件夾中…

C語言 | Leetcode C語言題解之第191題位1的個數

題目: 題解: int hammingWeight(uint32_t n) {int ret 0;while (n) {n & n - 1;ret;}return ret; }

基于深度學習的文本檢索

基于深度學習的文本檢索 文本檢索(Text Retrieval)是指在大量文本數據中,根據用戶的查詢文本找到相關文檔。基于深度學習的方法通過提取文本的高層次語義特征,實現了高效和準確的文本檢索。 深度學習在文本檢索中的優勢 語義理…

Windows安裝jdk配置環境變量(基礎)

一、下載安裝JDK 下載地址:https://www.oracle.com/java/technologies/downloads/?er221886#java8-windows 因為JDK8比較穩定,所以建議選擇這個。電腦32位的下載jdk-8u411-windows-i586.exe;電腦是64位的下載jdk-8u411-windows-x64.exe 1、…

鏈動2+1模型:驅動用戶增長與業務提升的新引擎

大家好,我是吳軍,來自一家業界領先的科技創新公司。在今天,我想與大家分享一個在我們業務中取得顯著成果的運營策略——鏈動21模型,以及它是如何助力我們優化用戶滿意度,提高用戶粘性和促進復購率的。 盡管鏈動模式在業…

安裝Flask

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 大多數Python包都使用pip實用工具安裝,使用Virtualenv創建虛擬環境時會自動安裝pip。激活虛擬環境后,pip 所在的路徑會被添加…

計算機組成原理——系統總線

題目:計算機使用總線結構便于增減外設,同時__C____。 A.減少了信息傳送量 B.提高了信息傳輸速度 C.減少了信息傳輸線的條數 1. 總線的分類 1.1. 片內總線 芯片內部的總線 在CPU芯片內部,寄存器與寄存器之間、寄存器與邏輯單元ALU之間 1.1.1. 數據總線 雙向傳輸總線 數…

深入解析B樹:節點子節點數量的奧秘

在計算機科學中,B樹是一種自平衡的樹形數據結構,它能夠保持數據有序,并且允許進行高效的搜索、順序訪問、插入和刪除操作。B樹廣泛應用于數據庫和文件系統的索引結構中,因為它可以有效地減少磁盤I/O操作次數。本文將深入探討B樹的…

VUE----通過nvm管理node版本

使用 NVM(Node Version Manager)來管理和切換 Node.js 版本是一個很好的選擇。以下是在 蘋果電腦macos系統 上使用 NVM 安裝和切換 Node.js 版本的步驟: 1. 安裝 NVM 如果你還沒有安裝 NVM,可以按照以下步驟進行安裝: 打開終端,運行以下命令以下載并安裝 NVM: curl …

c語言中的for循環

在C語言中,for循環是控制結構之一,用于多次執行一段代碼。其具體用法如下: 語法 for (初始化表達式; 條件表達式; 更新表達式) {// 循環體 }參數說明 初始化表達式:在循環開始前執行一次,用于初始化循環控制變量。條…

BeautifulSoup解析HTML

需要解析HTML源碼里面的內容&#xff0c;包含特定標簽和屬性 <div class"file-source"><table><tr><th align"right">Line</th><th align"right">Branch</th><th align"right">Exec…