最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot注解生效原理全解析

 更新時(shí)間:2025年09月11日 11:29:27   作者:許苑向上  
Spring Boot注解自動(dòng)生效依賴于Spring容器和處理機(jī)制,通過(guò)掃描、解析配置類生成BeanDefinition,再由容器實(shí)例化,實(shí)現(xiàn)@Autowired等注解的自動(dòng)注入與組件注冊(cè),本文給大家介紹SpringBoot注解生效原理分析,感興趣的朋友一起看看吧

Spring Boot 注解生效原理分析

Spring Boot 的注解**(如 @RestController、@Service、@Autowired、@Configuration 等)在開(kāi)發(fā)中使用非常廣泛,但它們為什么能“自動(dòng)生效”?**本文將深入解析其背后的原理。

Spring 注解的生效依賴于 Spring 容器(ApplicationContext) 和 注解處理器(BeanPostProcessor / ConfigurationClassPostProcessor 等)。

前置:Bean 的聲明與注冊(cè)

@Component、@Service、@Controller、@Repository 等注解,都是用于標(biāo)記一個(gè)類為 Spring 管理的 Bean。

生效機(jī)制

1、 @Configuration 、 @Component@ComponentScan 生效原因如下:
Spring 在啟動(dòng)時(shí),進(jìn)行上下文刷新refreshContex()然后觸發(fā)ConfigurationClassPostProcessor掃描所有 @Configuration 、 @Component等類注冊(cè)成BeanDefination, @ComponentScan 觸發(fā)包掃描,找到其他 @Component/@Service/@Controller將其也注冊(cè)成 BeanDefination。

2、自動(dòng)注入 @Autowired 實(shí)現(xiàn)機(jī)制:
@Autowired 的生效依賴:依賴注入(DI)機(jī)制 和 后置處理器(BeanPostProcessor)。
關(guān)鍵類:
AutowiredAnnotationBeanPostProcessor 處理 @Autowired 注解。
處理流程:

  1. AutowiredAnnotationBeanPostProcessor負(fù)責(zé)掃描所有 Bean 中的 @Autowired 注解,決定注入哪一個(gè) Bean。
  2. DependencyDescriptor描述依賴關(guān)系,包括類型、是否必需、泛型等。
  3. BeanFactory提供 Bean 實(shí)例,用于實(shí)際注入。

1. 啟動(dòng)入口

  • SpringApplication.run(App.class, args)
    → 創(chuàng)建 ApplicationContext(通常是 AnnotationConfigServletWebServerApplicationContext
    → 調(diào)用 refresh()(IOC 容器的核心刷新過(guò)程)。

2.refresh()關(guān)鍵步驟

AbstractApplicationContext#refresh() 中有一行核心邏輯:

invokeBeanFactoryPostProcessors(beanFactory);

這里會(huì)執(zhí)行所有 BeanFactoryPostProcessor,其中最重要的是:
?? ConfigurationClassPostProcessor

3.ConfigurationClassPostProcessor的作用

源碼示例圖:

它是專門(mén)為配置類服務(wù)的后處理器,主要任務(wù):

  1. 掃描所有 @Configuration 類。
  2. 通過(guò)postProcessBeanDefinitionRegistry()觸發(fā)配置類的掃描和解析
  3. 交給 ConfigurationClassParser 解析成配置模型。
  4. 交給 ConfigurationClassBeanDefinitionReader 轉(zhuǎn)換成 BeanDefinition 并注冊(cè)到容器。

4.ConfigurationClassParser的職責(zé)

當(dāng) ConfigurationClassPostProcessor 檢測(cè)到配置類時(shí),就會(huì)調(diào)用 ConfigurationClassParser 解析。

注意:它不是直接生成 BeanDefinition!
它的作用是:

  • 讀取配置類上的元注解信息(通過(guò) AnnotationMetadata)。

  • 根據(jù)不同注解做不同解析:

    • @Configuration → 標(biāo)記為配置類,繼續(xù)處理內(nèi)部的 @Bean 方法。
    • @Component → 標(biāo)記為普通組件,后續(xù)注冊(cè)。
    • @ComponentScan → 觸發(fā)包掃描,找到其他 @Component/@Service/@Controller。
    • @Import → 導(dǎo)入配置類或交給 ImportSelector / ImportBeanDefinitionRegistrar。
    • @ImportResource → 加載 XML 配置。
  • 遞歸解析,構(gòu)建出一棵配置類的內(nèi)部描述模型:ConfigurationClass。

?? 它相當(dāng)于 語(yǔ)法分析器,把配置類源信息轉(zhuǎn)成中間表示。

5.ConfigurationClassBeanDefinitionReader的職責(zé)

  • 接收 ConfigurationClassParser 解析出來(lái)的 ConfigurationClass 模型。

  • 生成并注冊(cè) BeanDefinition

    • @Bean 方法 → 生成工廠方法對(duì)應(yīng)的 BeanDefinition。
    • @Import 導(dǎo)入的類 → 注冊(cè)。
    • 包掃描結(jié)果的組件 → 注冊(cè)。
  • 將這些 BeanDefinition 放入 BeanDefinitionRegistry,等待容器實(shí)例化。

?? 它相當(dāng)于 代碼生成器,把中間表示落地成可用的 Bean 定義。

6. 整體鏈路總結(jié)

  1. SpringApplication.run() → 創(chuàng)建 ApplicationContext。
  2. refresh() → 執(zhí)行 invokeBeanFactoryPostProcessors()。
  3. ConfigurationClassPostProcessor 介入。
  4. ConfigurationClassParser 解析配置類 → 生成 ConfigurationClass 模型。
  5. ConfigurationClassBeanDefinitionReader 將模型轉(zhuǎn)化為 BeanDefinition。
  6. BeanDefinitionRegistry 注冊(cè)所有 生成的BeanDefinition。
  7. 容器實(shí)例化 → Bean 生效。

?? 核心記憶

  • ConfigurationClassParser:負(fù)責(zé)解析配置類 → 生成 ConfigurationClass 模型。
  • ConfigurationClassBeanDefinitionReader:負(fù)責(zé)將模型轉(zhuǎn)為 BeanDefinition 并注冊(cè)。
  • 最終 @Configuration/@Component/@Bean 等注解能生效,是因?yàn)檫@套機(jī)制在容器刷新時(shí)自動(dòng)執(zhí)行。

核心流程圖總結(jié)

refresh()
    ↓   // 容器核心刷新流程入口
invokeBeanFactoryPostProcessors()
    ↓   // 執(zhí)行 BeanFactoryPostProcessor,增強(qiáng) BeanFactory
ConfigurationClassPostProcessor
    ↓   // 識(shí)別并處理 @Configuration、@ComponentScan、@Import 等配置類
ConfigurationClassParser
    ↓   // 解析配置類注解,生成 ConfigurationClass 模型(中間表示)
ConfigurationClassBeanDefinitionReader
    ↓   // 將 ConfigurationClass 轉(zhuǎn)換為 BeanDefinition
BeanDefinitionRegistry(注冊(cè) BeanDefinition)
    ↓   // 將 BeanDefinition 注冊(cè)到 IOC 容器
IOC 容器實(shí)例化 Bean
    ↓   // 根據(jù) BeanDefinition 實(shí)例化對(duì)象,完成依賴注入并放入單例池

到此這篇關(guān)于SpringBoot注解生效原理全解析的文章就介紹到這了,更多相關(guān)SpringBoot注解生效原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

孟连| 太湖县| 攀枝花市| 津南区| 进贤县| 嘉善县| 龙游县| 炎陵县| 武隆县| 辉县市| 彭州市| 甘德县| 固安县| 大石桥市| 都昌县| 双辽市| 彰化市| 郁南县| 米林县| 丁青县| 龙游县| 喀什市| 福贡县| 襄城县| 开封县| 寿宁县| 壶关县| 囊谦县| 德惠市| 西昌市| 凤城市| 北海市| 罗山县| 碌曲县| 湖南省| 呼和浩特市| 太湖县| 河曲县| 剑川县| 辽阳市| 湘阴县|